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

GIS编程

开发平台:

C#

  1. // Copyright 2005, 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. // PostGIS references:
  17. // PostGIS functions: http://www.01map.com/download/guide_utilisateur/node73.htm
  18. // PostGIS manual: http://sun.calstatela.edu/~cysun/documentation/postgres/8/postgis/postgis.html
  19. using System;
  20. using System.Collections.Generic;
  21. using System.Collections.ObjectModel;
  22. using System.Text;
  23. namespace SharpMap.Data.Providers
  24. {
  25. /// <summary>
  26. /// PostGreSQL / PostGIS dataprovider
  27. /// </summary>
  28. /// <example>
  29. /// Adding a datasource to a layer:
  30. /// <code lang="C#">
  31. /// SharpMap.Layers.VectorLayer myLayer = new SharpMap.Layers.VectorLayer("My layer");
  32. /// string ConnStr = "Server=127.0.0.1;Port=5432;User Id=postgres;Password=password;Database=myGisDb;";
  33. /// myLayer.DataSource = new SharpMap.Data.Providers.PostGIS(ConnStr, "myTable");
  34. /// </code>
  35. /// </example>
  36. [Serializable]
  37. public class PostGIS : SharpMap.Data.Providers.IProvider, IDisposable
  38. {
  39. /// <summary>
  40. /// Initializes a new connection to PostGIS
  41. /// </summary>
  42. /// <param name="ConnectionStr">Connectionstring</param>
  43. /// <param name="tablename">Name of data table</param>
  44. /// <param name="geometryColumnName">Name of geometry column</param>
  45. /// /// <param name="OID_ColumnName">Name of column with unique identifier</param>
  46. public PostGIS(string ConnectionStr, string tablename, string geometryColumnName, string OID_ColumnName)
  47. {
  48. this.ConnectionString = ConnectionStr;
  49. this.Table = tablename;
  50. this.GeometryColumn = geometryColumnName;
  51. this.ObjectIdColumn = OID_ColumnName;
  52. }
  53. /// <summary>
  54. /// Initializes a new connection to PostGIS
  55. /// </summary>
  56. /// <param name="ConnectionStr">Connectionstring</param>
  57. /// <param name="tablename">Name of data table</param>
  58. /// <param name="OID_ColumnName">Name of column with unique identifier</param>
  59. public PostGIS(string ConnectionStr, string tablename, string OID_ColumnName) : this(ConnectionStr,tablename,"",OID_ColumnName)
  60. {
  61. this.GeometryColumn = this.GetGeometryColumn();
  62. }
  63. private bool _IsOpen;
  64. /// <summary>
  65. /// Returns true if the datasource is currently open
  66. /// </summary>
  67. public bool IsOpen
  68. {
  69. get { return _IsOpen; }
  70. }
  71. /// <summary>
  72. /// Opens the datasource
  73. /// </summary>
  74. public void Open()
  75. {
  76. //Don't really do anything. npgsql's ConnectionPooling takes over here
  77. _IsOpen = true;
  78. }
  79. /// <summary>
  80. /// Closes the datasource
  81. /// </summary>
  82. public void Close()
  83. {
  84. //Don't really do anything. npgsql's ConnectionPooling takes over here
  85. _IsOpen = false;
  86. }
  87. #region Disposers and finalizers
  88. private bool disposed = false;
  89. /// <summary>
  90. /// Disposes the object
  91. /// </summary>
  92. public void Dispose()
  93. {
  94. Dispose(true);
  95. GC.SuppressFinalize(this);
  96. }
  97. internal void Dispose(bool disposing)
  98. {
  99. if (!disposed)
  100. {
  101. if (disposing)
  102. {
  103. //Close();
  104. }
  105. disposed = true;
  106. }
  107. }
  108. /// <summary>
  109. /// Finalizer
  110. /// </summary>
  111. ~PostGIS()
  112. {
  113. Dispose();
  114. }
  115. #endregion
  116. private string _ConnectionString;
  117. /// <summary>
  118. /// Connectionstring
  119. /// </summary>
  120. public string ConnectionString
  121. {
  122. get { return _ConnectionString; }
  123. set { _ConnectionString = value; }
  124. }
  125. private string _Table;
  126. /// <summary>
  127. /// Data table name
  128. /// </summary>
  129. public string Table
  130. {
  131. get { return _Table; }
  132. set { _Table = value; }
  133. }
  134. private string _GeometryColumn;
  135. /// <summary>
  136. /// Name of geometry column
  137. /// </summary>
  138. public string GeometryColumn
  139. {
  140. get { return _GeometryColumn; }
  141. set { _GeometryColumn = value; }
  142. }
  143. private string _ObjectIdColumn;
  144. /// <summary>
  145. /// Name of column that contains the Object ID
  146. /// </summary>
  147. public string ObjectIdColumn
  148. {
  149. get { return _ObjectIdColumn; }
  150. set { _ObjectIdColumn = value; }
  151. }
  152. /// <summary>
  153. /// Returns geometries within the specified bounding box
  154. /// </summary>
  155. /// <param name="bbox"></param>
  156. /// <returns></returns>
  157. public Collection<Geometries.Geometry> GetGeometriesInView(SharpMap.Geometries.BoundingBox bbox)
  158. {
  159. Collection<Geometries.Geometry> features = new Collection<SharpMap.Geometries.Geometry>();
  160. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  161. {
  162. string strBbox = "box2d('BOX3D(" +
  163. bbox.Min.X.ToString(SharpMap.Map.numberFormat_EnUS) + " " +
  164. bbox.Min.Y.ToString(SharpMap.Map.numberFormat_EnUS) + "," +
  165. bbox.Max.X.ToString(SharpMap.Map.numberFormat_EnUS) + " " +
  166. bbox.Max.Y.ToString(SharpMap.Map.numberFormat_EnUS) + ")'::box3d)";
  167. if (this.SRID > 0)
  168. strBbox = "setSRID(" + strBbox + "," + this.SRID.ToString(Map.numberFormat_EnUS) + ")";
  169. string strSQL = "SELECT AsBinary(" + this.GeometryColumn + ") AS Geom ";
  170. strSQL += "FROM " + this.Table + " WHERE ";
  171. if (!String.IsNullOrEmpty(_defintionQuery))
  172. strSQL += this.DefinitionQuery + " AND ";
  173. strSQL += this.GeometryColumn + " && " + strBbox;
  174. using (Npgsql.NpgsqlCommand command = new Npgsql.NpgsqlCommand(strSQL, conn))
  175. {
  176. conn.Open();
  177. using (Npgsql.NpgsqlDataReader dr = command.ExecuteReader())
  178. {
  179. while (dr.Read())
  180. {
  181. if (dr[0] != DBNull.Value)
  182. {
  183. SharpMap.Geometries.Geometry geom = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr[0]);
  184. if(geom!=null)
  185. features.Add(geom);
  186. }
  187. }
  188. }
  189. conn.Close();
  190. }
  191. }
  192. return features;
  193. }
  194. /// <summary>
  195. /// Returns the geometry corresponding to the Object ID
  196. /// </summary>
  197. /// <param name="oid">Object ID</param>
  198. /// <returns>geometry</returns>
  199. public SharpMap.Geometries.Geometry GetGeometryByID(uint oid)
  200. {
  201. SharpMap.Geometries.Geometry geom = null;
  202. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  203. {
  204. string strSQL = "SELECT AsBinary(" + this.GeometryColumn + ") AS Geom FROM " + this.Table + " WHERE " + this.ObjectIdColumn + "='" + oid.ToString() + "'";
  205. conn.Open();
  206. using (Npgsql.NpgsqlCommand command = new Npgsql.NpgsqlCommand(strSQL, conn))
  207. {
  208. using (Npgsql.NpgsqlDataReader dr = command.ExecuteReader())
  209. {
  210. while (dr.Read())
  211. {
  212. if (dr[0] != DBNull.Value)
  213. geom = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr[0]);
  214. }
  215. }
  216. }
  217. conn.Close();
  218. }
  219. return geom;
  220. }
  221. /// <summary>
  222. /// Returns geometry Object IDs whose bounding box intersects 'bbox'
  223. /// </summary>
  224. /// <param name="bbox"></param>
  225. /// <returns></returns>
  226. public Collection<uint> GetObjectIDsInView(SharpMap.Geometries.BoundingBox bbox)
  227. {
  228. Collection<uint> objectlist = new Collection<uint>();
  229. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  230. {
  231. string strBbox = "box2d('BOX3D(" +
  232. bbox.Min.X.ToString(SharpMap.Map.numberFormat_EnUS) + " " +
  233. bbox.Min.Y.ToString(SharpMap.Map.numberFormat_EnUS) + "," +
  234. bbox.Max.X.ToString(SharpMap.Map.numberFormat_EnUS) + " " +
  235. bbox.Max.Y.ToString(SharpMap.Map.numberFormat_EnUS) + ")'::box3d)";
  236. if (this.SRID > 0)
  237. strBbox = "setSRID(" + strBbox + "," + this.SRID.ToString(Map.numberFormat_EnUS) + ")";
  238. string strSQL = "SELECT " + this.ObjectIdColumn + " ";
  239. strSQL += "FROM " + this.Table + " WHERE ";
  240. if (!String.IsNullOrEmpty(_defintionQuery))
  241. strSQL += this.DefinitionQuery + " AND ";
  242. strSQL += this.GeometryColumn + " && " + strBbox;
  243. using (Npgsql.NpgsqlCommand command = new Npgsql.NpgsqlCommand(strSQL, conn))
  244. {
  245. conn.Open();
  246. using (Npgsql.NpgsqlDataReader dr = command.ExecuteReader())
  247. {
  248. while (dr.Read())
  249. {
  250. if (dr[0] != DBNull.Value)
  251. {
  252. uint ID = (uint)(int)dr[0];
  253. objectlist.Add(ID);
  254. }
  255. }
  256. }
  257. conn.Close();
  258. }
  259. }
  260. return objectlist;
  261. }
  262. /// <summary>
  263. /// Returns all objects within a distance of a geometry
  264. /// </summary>
  265. /// <param name="geom"></param>
  266. /// <param name="distance"></param>
  267. /// <returns></returns>
  268. [Obsolete("Use ExecuteIntersectionQuery instead")]
  269. public SharpMap.Data.FeatureDataTable QueryFeatures(SharpMap.Geometries.Geometry geom, double distance)
  270. {
  271. //Collection<Geometries.Geometry> features = new Collection<SharpMap.Geometries.Geometry>();
  272. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  273. {
  274. string strGeom = "GeomFromText('" + geom.AsText() + "')";
  275. if (this.SRID > 0)
  276. strGeom = "setSRID(" + strGeom + "," + this.SRID.ToString() + ")";
  277. string strSQL = "SELECT * , AsBinary(" + this.GeometryColumn + ") As sharpmap_tempgeometry FROM " + this.Table + " WHERE ";
  278. if (!String.IsNullOrEmpty(_defintionQuery))
  279. strSQL += this.DefinitionQuery + " AND ";
  280. strSQL += this.GeometryColumn + " && " + "buffer(" + strGeom + "," + distance.ToString(Map.numberFormat_EnUS) + ")";
  281. strSQL += " AND distance(" + this.GeometryColumn + ", " + strGeom + ")<" + distance.ToString(Map.numberFormat_EnUS);
  282. using (Npgsql.NpgsqlDataAdapter adapter = new Npgsql.NpgsqlDataAdapter(strSQL, conn))
  283. {
  284. System.Data.DataSet ds = new System.Data.DataSet();
  285. conn.Open();
  286. adapter.Fill(ds);
  287. conn.Close();
  288. if (ds.Tables.Count > 0)
  289. {
  290. FeatureDataTable fdt = new FeatureDataTable(ds.Tables[0]);
  291. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  292. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  293. fdt.Columns.Add(col.ColumnName,col.DataType,col.Expression);
  294. foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
  295. {
  296. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  297. foreach(System.Data.DataColumn col in ds.Tables[0].Columns)
  298. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  299. fdr[col.ColumnName] = dr[col];
  300. fdr.Geometry = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr["sharpmap_tempgeometry"]);
  301. fdt.AddRow(fdr);
  302. }
  303. return fdt;
  304. }
  305. else return null;
  306. }
  307. }
  308. }
  309. /// <summary>
  310. /// Returns the features that intersects with 'geom'
  311. /// </summary>
  312. /// <param name="geom"></param>
  313. /// <param name="ds">FeatureDataSet to fill data into</param>
  314. public void ExecuteIntersectionQuery(SharpMap.Geometries.Geometry geom, FeatureDataSet ds)
  315. {
  316. List<Geometries.Geometry> features = new List<SharpMap.Geometries.Geometry>();
  317. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  318. {
  319. string strGeom = "GeomFromText('" + geom.AsText() + "')";
  320. if (this.SRID > 0)
  321. strGeom = "setSRID(" + strGeom + "," + this.SRID.ToString() + ")";
  322. string strSQL = "SELECT * , AsBinary(" + this.GeometryColumn + ") As sharpmap_tempgeometry FROM " + this.Table + " WHERE ";
  323. if (!String.IsNullOrEmpty(_defintionQuery))
  324. strSQL += this.DefinitionQuery + " AND ";
  325. strSQL += this.GeometryColumn + " && " + strGeom + " AND distance(" + this.GeometryColumn + ", " + strGeom + ")<0";
  326. using (Npgsql.NpgsqlDataAdapter adapter = new Npgsql.NpgsqlDataAdapter(strSQL, conn))
  327. {
  328. conn.Open();
  329. adapter.Fill(ds);
  330. conn.Close();
  331. if (ds.Tables.Count > 0)
  332. {
  333. FeatureDataTable fdt = new FeatureDataTable(ds.Tables[0]);
  334. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  335. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  336. fdt.Columns.Add(col.ColumnName, col.DataType, col.Expression);
  337. foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
  338. {
  339. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  340. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  341. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  342. fdr[col.ColumnName] = dr[col];
  343. fdr.Geometry = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr["sharpmap_tempgeometry"]);
  344. fdt.AddRow(fdr);
  345. }
  346. ds.Tables.Add(fdt);
  347. }
  348. }
  349. }
  350. }
  351. /// <summary>
  352. /// Convert WellKnownText to linestrings
  353. /// </summary>
  354. /// <param name="WKT"></param>
  355. /// <returns></returns>
  356. private SharpMap.Geometries.LineString WktToLineString(string WKT)
  357. {
  358. SharpMap.Geometries.LineString line = new SharpMap.Geometries.LineString();
  359. WKT = WKT.Substring(WKT.LastIndexOf('(') + 1).Split(')')[0];
  360. string[] strPoints = WKT.Split(',');
  361. foreach (string strPoint in strPoints)
  362. {
  363. string[] coord = strPoint.Split(' ');
  364. line.Vertices.Add(new SharpMap.Geometries.Point(double.Parse(coord[0], SharpMap.Map.numberFormat_EnUS), double.Parse(coord[1], SharpMap.Map.numberFormat_EnUS)));
  365. }
  366. return line;
  367. }
  368. /// <summary>
  369. /// Returns the number of features in the dataset
  370. /// </summary>
  371. /// <returns>number of features</returns>
  372. public int GetFeatureCount()
  373. {
  374. int count = 0;
  375. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  376. {
  377. string strSQL = "SELECT COUNT(*) FROM " + this.Table;
  378. if (!String.IsNullOrEmpty(_defintionQuery))
  379. strSQL += " WHERE " + this.DefinitionQuery;
  380. using (Npgsql.NpgsqlCommand command = new Npgsql.NpgsqlCommand(strSQL, conn))
  381. {
  382. conn.Open();
  383. count = (int)command.ExecuteScalar();
  384. conn.Close();
  385. }
  386. }
  387. return count;
  388. }
  389. #region IProvider Members
  390. private string _defintionQuery;
  391. /// <summary>
  392. /// Definition query used for limiting dataset
  393. /// </summary>
  394. public string DefinitionQuery
  395. {
  396. get { return _defintionQuery; }
  397. set { _defintionQuery = value; }
  398. }
  399. /// <summary>
  400. /// Gets a collection of columns in the dataset
  401. /// </summary>
  402. public System.Data.DataColumnCollection Columns
  403. {
  404. get {
  405. throw new NotImplementedException();
  406. //using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(this.ConnectionString))
  407. //{
  408. //    System.Data.DataColumnCollection columns = new System.Data.DataColumnCollection();
  409. //    string strSQL = "SELECT column_name, udt_name FROM information_schema.columns WHERE table_name='" + this.Table + "' ORDER BY ordinal_position";
  410. //    using (Npgsql.NpgsqlCommand command = new Npgsql.NpgsqlCommand(strSQL, conn))
  411. //    {
  412. //        conn.Open();
  413. //        using (Npgsql.NpgsqlDataReader dr = command.ExecuteReader())
  414. //        {
  415. //            while (dr.Read())
  416. //            {
  417. //                System.Data.DataColumn col = new System.Data.DataColumn((string)dr["column_name"]);
  418. //                switch((string)dr["udt_name"])
  419. //                {
  420. //                    case "int4":
  421. //                        col.DataType = typeof(Int32);
  422. //                        break;
  423. //                    case "int8":
  424. //                        col.DataType = typeof(Int64);
  425. //                        break;
  426. //                    case "varchar":
  427. //                        col.DataType = typeof(string);
  428. //                        break;
  429. //                    case "text":
  430. //                        col.DataType = typeof(string);
  431. //                        break;
  432. //                    case "bool":
  433. //                        col.DataType = typeof(bool);
  434. //                        break;
  435. //                    case "geometry":
  436. //                        col.DataType = typeof(SharpMap.Geometries.Geometry);
  437. //                        break;
  438. //                    default:
  439. //                        col.DataType = typeof(object);
  440. //                        break;
  441. //                }
  442. //                columns.Add(col);
  443. //            }
  444. //        }
  445. //    }
  446. //    return columns;
  447. //}
  448. }
  449. }
  450. private int _srid=-2;
  451. /// <summary>
  452. /// Spacial Reference ID
  453. /// </summary>
  454. public int SRID
  455. {
  456. get {
  457. if (_srid == -2)
  458. {
  459. int dotPos = this.Table.IndexOf(".");
  460. string strSQL = "";
  461. if (dotPos == -1)
  462. strSQL = "select srid from geometry_columns WHERE f_table_name='" + this.Table + "'";
  463. else
  464. {
  465. string schema = this.Table.Substring(0, dotPos);
  466. string table = this.Table.Substring(dotPos + 1);
  467. strSQL = "select srid from geometry_columns WHERE f_table_schema='" + schema + "' AND f_table_name='" + table + "'";
  468. }
  469. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  470. {
  471. using (Npgsql.NpgsqlCommand command = new Npgsql.NpgsqlCommand(strSQL, conn))
  472. {
  473. try
  474. {
  475. conn.Open();
  476. _srid = (int)command.ExecuteScalar();
  477. conn.Close();
  478. }
  479. catch
  480. {
  481. _srid = -1;
  482. }
  483. }
  484. }
  485. }
  486. return _srid;
  487. }
  488. set {
  489. throw (new ApplicationException("Spatial Reference ID cannot by set on a PostGIS table"));
  490. }
  491. }
  492. /// <summary>
  493. /// Queries the PostGIS database to get the name of the Geometry Column. This is used if the columnname isn't specified in the constructor
  494. /// </summary>
  495. /// <remarks></remarks>
  496. /// <returns>Name of column containing geometry</returns>
  497. private string GetGeometryColumn()
  498. {
  499. string strSQL = "select f_geometry_column from geometry_columns WHERE f_table_name='" + this.Table + "'";
  500. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  501. using (Npgsql.NpgsqlCommand command = new Npgsql.NpgsqlCommand(strSQL, conn))
  502. {
  503. conn.Open();
  504. object columnname = command.ExecuteScalar();
  505. conn.Close();
  506. if (columnname == System.DBNull.Value)
  507. throw new ApplicationException("Table '" + this.Table + "' does not contain a geometry column");
  508. return (string)columnname;
  509. }
  510. }
  511. /// <summary>
  512. /// Returns a datarow based on a RowID
  513. /// </summary>
  514. /// <param name="RowID"></param>
  515. /// <returns>datarow</returns>
  516. public SharpMap.Data.FeatureDataRow GetFeature(uint RowID)
  517. {
  518. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  519. {
  520. string strSQL = "select * , AsBinary(" + this.GeometryColumn + ") As sharpmap_tempgeometry from " + this.Table + " WHERE " + this.ObjectIdColumn + "='" + RowID.ToString() + "'";
  521. using (Npgsql.NpgsqlDataAdapter adapter = new Npgsql.NpgsqlDataAdapter(strSQL, conn))
  522. {
  523. FeatureDataSet ds = new FeatureDataSet();
  524. conn.Open();
  525. adapter.Fill(ds);
  526. conn.Close();
  527. if (ds.Tables.Count > 0)
  528. {
  529. FeatureDataTable fdt = new FeatureDataTable(ds.Tables[0]);
  530. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  531. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  532. fdt.Columns.Add(col.ColumnName, col.DataType, col.Expression);
  533. if(ds.Tables[0].Rows.Count>0)
  534. {
  535. System.Data.DataRow dr = ds.Tables[0].Rows[0];
  536. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  537. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  538. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  539. fdr[col.ColumnName] = dr[col];
  540. fdr.Geometry = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr["sharpmap_tempgeometry"]);
  541. return fdr;
  542. }
  543. else
  544. return null;
  545. }
  546. else 
  547. return null;
  548. }
  549. }
  550. }
  551. /// <summary>
  552. /// Boundingbox of dataset
  553. /// </summary>
  554. /// <returns>boundingbox</returns>
  555. public SharpMap.Geometries.BoundingBox GetExtents()
  556. {
  557. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  558. {
  559. string strSQL = "SELECT EXTENT(" + this.GeometryColumn + ") FROM " + this.Table;
  560. if (!String.IsNullOrEmpty(_defintionQuery))
  561. strSQL += " WHERE " + this.DefinitionQuery;
  562. using (Npgsql.NpgsqlCommand command = new Npgsql.NpgsqlCommand(strSQL, conn))
  563. {
  564. conn.Open();
  565. object result = command.ExecuteScalar();
  566. conn.Close();
  567. if (result == System.DBNull.Value)
  568. return null;
  569. string strBox = (string)result;
  570. if (strBox.StartsWith("BOX("))
  571. {
  572. string[] vals = strBox.Substring(4, strBox.IndexOf(")")-4).Split(new char[2] { ',', ' ' });
  573. return new SharpMap.Geometries.BoundingBox(
  574. double.Parse(vals[0], SharpMap.Map.numberFormat_EnUS),
  575. double.Parse(vals[1], SharpMap.Map.numberFormat_EnUS),
  576. double.Parse(vals[2], SharpMap.Map.numberFormat_EnUS),
  577. double.Parse(vals[3], SharpMap.Map.numberFormat_EnUS));
  578. }
  579. else
  580. return null;
  581. }
  582. }
  583. }
  584. /// <summary>
  585. /// Gets the connection ID of the datasource
  586. /// </summary>
  587. public string ConnectionID
  588. {
  589. get { return _ConnectionString; }
  590. }
  591. #endregion
  592. #region IProvider Members
  593. /// <summary>
  594. /// Returns all features with the view box
  595. /// </summary>
  596. /// <param name="bbox">view box</param>
  597. /// <param name="ds">FeatureDataSet to fill data into</param>
  598. [Obsolete("Use ExecuteIntersectionQuery")]
  599. public void GetFeaturesInView(SharpMap.Geometries.BoundingBox bbox, SharpMap.Data.FeatureDataSet ds)
  600. {
  601. ExecuteIntersectionQuery(bbox, ds);
  602. }
  603. /// <summary>
  604. /// Returns all features with the view box
  605. /// </summary>
  606. /// <param name="bbox">view box</param>
  607. /// <param name="ds">FeatureDataSet to fill data into</param>
  608. public void ExecuteIntersectionQuery(SharpMap.Geometries.BoundingBox bbox, SharpMap.Data.FeatureDataSet ds)
  609. {
  610. List<Geometries.Geometry> features = new List<SharpMap.Geometries.Geometry>();
  611. using (Npgsql.NpgsqlConnection conn = new Npgsql.NpgsqlConnection(_ConnectionString))
  612. {
  613. string strBbox = "box2d('BOX3D(" +
  614. bbox.Min.X.ToString(SharpMap.Map.numberFormat_EnUS) + " " +
  615. bbox.Min.Y.ToString(SharpMap.Map.numberFormat_EnUS) + "," +
  616. bbox.Max.X.ToString(SharpMap.Map.numberFormat_EnUS) + " " +
  617. bbox.Max.Y.ToString(SharpMap.Map.numberFormat_EnUS) + ")'::box3d)";
  618. if (this.SRID > 0)
  619. strBbox = "setSRID(" + strBbox + "," + this.SRID.ToString(Map.numberFormat_EnUS) + ")";
  620. string strSQL = "SELECT *, AsBinary(" + this.GeometryColumn + ") AS sharpmap_tempgeometry ";
  621. strSQL += "FROM " + this.Table + " WHERE ";
  622. if (!String.IsNullOrEmpty(_defintionQuery))
  623. strSQL += this.DefinitionQuery + " AND ";
  624. strSQL += this.GeometryColumn + " && " + strBbox;
  625. using (Npgsql.NpgsqlDataAdapter adapter = new Npgsql.NpgsqlDataAdapter(strSQL, conn))
  626. {
  627. conn.Open();
  628. System.Data.DataSet ds2 = new System.Data.DataSet();
  629. adapter.Fill(ds2);
  630. conn.Close();
  631. if (ds2.Tables.Count > 0)
  632. {
  633. FeatureDataTable fdt = new FeatureDataTable(ds2.Tables[0]);
  634. foreach (System.Data.DataColumn col in ds2.Tables[0].Columns)
  635. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  636. fdt.Columns.Add(col.ColumnName,col.DataType,col.Expression);
  637. foreach (System.Data.DataRow dr in ds2.Tables[0].Rows)
  638. {
  639. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  640. foreach(System.Data.DataColumn col in ds2.Tables[0].Columns)
  641. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  642. fdr[col.ColumnName] = dr[col];
  643. fdr.Geometry = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr["sharpmap_tempgeometry"]);
  644. fdt.AddRow(fdr);
  645. }
  646. ds.Tables.Add(fdt);
  647. }
  648. }
  649. }
  650. }
  651. #endregion
  652. }
  653. }