OleDbPoint.cs
上传用户:sex100000
上传日期:2013-11-09
资源大小:1377k
文件大小:15k
源码类别:

GIS编程

开发平台:

C#

  1. // Copyright 2006 - Morten Nielsen (www.iter.dk)
  2. //
  3. // This file is part of SharpMap.
  4. // SharpMap is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. // 
  9. // SharpMap is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU Lesser General Public License for more details.
  13. // You should have received a copy of the GNU Lesser General Public License
  14. // along with SharpMap; if not, write to the Free Software
  15. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Collections.ObjectModel;
  19. using System.Text;
  20. using System.Data.OleDb;
  21. namespace SharpMap.Data.Providers
  22. {
  23. /// <summary>
  24. /// The OleDbPoint provider is used for rendering point data from an OleDb compatible datasource.
  25. /// </summary>
  26. /// <remarks>
  27. /// <para>The data source will need to have two double-type columns, xColumn and yColumn that contains the coordinates of the point,
  28. /// and an integer-type column containing a unique identifier for each row.</para>
  29. /// <para>To get good performance, make sure you have applied indexes on ID, xColumn and yColumns in your datasource table.</para>
  30. /// </remarks>
  31. public class OleDbPoint : IProvider, IDisposable
  32. {
  33. /// <summary>
  34. /// Initializes a new instance of the OleDbPoint provider
  35. /// </summary>
  36. /// <param name="ConnectionStr"></param>
  37. /// <param name="tablename"></param>
  38. /// <param name="OID_ColumnName"></param>
  39. /// <param name="xColumn"></param>
  40. /// <param name="yColumn"></param>
  41. public OleDbPoint(string ConnectionStr, string tablename, string OID_ColumnName, string xColumn, string yColumn)
  42. {
  43. this.Table = tablename;
  44. this.XColumn = xColumn;
  45. this.YColumn = yColumn;
  46. this.ObjectIdColumn = OID_ColumnName;
  47. this.ConnectionString = ConnectionStr;
  48. }
  49. private string _Table;
  50. /// <summary>
  51. /// Data table name
  52. /// </summary>
  53. public string Table
  54. {
  55. get { return _Table; }
  56. set { _Table = value; }
  57. }
  58. private string _ObjectIdColumn;
  59. /// <summary>
  60. /// Name of column that contains the Object ID
  61. /// </summary>
  62. public string ObjectIdColumn
  63. {
  64. get { return _ObjectIdColumn; }
  65. set { _ObjectIdColumn = value; }
  66. }
  67. private string _XColumn;
  68. /// <summary>
  69. /// Name of column that contains X coordinate
  70. /// </summary>
  71. public string XColumn
  72. {
  73. get { return _XColumn; }
  74. set { _XColumn = value; }
  75. }
  76. private string _YColumn;
  77. /// <summary>
  78. /// Name of column that contains Y coordinate
  79. /// </summary>
  80. public string YColumn
  81. {
  82. get { return _YColumn; }
  83. set { _YColumn = value; }
  84. }
  85. private string _ConnectionString;
  86. /// <summary>
  87. /// Connectionstring
  88. /// </summary>
  89. public string ConnectionString
  90. {
  91. get { return _ConnectionString; }
  92. set { _ConnectionString = value;}
  93. }
  94. #region IProvider Members
  95. /// <summary>
  96. /// Returns geometries within the specified bounding box
  97. /// </summary>
  98. /// <param name="bbox"></param>
  99. /// <returns></returns>
  100. public Collection<SharpMap.Geometries.Geometry> GetGeometriesInView(SharpMap.Geometries.BoundingBox bbox)
  101. {
  102. Collection<Geometries.Geometry> features = new Collection<SharpMap.Geometries.Geometry>();
  103. using(System.Data.OleDb.OleDbConnection conn = new OleDbConnection(_ConnectionString))
  104. {
  105. string strSQL = "Select " + this.XColumn + ", " + this.YColumn + " FROM " + this.Table + " WHERE ";
  106. if (!String.IsNullOrEmpty(_defintionQuery))
  107. strSQL += _defintionQuery + " AND ";
  108. //Limit to the points within the boundingbox
  109. strSQL += this.XColumn + " BETWEEN " + bbox.Left.ToString(SharpMap.Map.numberFormat_EnUS) + " AND " + bbox.Right.ToString(SharpMap.Map.numberFormat_EnUS) + " AND " +
  110. this.YColumn + " BETWEEN " + bbox.Bottom.ToString(SharpMap.Map.numberFormat_EnUS) + " AND " + bbox.Top.ToString(SharpMap.Map.numberFormat_EnUS);
  111. using (System.Data.OleDb.OleDbCommand command = new OleDbCommand(strSQL, conn))
  112. {
  113. conn.Open();
  114. using (System.Data.OleDb.OleDbDataReader dr = command.ExecuteReader())
  115. {
  116. while (dr.Read())
  117. {
  118. if (dr[0] != DBNull.Value && dr[1] != DBNull.Value)
  119. features.Add(new SharpMap.Geometries.Point((double)dr[0], (double)dr[1]));
  120. }
  121. }
  122. conn.Close();
  123. }
  124. }
  125. return features;
  126. }
  127. /// <summary>
  128. /// Returns geometry Object IDs whose bounding box intersects 'bbox'
  129. /// </summary>
  130. /// <param name="bbox"></param>
  131. /// <returns></returns>
  132. public Collection<uint> GetObjectIDsInView(SharpMap.Geometries.BoundingBox bbox)
  133. {
  134. Collection<uint> objectlist = new Collection<uint>();
  135. using (System.Data.OleDb.OleDbConnection conn = new OleDbConnection(_ConnectionString))
  136. {
  137. string strSQL = "Select " + this.ObjectIdColumn + " FROM " + this.Table + " WHERE ";
  138. if (!String.IsNullOrEmpty(_defintionQuery))
  139. strSQL += _defintionQuery + " AND ";
  140. //Limit to the points within the boundingbox
  141. strSQL += this.XColumn + " BETWEEN " + bbox.Left.ToString(SharpMap.Map.numberFormat_EnUS) + " AND " + bbox.Right.ToString(SharpMap.Map.numberFormat_EnUS) + " AND " + this.YColumn +
  142. " BETWEEN " + bbox.Bottom.ToString(SharpMap.Map.numberFormat_EnUS) + " AND " + bbox.Top.ToString(SharpMap.Map.numberFormat_EnUS);
  143. using (System.Data.OleDb.OleDbCommand command = new OleDbCommand(strSQL, conn))
  144. {
  145. conn.Open();
  146. using (System.Data.OleDb.OleDbDataReader dr = command.ExecuteReader())
  147. {
  148. while (dr.Read())
  149. if (dr[0] != DBNull.Value)
  150. objectlist.Add((uint)(int)dr[0]);
  151. }
  152. conn.Close();
  153. }
  154. }
  155. return objectlist;
  156. }
  157. /// <summary>
  158. /// Returns the geometry corresponding to the Object ID
  159. /// </summary>
  160. /// <param name="oid">Object ID</param>
  161. /// <returns>geometry</returns>
  162. public SharpMap.Geometries.Geometry GetGeometryByID(uint oid)
  163. {
  164. SharpMap.Geometries.Geometry geom = null;
  165. using (System.Data.OleDb.OleDbConnection conn = new OleDbConnection(_ConnectionString))
  166. {
  167. string strSQL = "Select " + this.XColumn + ", " + this.YColumn + " FROM " + this.Table + " WHERE " + this.ObjectIdColumn + "=" + oid.ToString();
  168. using (System.Data.OleDb.OleDbCommand command = new OleDbCommand(strSQL, conn))
  169. {
  170. conn.Open();
  171. using (System.Data.OleDb.OleDbDataReader dr = command.ExecuteReader())
  172. {
  173. if(dr.Read())
  174. {
  175. //If the read row is OK, create a point geometry from the XColumn and YColumn and return it
  176. if (dr[0] != DBNull.Value && dr[1] != DBNull.Value)
  177. geom = new SharpMap.Geometries.Point((double)dr[0], (double)dr[1]);
  178. }
  179. }
  180. conn.Close();
  181. }
  182. }
  183. return geom;
  184. }
  185. /// <summary>
  186. /// Throws NotSupportedException. 
  187. /// </summary>
  188. /// <param name="geom"></param>
  189. /// <param name="ds">FeatureDataSet to fill data into</param>
  190. public void ExecuteIntersectionQuery(SharpMap.Geometries.Geometry geom, FeatureDataSet ds)
  191. {
  192. throw new NotSupportedException("ExecuteIntersectionQuery(Geometry) is not supported by the OleDbPointProvider.");
  193. //When relation model has been implemented the following will complete the query
  194. /*
  195. ExecuteIntersectionQuery(geom.GetBoundingBox(), ds);
  196. if (ds.Tables.Count > 0)
  197. {
  198. for(int i=ds.Tables[0].Count-1;i>=0;i--)
  199. {
  200. if (!geom.Intersects(ds.Tables[0][i].Geometry))
  201. ds.Tables.RemoveAt(i);
  202. }
  203. }
  204. */
  205. }
  206. /// <summary>
  207. /// Returns all features with the view box
  208. /// </summary>
  209. /// <param name="bbox">view box</param>
  210. /// <param name="ds">FeatureDataSet to fill data into</param>
  211. public void ExecuteIntersectionQuery(SharpMap.Geometries.BoundingBox bbox, FeatureDataSet ds)
  212. {
  213. //List<Geometries.Geometry> features = new List<SharpMap.Geometries.Geometry>();
  214. using (System.Data.OleDb.OleDbConnection conn = new OleDbConnection(_ConnectionString))
  215. {
  216. string strSQL = "Select * FROM " + this.Table + " WHERE ";
  217. if (!String.IsNullOrEmpty(_defintionQuery)) //If a definition query has been specified, add this as a filter on the query
  218. strSQL += _defintionQuery + " AND ";
  219. //Limit to the points within the boundingbox
  220. strSQL += this.XColumn + " BETWEEN " + bbox.Left.ToString(SharpMap.Map.numberFormat_EnUS) + " AND " + bbox.Right.ToString(SharpMap.Map.numberFormat_EnUS) + " AND " + this.YColumn +
  221. " BETWEEN " + bbox.Bottom.ToString(SharpMap.Map.numberFormat_EnUS) + " AND " + bbox.Top.ToString(SharpMap.Map.numberFormat_EnUS);
  222. using (System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(strSQL, conn))
  223. {
  224. conn.Open();
  225. System.Data.DataSet ds2 = new System.Data.DataSet();
  226. adapter.Fill(ds2);
  227. conn.Close();
  228. if (ds2.Tables.Count > 0)
  229. {
  230. FeatureDataTable fdt = new FeatureDataTable(ds2.Tables[0]);
  231. foreach (System.Data.DataColumn col in ds2.Tables[0].Columns)
  232. fdt.Columns.Add(col.ColumnName, col.DataType, col.Expression);
  233. foreach (System.Data.DataRow dr in ds2.Tables[0].Rows)
  234. {
  235. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  236. foreach (System.Data.DataColumn col in ds2.Tables[0].Columns)
  237. fdr[col.ColumnName] = dr[col];
  238. if (dr[this.XColumn] != DBNull.Value && dr[this.YColumn] != DBNull.Value)
  239. fdr.Geometry = new SharpMap.Geometries.Point((double)dr[this.XColumn], (double)dr[this.YColumn]);
  240. fdt.AddRow(fdr);
  241. }
  242. ds.Tables.Add(fdt);
  243. }
  244. }
  245. }
  246. }
  247. /// <summary>
  248. /// Returns the number of features in the dataset
  249. /// </summary>
  250. /// <returns>Total number of features</returns>
  251. public int GetFeatureCount()
  252. {
  253. int count = 0;
  254. using (System.Data.OleDb.OleDbConnection conn = new OleDbConnection(_ConnectionString))
  255. {
  256. string strSQL = "Select Count(*) FROM " + this.Table;
  257. if (!String.IsNullOrEmpty(_defintionQuery)) //If a definition query has been specified, add this as a filter on the query
  258. strSQL += " WHERE " + _defintionQuery;
  259. using (System.Data.OleDb.OleDbCommand command = new OleDbCommand(strSQL, conn))
  260. {
  261. conn.Open();
  262. count = (int)command.ExecuteScalar();
  263. conn.Close();
  264. }
  265. }
  266. return count;
  267. }
  268. private string _defintionQuery;
  269. /// <summary>
  270. /// Definition query used for limiting dataset
  271. /// </summary>
  272. public string DefinitionQuery
  273. {
  274. get { return _defintionQuery; }
  275. set { _defintionQuery = value; }
  276. }
  277. /// <summary>
  278. /// Returns a datarow based on a RowID
  279. /// </summary>
  280. /// <param name="RowID"></param>
  281. /// <returns>datarow</returns>
  282. public FeatureDataRow GetFeature(uint RowID)
  283. {
  284. using (System.Data.OleDb.OleDbConnection conn = new OleDbConnection(_ConnectionString))
  285. {
  286. string strSQL = "select * from " + this.Table + " WHERE " + this.ObjectIdColumn + "=" + RowID.ToString();
  287. using (System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(strSQL, conn))
  288. {
  289. conn.Open();
  290. System.Data.DataSet ds = new System.Data.DataSet();
  291. adapter.Fill(ds);
  292. conn.Close();
  293. if (ds.Tables.Count > 0)
  294. {
  295. FeatureDataTable fdt = new FeatureDataTable(ds.Tables[0]);
  296. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  297. fdt.Columns.Add(col.ColumnName, col.DataType, col.Expression);
  298. if (ds.Tables[0].Rows.Count > 0)
  299. {
  300. System.Data.DataRow dr = ds.Tables[0].Rows[0];
  301. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  302. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  303. fdr[col.ColumnName] = dr[col];
  304. if (dr[this.XColumn] != DBNull.Value && dr[this.YColumn] != DBNull.Value)
  305. fdr.Geometry = new SharpMap.Geometries.Point((double)dr[this.XColumn], (double)dr[this.YColumn]);
  306. return fdr;
  307. }
  308. else
  309. return null;
  310. }
  311. else
  312. return null;
  313. }
  314. }
  315. }
  316. /// <summary>
  317. /// Boundingbox of dataset
  318. /// </summary>
  319. /// <returns>boundingbox</returns>
  320. public SharpMap.Geometries.BoundingBox GetExtents()
  321. {
  322. SharpMap.Geometries.BoundingBox box = null;
  323. using (System.Data.OleDb.OleDbConnection conn = new OleDbConnection(_ConnectionString))
  324. {
  325. string strSQL = "Select Min(" + this.XColumn + ") as MinX, Min(" + this.YColumn + ") As MinY, " +
  326.    "Max(" + this.XColumn + ") As MaxX, Max(" + this.YColumn + ") As MaxY FROM " + this.Table;
  327. if (!String.IsNullOrEmpty(_defintionQuery)) //If a definition query has been specified, add this as a filter on the query
  328. strSQL += " WHERE " + _defintionQuery;
  329. using (System.Data.OleDb.OleDbCommand command = new OleDbCommand(strSQL, conn))
  330. {
  331. conn.Open();
  332. using (System.Data.OleDb.OleDbDataReader dr = command.ExecuteReader())
  333. {
  334. if(dr.Read())
  335. {
  336. //If the read row is OK, create a point geometry from the XColumn and YColumn and return it
  337. if (dr[0] != DBNull.Value && dr[1] != DBNull.Value && dr[2] != DBNull.Value && dr[3] != DBNull.Value)
  338. box = new SharpMap.Geometries.BoundingBox((double)dr[0], (double)dr[1], (double)dr[2], (double)dr[3]);
  339. }
  340. }
  341. conn.Close();
  342. }
  343. }
  344. return box;
  345. }
  346. /// <summary>
  347. /// Gets the connection ID of the datasource
  348. /// </summary>
  349. public string ConnectionID
  350. {
  351. get { return _ConnectionString; }
  352. }
  353. /// <summary>
  354. /// Opens the datasource
  355. /// </summary>
  356. public void Open()
  357. {
  358. //Don't really do anything. OleDb's ConnectionPooling takes over here
  359. _IsOpen = true;
  360. }
  361. /// <summary>
  362. /// Closes the datasource
  363. /// </summary>
  364. public void Close()
  365. {
  366. //Don't really do anything. OleDb's ConnectionPooling takes over here
  367. _IsOpen = false;
  368. }
  369. private bool _IsOpen;
  370. /// <summary>
  371. /// Returns true if the datasource is currently open
  372. /// </summary>
  373. public bool IsOpen
  374. {
  375. get { return _IsOpen; }
  376. }
  377. private int _SRID = -1;
  378. /// <summary>
  379. /// The spatial reference ID (CRS)
  380. /// </summary>
  381. public int SRID
  382. {
  383. get { return _SRID; }
  384. set { _SRID = value; }
  385. }
  386. #endregion
  387. #region Disposers and finalizers
  388. private bool disposed = false;
  389. /// <summary>
  390. /// Disposes the object
  391. /// </summary>
  392. public void Dispose()
  393. {
  394. Dispose(true);
  395. GC.SuppressFinalize(this);
  396. }
  397. internal void Dispose(bool disposing)
  398. {
  399. if (!disposed)
  400. {
  401. if (disposing)
  402. {
  403. }
  404. disposed = true;
  405. }
  406. }
  407. /// <summary>
  408. /// Finalizer
  409. /// </summary>
  410. ~OleDbPoint()
  411. {
  412. Dispose();
  413. }
  414. #endregion
  415. }
  416. }