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

GIS编程

开发平台:

C#

  1. // Copyright 2006 - Humberto Ferreira
  2. // Oracle provider by Humberto Ferreira (humbertojdf@hotmail.com)
  3. //
  4. // Date 2006-09-05
  5. //
  6. // This file is part of SharpMap.
  7. // SharpMap is free software; you can redistribute it and/or modify
  8. // it under the terms of the GNU Lesser General Public License as published by
  9. // the Free Software Foundation; either version 2 of the License, or
  10. // (at your option) any later version.
  11. // 
  12. // SharpMap is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU Lesser General Public License for more details.
  16. // You should have received a copy of the GNU Lesser General Public License
  17. // along with SharpMap; if not, write to the Free Software
  18. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  19. using System;
  20. using System.Collections.Generic;
  21. using System.Collections.ObjectModel;
  22. using System.Text;
  23. using Oracle.DataAccess.Client;
  24. namespace SharpMap.Data.Providers
  25. {
  26. /// <summary>
  27. /// Oracle dataprovider
  28. /// </summary>
  29. /// <remarks>
  30. /// <para>This provider needs the Oracle software client installed on the PC where the application runs.
  31. /// If you need to connect to an Oracle database, it has to have oracle client (or Oracle Instant Client) installed. </para>
  32. /// <para>You can download Oracle Client here:
  33. /// http://www.oracle.com/technology/software/index.html</para>
  34. /// <para>If client don4t need an instance of Oracle, a better option is to use Oracle Instant client
  35. /// http://www.oracle.com/technology/tech/oci/instantclient/index.html</para>
  36. /// <example>
  37. /// Adding a datasource to a layer:
  38. /// <code lang="C#">
  39. /// SharpMap.Layers.VectorLayer myLayer = new SharpMap.Layers.VectorLayer("My layer");
  40. /// string ConnStr = "Server=127.0.0.1;Port=5432;User Id=userid;Password=password;Database=myGisDb;";
  41. /// myLayer.DataSource = new SharpMap.Data.Providers.Oracle(ConnStr, "myTable", "GeomColumn", "OidColumn");
  42. /// </code>
  43. /// </example>
  44. /// <para>SharpMap Oracle provider by Humberto Ferreira (humbertojdf at hotmail com).</para>
  45. /// </remarks>
  46. [Serializable]
  47. public class Oracle : SharpMap.Data.Providers.IProvider, IDisposable
  48. {
  49. /// <summary>
  50. /// Initializes a new connection to Oracle
  51. /// </summary>
  52. /// <param name="ConnectionStr">Connectionstring</param>
  53. /// <param name="tablename">Name of data table</param>
  54. /// <param name="geometryColumnName">Name of geometry column</param>
  55. /// /// <param name="OID_ColumnName">Name of column with unique identifier</param>
  56. public Oracle(string ConnectionStr, string tablename, string geometryColumnName, string OID_ColumnName)
  57. {
  58. this.ConnectionString = ConnectionStr;
  59. this.Table = tablename;
  60. this.GeometryColumn = geometryColumnName;
  61. this.ObjectIdColumn = OID_ColumnName;
  62. }
  63.         /// <summary>
  64. /// Initializes a new connection to Oracle
  65. /// </summary>
  66.         /// <param name="username">Username</param>
  67.         /// <param name="password">Password</param>
  68.         /// <param name="datasource">Datasoure</param>
  69.         /// <param name="tablename">Tablename</param>
  70.         /// <param name="geometryColumnName">Geometry column name</param>
  71.         /// <param name="OID_ColumnName">Object ID column</param>
  72.         public Oracle(string username, string password, string datasource, string tablename, string geometryColumnName, string OID_ColumnName)
  73.         : this("User Id=" + username + ";Password=" + password + ";Data Source=" + datasource, tablename, geometryColumnName, OID_ColumnName)
  74.         {
  75.             
  76.         }
  77. /// <summary>
  78. /// Initializes a new connection to Oracle
  79. /// </summary>
  80. /// <param name="ConnectionStr">Connectionstring</param>
  81. /// <param name="tablename">Name of data table</param>
  82. /// <param name="OID_ColumnName">Name of column with unique identifier</param>
  83. public Oracle(string ConnectionStr, string tablename, string OID_ColumnName) : this(ConnectionStr,tablename,"",OID_ColumnName)
  84. {
  85. this.GeometryColumn = this.GetGeometryColumn();
  86. }
  87. private bool _IsOpen;
  88. /// <summary>
  89. /// Returns true if the datasource is currently open
  90. /// </summary>
  91. public bool IsOpen
  92. {
  93. get { return _IsOpen; }
  94. }
  95. /// <summary>
  96. /// Opens the datasource
  97. /// </summary>
  98. public void Open()
  99. {
  100. //Don't really do anything. oracle's ConnectionPooling takes over here
  101. _IsOpen = true;
  102. }
  103. /// <summary>
  104. /// Closes the datasource
  105. /// </summary>
  106. public void Close()
  107. {
  108. //Don't really do anything. oracle's ConnectionPooling takes over here
  109. _IsOpen = false;
  110. }
  111. #region Disposers and finalizers
  112. private bool disposed = false;
  113. /// <summary>
  114. /// Disposes the object
  115. /// </summary>
  116. public void Dispose()
  117. {
  118. Dispose(true);
  119. GC.SuppressFinalize(this);
  120. }
  121. internal void Dispose(bool disposing)
  122. {
  123. if (!disposed)
  124. {
  125. if (disposing)
  126. {
  127. //Close();
  128. }
  129. disposed = true;
  130. }
  131. }
  132. /// <summary>
  133. /// Finalizer
  134. /// </summary>
  135. ~Oracle()
  136. {
  137. Dispose();
  138. }
  139. #endregion
  140. private string _ConnectionString;
  141. /// <summary>
  142. /// Connectionstring
  143. /// </summary>
  144. public string ConnectionString
  145. {
  146. get { return _ConnectionString; }
  147. set { _ConnectionString = value; }
  148. }
  149. private string _Table;
  150. /// <summary>
  151. /// Data table name
  152. /// </summary>
  153. public string Table
  154. {
  155. get { return _Table; }
  156. set { _Table = value; }
  157. }
  158. private string _GeometryColumn;
  159. /// <summary>
  160. /// Name of geometry column
  161. /// </summary>
  162. public string GeometryColumn
  163. {
  164. get { return _GeometryColumn; }
  165. set { _GeometryColumn = value; }
  166. }
  167. private string _ObjectIdColumn;
  168. /// <summary>
  169. /// Name of column that contains the Object ID
  170. /// </summary>
  171. public string ObjectIdColumn
  172. {
  173. get { return _ObjectIdColumn; }
  174. set { _ObjectIdColumn = value; }
  175. }
  176. /// <summary>
  177. /// Returns geometries within the specified bounding box
  178. /// </summary>
  179. /// <param name="bbox"></param>
  180. /// <returns></returns>
  181. public Collection<Geometries.Geometry> GetGeometriesInView(SharpMap.Geometries.BoundingBox bbox)
  182. {
  183.             Collection<Geometries.Geometry> features = new Collection<SharpMap.Geometries.Geometry>();
  184. using (OracleConnection conn = new OracleConnection(_ConnectionString))
  185. {
  186.                 //Get bounding box string
  187.                 string strBbox = GetBoxFilterStr(bbox);
  188. //string strSQL = "SELECT AsBinary(" + this.GeometryColumn + ") AS Geom ";
  189. string strSQL = "SELECT g." + this.GeometryColumn +".Get_WKB() ";
  190. strSQL += " FROM " + this.Table + " g WHERE ";
  191. if (!String.IsNullOrEmpty(_defintionQuery))
  192. strSQL += this.DefinitionQuery + " AND ";
  193. strSQL += strBbox;
  194. using (OracleCommand command = new OracleCommand(strSQL, conn))
  195. {
  196. conn.Open();
  197. using (OracleDataReader dr = command.ExecuteReader())
  198. {
  199. while (dr.Read())
  200. {
  201. if (dr[0] != DBNull.Value)
  202. {
  203. SharpMap.Geometries.Geometry geom = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr[0]);                               
  204.                                 if(geom!=null)
  205. features.Add(geom);
  206. }
  207. }
  208. }
  209. conn.Close();
  210. }
  211. }
  212. return features;
  213. }
  214. /// <summary>
  215. /// Returns the geometry corresponding to the Object ID
  216. /// </summary>
  217. /// <param name="oid">Object ID</param>
  218. /// <returns>geometry</returns>
  219. public SharpMap.Geometries.Geometry GetGeometryByID(uint oid)
  220. {
  221. SharpMap.Geometries.Geometry geom = null;
  222. using (OracleConnection conn = new OracleConnection(_ConnectionString))
  223. {
  224.                 string strSQL = "SELECT g." + this.GeometryColumn + ".Get_WKB() FROM " + this.Table + " g WHERE " + this.ObjectIdColumn + "='" + oid.ToString() + "'";
  225. conn.Open();
  226. using (OracleCommand command = new OracleCommand(strSQL, conn))
  227. {
  228. using (OracleDataReader dr = command.ExecuteReader())
  229. {
  230. while (dr.Read())
  231. {
  232. if (dr[0] != DBNull.Value)
  233. geom = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr[0]);
  234. }
  235. }
  236. }
  237. conn.Close();
  238. }
  239. return geom;
  240. }
  241. /// <summary>
  242. /// Returns geometry Object IDs whose bounding box intersects 'bbox'
  243. /// </summary>
  244. /// <param name="bbox"></param>
  245. /// <returns></returns>
  246. public Collection<uint> GetObjectIDsInView(SharpMap.Geometries.BoundingBox bbox)
  247. {
  248. Collection<uint> objectlist = new Collection<uint>();
  249. using (OracleConnection conn = new OracleConnection(_ConnectionString))
  250. {
  251.                 //Get bounding box string
  252.                 string strBbox = GetBoxFilterStr(bbox);
  253. string strSQL = "SELECT g." + this.ObjectIdColumn + " ";
  254. strSQL += "FROM " + this.Table + " g WHERE ";
  255. if (!String.IsNullOrEmpty(_defintionQuery))
  256. strSQL += this.DefinitionQuery + " AND ";
  257. strSQL += strBbox;                
  258. using (OracleCommand command = new OracleCommand(strSQL, conn))
  259. {
  260. conn.Open();
  261. using (OracleDataReader dr = command.ExecuteReader())
  262. {
  263. while (dr.Read())
  264. {
  265. if (dr[0] != DBNull.Value)
  266. {
  267.                                 uint ID = (uint)(decimal)dr[0];
  268. objectlist.Add(ID);
  269. }
  270. }
  271. }
  272. conn.Close();
  273. }
  274. }
  275. return objectlist;
  276. }
  277.         /// <summary>
  278.         /// Returns the box filter string needed in SQL query
  279.         /// </summary>
  280.         /// <param name="bbox"></param>
  281.         /// <returns></returns>
  282.         private string GetBoxFilterStr(SharpMap.Geometries.BoundingBox bbox) {
  283.             string strBbox = "SDO_FILTER(g." + this.GeometryColumn + ", mdsys.sdo_geometry(2003,#SRID#,NULL," +
  284.                                    "mdsys.sdo_elem_info_array(1,1003,3)," +
  285.                                    "mdsys.sdo_ordinate_array(" +
  286.                                    bbox.Min.X.ToString(SharpMap.Map.numberFormat_EnUS) + ", " +
  287.                                    bbox.Min.Y.ToString(SharpMap.Map.numberFormat_EnUS) + ", " +
  288.                                    bbox.Max.X.ToString(SharpMap.Map.numberFormat_EnUS) + ", " +
  289.                                    bbox.Max.Y.ToString(SharpMap.Map.numberFormat_EnUS) + ")), " +
  290.                                    "'querytype=window') = 'TRUE'";
  291.             if (this.SRID > 0) {
  292.                 strBbox = strBbox.Replace("#SRID#", this.SRID.ToString(Map.numberFormat_EnUS));
  293.             } else {
  294.                 strBbox = strBbox.Replace("#SRID#", "NULL");
  295.             }
  296.             return strBbox;
  297.         }
  298. /// <summary>
  299. /// Returns all objects within a distance of a geometry
  300. /// </summary>
  301. /// <param name="geom"></param>
  302. /// <param name="distance"></param>
  303. /// <returns></returns>
  304. [Obsolete("Use ExecuteIntersectionQuery instead")]
  305. public SharpMap.Data.FeatureDataTable QueryFeatures(SharpMap.Geometries.Geometry geom, double distance)
  306. {
  307.             //List<Geometries.Geometry> features = new List<SharpMap.Geometries.Geometry>();
  308. using (OracleConnection conn = new OracleConnection(_ConnectionString))
  309. {
  310. string strGeom = "MDSYS.SDO_GEOMETRY('" + geom.AsText() + "', #SRID#)";
  311.                 if (this.SRID > 0) {
  312.                     strGeom = strGeom.Replace("#SRID#", this.SRID.ToString(Map.numberFormat_EnUS));
  313.                 } else {
  314.                     strGeom = strGeom.Replace("#SRID#", "NULL");
  315.                 }
  316.                 
  317.                 strGeom = "SDO_WITHIN_DISTANCE(g." + this.GeometryColumn + ", " + strGeom + ", 'distance = " + distance.ToString(Map.numberFormat_EnUS) + "') = 'TRUE'";
  318.                 string strSQL = "SELECT g.* , g." + this.GeometryColumn + ").Get_WKB() As sharpmap_tempgeometry FROM " + this.Table + " g WHERE ";
  319. if (!String.IsNullOrEmpty(_defintionQuery))
  320. strSQL += this.DefinitionQuery + " AND ";
  321.                 strSQL += strGeom;
  322. using (OracleDataAdapter adapter = new OracleDataAdapter(strSQL, conn))
  323. {
  324. System.Data.DataSet ds = new System.Data.DataSet();
  325. conn.Open();
  326. adapter.Fill(ds);
  327. conn.Close();
  328. if (ds.Tables.Count > 0)
  329. {
  330. FeatureDataTable fdt = new FeatureDataTable(ds.Tables[0]);
  331. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  332. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  333. fdt.Columns.Add(col.ColumnName,col.DataType,col.Expression);
  334. foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
  335. {
  336. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  337. foreach(System.Data.DataColumn col in ds.Tables[0].Columns)
  338. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  339. fdr[col.ColumnName] = dr[col];
  340. fdr.Geometry = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr["sharpmap_tempgeometry"]);
  341. fdt.AddRow(fdr);
  342. }
  343. return fdt;
  344. }
  345. else return null;
  346. }
  347. }
  348. }
  349. /// <summary>
  350. /// Returns the features that intersects with 'geom'
  351. /// </summary>
  352. /// <param name="geom"></param>
  353. /// <param name="ds">FeatureDataSet to fill data into</param>
  354. public void ExecuteIntersectionQuery(SharpMap.Geometries.Geometry geom, FeatureDataSet ds)
  355. {
  356. List<Geometries.Geometry> features = new List<SharpMap.Geometries.Geometry>();
  357. using (OracleConnection conn = new OracleConnection(_ConnectionString))
  358. {
  359.                 string strGeom = "MDSYS.SDO_GEOMETRY('" + geom.AsText() + "', #SRID#)";
  360.                 if (this.SRID > 0) {
  361.                     strGeom = strGeom.Replace("#SRID#", this.SRID.ToString(Map.numberFormat_EnUS));
  362.                 } else {
  363.                     strGeom = strGeom.Replace("#SRID#", "NULL");
  364.                 }
  365.                 strGeom = "SDO_RELATE(g." + this.GeometryColumn + ", " + strGeom + ", 'mask=ANYINTERACT querytype=WINDOW') = 'TRUE'";
  366.                 string strSQL = "SELECT g.* , g." + this.GeometryColumn + ").Get_WKB() As sharpmap_tempgeometry FROM " + this.Table + " g WHERE ";
  367. if (!String.IsNullOrEmpty(_defintionQuery))
  368. strSQL += this.DefinitionQuery + " AND ";
  369. strSQL += strGeom;
  370. using (OracleDataAdapter adapter = new OracleDataAdapter(strSQL, conn))
  371. {
  372. conn.Open();
  373. adapter.Fill(ds);
  374. conn.Close();
  375. if (ds.Tables.Count > 0)
  376. {
  377. FeatureDataTable fdt = new FeatureDataTable(ds.Tables[0]);
  378. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  379. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  380. fdt.Columns.Add(col.ColumnName, col.DataType, col.Expression);
  381. foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
  382. {
  383. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  384. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  385. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  386. fdr[col.ColumnName] = dr[col];
  387. fdr.Geometry = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr["sharpmap_tempgeometry"]);
  388. fdt.AddRow(fdr);
  389. }
  390. ds.Tables.Add(fdt);
  391. }
  392. }
  393. }
  394. }
  395. /// <summary>
  396. /// Convert WellKnownText to linestrings
  397. /// </summary>
  398. /// <param name="WKT"></param>
  399. /// <returns></returns>
  400. private SharpMap.Geometries.LineString WktToLineString(string WKT)
  401. {
  402. SharpMap.Geometries.LineString line = new SharpMap.Geometries.LineString();
  403. WKT = WKT.Substring(WKT.LastIndexOf('(') + 1).Split(')')[0];
  404. string[] strPoints = WKT.Split(',');
  405. foreach (string strPoint in strPoints)
  406. {
  407. string[] coord = strPoint.Split(' ');
  408. line.Vertices.Add(new SharpMap.Geometries.Point(double.Parse(coord[0], SharpMap.Map.numberFormat_EnUS), double.Parse(coord[1], SharpMap.Map.numberFormat_EnUS)));
  409. }
  410. return line;
  411. }
  412. /// <summary>
  413. /// Returns the number of features in the dataset
  414. /// </summary>
  415. /// <returns>number of features</returns>
  416. public int GetFeatureCount()
  417. {
  418. int count = 0;
  419. using (OracleConnection conn = new OracleConnection(_ConnectionString))
  420. {
  421. string strSQL = "SELECT COUNT(*) FROM " + this.Table;
  422. if (!String.IsNullOrEmpty(_defintionQuery))
  423. strSQL += " WHERE " + this.DefinitionQuery;
  424. using (OracleCommand command = new OracleCommand(strSQL, conn))
  425. {
  426. conn.Open();
  427. count = (int)command.ExecuteScalar();
  428. conn.Close();
  429. }
  430. }
  431. return count;
  432. }
  433. #region IProvider Members
  434. private string _defintionQuery;
  435. /// <summary>
  436. /// Definition query used for limiting dataset
  437. /// </summary>
  438. public string DefinitionQuery
  439. {
  440. get { return _defintionQuery; }
  441. set { _defintionQuery = value; }
  442. }
  443. /// <summary>
  444. /// Gets a collection of columns in the dataset
  445. /// </summary>
  446. public System.Data.DataColumnCollection Columns
  447. {
  448. get {
  449. throw new NotImplementedException();
  450. }
  451. }
  452. private int _srid=-2;
  453. /// <summary>
  454. /// Spacial Reference ID
  455. /// </summary>
  456. public int SRID
  457. {
  458. get {
  459. if (_srid == -2)
  460. {
  461. string strSQL = "select SRID from USER_SDO_GEOM_METADATA WHERE TABLE_NAME='" + this.Table + "'";
  462.                     
  463. using (OracleConnection conn = new OracleConnection(_ConnectionString))
  464. {
  465.                         using (OracleCommand command = new OracleCommand(strSQL, conn))
  466. {
  467. try
  468. {
  469. conn.Open();
  470. _srid = (int)(decimal)command.ExecuteScalar();
  471. conn.Close();
  472. }
  473. catch
  474. {
  475. _srid = -1;
  476. }
  477. }
  478. }
  479. }
  480. return _srid;
  481. }
  482. set {
  483. throw (new ApplicationException("Spatial Reference ID cannot by set on a Oracle table"));
  484. }
  485. }
  486. /// <summary>
  487. /// Queries the Oracle database to get the name of the Geometry Column. This is used if the columnname isn't specified in the constructor
  488. /// </summary>
  489. /// <remarks></remarks>
  490. /// <returns>Name of column containing geometry</returns>
  491. private string GetGeometryColumn()
  492. {
  493.             string strSQL = "select COLUMN_NAME from USER_SDO_GEOM_METADATA WHERE TABLE_NAME='" + this.Table + "'";
  494.             using (OracleConnection conn = new OracleConnection(_ConnectionString))
  495.             using (OracleCommand command = new OracleCommand(strSQL, conn))
  496. {
  497. conn.Open();
  498. object columnname = command.ExecuteScalar();
  499. conn.Close();
  500. if (columnname == System.DBNull.Value)
  501. throw new ApplicationException("Table '" + this.Table + "' does not contain a geometry column");
  502. return (string)columnname;
  503. }
  504. }
  505. /// <summary>
  506. /// Returns a datarow based on a RowID
  507. /// </summary>
  508. /// <param name="RowID"></param>
  509. /// <returns>datarow</returns>
  510. public SharpMap.Data.FeatureDataRow GetFeature(uint RowID)
  511. {
  512.             using (OracleConnection conn = new OracleConnection(_ConnectionString))
  513. {
  514.                 string strSQL = "select g.* , g." + this.GeometryColumn + ").Get_WKB() As sharpmap_tempgeometry from " + this.Table + " g WHERE " + this.ObjectIdColumn + "='" + RowID.ToString() + "'";
  515.                 using (OracleDataAdapter adapter = new OracleDataAdapter(strSQL, conn))
  516. {
  517. FeatureDataSet ds = new FeatureDataSet();
  518. conn.Open();
  519. adapter.Fill(ds);
  520. conn.Close();
  521. if (ds.Tables.Count > 0)
  522. {
  523. FeatureDataTable fdt = new FeatureDataTable(ds.Tables[0]);
  524. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  525. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  526. fdt.Columns.Add(col.ColumnName, col.DataType, col.Expression);
  527. if(ds.Tables[0].Rows.Count>0)
  528. {
  529. System.Data.DataRow dr = ds.Tables[0].Rows[0];
  530. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  531. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  532. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  533. fdr[col.ColumnName] = dr[col];
  534. fdr.Geometry = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr["sharpmap_tempgeometry"]);
  535. return fdr;
  536. }
  537. else
  538. return null;
  539. }
  540. else 
  541. return null;
  542. }
  543. }
  544. }
  545. /// <summary>
  546. /// Boundingbox of dataset
  547. /// </summary>
  548. /// <returns>boundingbox</returns>
  549. public SharpMap.Geometries.BoundingBox GetExtents()
  550. {
  551.             using (OracleConnection conn = new OracleConnection(_ConnectionString))
  552. {
  553.                 string strSQL = "SELECT SDO_AGGR_MBR(g." + this.GeometryColumn + ").Get_WKT() FROM " + this.Table + " g ";
  554. if (!String.IsNullOrEmpty(_defintionQuery))
  555. strSQL += " WHERE " + this.DefinitionQuery;
  556.                 using (OracleCommand command = new OracleCommand(strSQL, conn))
  557. {
  558. conn.Open();
  559. object result = command.ExecuteScalar();
  560. conn.Close();
  561. if (result == System.DBNull.Value)
  562. return null;
  563. string strBox = (string)result;
  564. if (strBox.StartsWith("POLYGON", StringComparison.InvariantCultureIgnoreCase))
  565. {
  566.                         strBox = strBox.Replace("POLYGON", "");                    
  567.                         strBox = strBox.Trim();
  568.                         strBox = strBox.Replace("(", "");
  569.                         strBox = strBox.Replace(")", "");
  570.                         List<double> xX = new List<double>();
  571.                         List<double> yY = new List<double>();
  572.                         String[] points = strBox.Split(',');
  573.                         String[] nums;
  574.                         string point;
  575.                         foreach (string s in points)
  576.                     {
  577.                             point = s.Trim();
  578.                             nums = point.Split(' ');
  579.                             xX.Add(double.Parse(nums[0], SharpMap.Map.numberFormat_EnUS));
  580.                             yY.Add(double.Parse(nums[1], SharpMap.Map.numberFormat_EnUS));
  581.                     }
  582.                         double minX = Double.MaxValue;
  583.                         double minY = Double.MaxValue;
  584.                         double maxX = Double.MinValue;
  585.                         double maxY = Double.MinValue;
  586.                         foreach (double d in xX) {
  587.                             if(d > maxX){
  588.                                 maxX = d;
  589.                             }
  590.                             if (d < minX) {
  591.                                 minX = d;
  592.                             }
  593.                         }
  594.                         foreach (double d in yY) {
  595.                             if (d > maxY) {
  596.                                 maxY = d;
  597.                             }
  598.                             if (d < minY) {
  599.                                 minY = d;
  600.                             }
  601.                         }
  602. return new SharpMap.Geometries.BoundingBox(minX, minY, maxX, maxY);
  603. }
  604. else
  605. return null;
  606. }
  607. }
  608. }
  609. /// <summary>
  610. /// Gets the connection ID of the datasource
  611. /// </summary>
  612. public string ConnectionID
  613. {
  614. get { return _ConnectionString; }
  615. }
  616. #endregion
  617. #region IProvider Members
  618. /// <summary>
  619. /// Returns all features with the view box
  620. /// </summary>
  621. /// <param name="bbox">view box</param>
  622. /// <param name="ds">FeatureDataSet to fill data into</param>
  623. [Obsolete("Use ExecuteIntersectionQuery(box) instead")]
  624. public void GetFeaturesInView(SharpMap.Geometries.BoundingBox bbox, SharpMap.Data.FeatureDataSet ds)
  625. {
  626. GetFeaturesInView(bbox, ds);
  627. }
  628. /// <summary>
  629. /// Returns all features with the view box
  630. /// </summary>
  631. /// <param name="bbox">view box</param>
  632. /// <param name="ds">FeatureDataSet to fill data into</param>
  633. public void ExecuteIntersectionQuery(SharpMap.Geometries.BoundingBox bbox, SharpMap.Data.FeatureDataSet ds)
  634. {
  635. List<Geometries.Geometry> features = new List<SharpMap.Geometries.Geometry>();
  636.             using (OracleConnection conn = new OracleConnection(_ConnectionString))
  637. {
  638.                 //Get bounding box string
  639.                 string strBbox = GetBoxFilterStr(bbox);
  640.                 string strSQL = "SELECT g.*, g." + this.GeometryColumn + ".Get_WKB() AS sharpmap_tempgeometry ";
  641. strSQL += "FROM " + this.Table + " g WHERE ";
  642. if (!String.IsNullOrEmpty(_defintionQuery))
  643. strSQL += this.DefinitionQuery + " AND ";
  644. strSQL += strBbox;
  645.                 using (OracleDataAdapter adapter = new OracleDataAdapter(strSQL, conn))
  646. {
  647. conn.Open();
  648. System.Data.DataSet ds2 = new System.Data.DataSet();
  649. adapter.Fill(ds2);
  650. conn.Close();
  651. if (ds2.Tables.Count > 0)
  652. {
  653. FeatureDataTable fdt = new FeatureDataTable(ds2.Tables[0]);
  654. foreach (System.Data.DataColumn col in ds2.Tables[0].Columns)
  655. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  656. fdt.Columns.Add(col.ColumnName,col.DataType,col.Expression);
  657. foreach (System.Data.DataRow dr in ds2.Tables[0].Rows)
  658. {
  659. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  660. foreach(System.Data.DataColumn col in ds2.Tables[0].Columns)
  661. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry")
  662. fdr[col.ColumnName] = dr[col];
  663. fdr.Geometry = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr["sharpmap_tempgeometry"]);
  664. fdt.AddRow(fdr);
  665. }
  666. ds.Tables.Add(fdt);
  667. }
  668. }
  669. }
  670. }
  671. #endregion
  672. }
  673. }