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

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. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with SharpMap; if not, write to the Free Software
  16. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  17. using System;
  18. using System.Collections.Generic;
  19. using System.Collections.ObjectModel;
  20. using System.Text;
  21. using SharpMap.Geometries;
  22. using SharpMap.Data;
  23. namespace SharpMap.Data.Providers
  24. {
  25. /// <summary>
  26. /// Datasource for storing a limited set of geometries.
  27. /// </summary>
  28. /// <remarks>
  29. /// <para>The GeometryProvider doesn抰 utilize performance optimizations of spatial indexing,
  30. /// and thus is primarily meant for rendering a limited set of Geometries.</para>
  31. /// <para>A common use of the GeometryProvider is for highlighting a set of selected features.</para>
  32. /// <example>
  33. /// The following example gets data within a BoundingBox of another datasource and adds it to the map.
  34. /// <code lang="C#">
  35. /// List&#60;Geometry&#62; geometries = myMap.Layers[0].DataSource.GetGeometriesInView(myBox);
  36. /// VectorLayer laySelected = new VectorLayer("Selected Features");
  37. /// laySelected.DataSource = new GeometryProvider(geometries);
  38. /// laySelected.Style.Outline = new Pen(Color.Magenta, 3f);
  39. /// laySelected.Style.EnableOutline = true;
  40. /// myMap.Layers.Add(laySelected);
  41. /// </code>
  42. /// </example>
  43. /// <example>
  44. /// Adding points of interest to the map. This is useful for vehicle tracking etc.
  45. /// <code lang="C#">
  46. /// List&#60;SharpMap.Geometries.Geometry&#62; geometries = new List&#60;SharpMap.Geometries.Geometry&#62;();
  47. /// //Add two points
  48. /// geometries.Add(new SharpMap.Geometries.Point(23.345,64.325));
  49. /// geometries.Add(new SharpMap.Geometries.Point(23.879,64.194));
  50. /// SharpMap.Layers.VectorLayer layerVehicles = new SharpMap.Layers.VectorLayer("Vechicles");
  51. /// layerVehicles.DataSource = new SharpMap.Data.Providers.GeometryProvider(geometries);
  52. /// layerVehicles.Style.Symbol = Bitmap.FromFile(@"C:datacar.gif");
  53. /// myMap.Layers.Add(layerVehicles);
  54. /// </code>
  55. /// </example>
  56. /// </remarks>
  57. public class GeometryProvider : SharpMap.Data.Providers.IProvider, IDisposable
  58. {
  59. private Collection<Geometry> _Geometries;
  60. /// <summary>
  61. /// Gets or sets the geometries this datasource contains
  62. /// </summary>
  63. public Collection<Geometry> Geometries
  64. {
  65. get { return _Geometries; }
  66. set { _Geometries = value; }
  67. }
  68. #region constructors
  69. /// <summary>
  70. /// Initializes a new instance of the <see cref="GeometryProvider"/>
  71. /// </summary>
  72. /// <param name="geometries">Set of geometries that this datasource should contain</param>
  73. public GeometryProvider(Collection<Geometry> geometries)
  74. {
  75. _Geometries = geometries;
  76. }
  77. /// <summary>
  78. /// Initializes a new instance of the <see cref="GeometryProvider"/>
  79. /// </summary>
  80. /// <param name="feature">Feature to be in this datasource</param>
  81. public GeometryProvider(FeatureDataRow feature)
  82. {
  83. _Geometries = new Collection<Geometry>();
  84. _Geometries.Add(feature.Geometry);
  85. }
  86. /// <summary>
  87. /// Initializes a new instance of the <see cref="GeometryProvider"/>
  88. /// </summary>
  89. /// <param name="features">Features to be included in this datasource</param>
  90. public GeometryProvider(FeatureDataTable features)
  91. {
  92. _Geometries = new Collection<Geometry>();
  93. for (int i = 0; i < features.Count;i++ )
  94. _Geometries.Add(features[i].Geometry);
  95. }
  96. /// <summary>
  97. /// Initializes a new instance of the <see cref="GeometryProvider"/>
  98. /// </summary>
  99. /// <param name="geometry">Geometry to be in this datasource</param>
  100. public GeometryProvider(Geometry geometry)
  101. {
  102. _Geometries = new Collection<Geometry>();
  103. _Geometries.Add(geometry);
  104. }
  105. /// <summary>
  106. /// Initializes a new instance of the <see cref="GeometryProvider"/>
  107. /// </summary>
  108. /// <param name="wellKnownBinaryGeometry"><see cref="SharpMap.Geometries.Geometry"/> as Well-known Binary to be included in this datasource</param>
  109. public GeometryProvider(byte[] wellKnownBinaryGeometry) : this(SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse(wellKnownBinaryGeometry))
  110. {
  111. }
  112. /// <summary>
  113. /// Initializes a new instance of the <see cref="GeometryProvider"/>
  114. /// </summary>
  115. /// <param name="wellKnownTextGeometry"><see cref="SharpMap.Geometries.Geometry"/> as Well-known Text to be included in this datasource</param>
  116. public GeometryProvider(string wellKnownTextGeometry) : this(SharpMap.Converters.WellKnownText.GeometryFromWKT.Parse(wellKnownTextGeometry))
  117. {
  118. }
  119. #endregion
  120. #region IProvider Members
  121. /// <summary>
  122. /// Returns features within the specified bounding box
  123. /// </summary>
  124. /// <param name="bbox"></param>
  125. /// <returns></returns>
  126. public Collection<Geometry> GetGeometriesInView(BoundingBox bbox)
  127. {
  128. Collection<Geometry> list = new Collection<Geometry>();
  129. for (int i = 0; i < _Geometries.Count; i++)
  130. if(!_Geometries[i].IsEmpty())
  131. if (_Geometries[i].GetBoundingBox().Intersects(bbox))
  132. list.Add(_Geometries[i]);
  133. return list;
  134. }
  135. /// <summary>
  136. /// Returns all objects whose boundingbox intersects 'bbox'.
  137. /// </summary>
  138. /// <param name="bbox"></param>
  139. /// <returns></returns>
  140. public Collection<uint> GetObjectIDsInView(BoundingBox bbox)
  141. {
  142. Collection<uint> list = new Collection<uint>();
  143. for (int i = 0; i < _Geometries.Count; i++)
  144. if(_Geometries[i].GetBoundingBox().Intersects(bbox))
  145. list.Add((uint)i);
  146. return list;
  147. }
  148. /// <summary>
  149. /// Returns the geometry corresponding to the Object ID
  150. /// </summary>
  151. /// <param name="oid">Object ID</param>
  152. /// <returns>geometry</returns>
  153. public Geometry GetGeometryByID(uint oid)
  154. {
  155. return _Geometries[(int)oid];
  156. }
  157. /// <summary>
  158. /// Throws an NotSupportedException. Attribute data is not supported by this datasource
  159. /// </summary>
  160. /// <param name="geom"></param>
  161. /// <param name="ds">FeatureDataSet to fill data into</param>
  162. public void ExecuteIntersectionQuery(Geometry geom, FeatureDataSet ds)
  163. {
  164. throw new NotSupportedException("Attribute data is not supported by the GeometryProvider.");
  165. }
  166. /// <summary>
  167. /// Throws an NotSupportedException. Attribute data is not supported by this datasource
  168. /// </summary>
  169. /// <param name="box"></param>
  170. /// <param name="ds">FeatureDataSet to fill data into</param>
  171. public void ExecuteIntersectionQuery(SharpMap.Geometries.BoundingBox box, FeatureDataSet ds)
  172. {
  173. throw new NotSupportedException("Attribute data is not supported by the GeometryProvider.");
  174. }
  175. /// <summary>
  176. /// Returns the number of features in the dataset
  177. /// </summary>
  178. /// <returns>number of features</returns>
  179. public int GetFeatureCount()
  180. {
  181. return _Geometries.Count;
  182. }
  183. /// <summary>
  184. /// Throws an NotSupportedException. Attribute data is not supported by this datasource
  185. /// </summary>
  186. /// <param name="RowID"></param>
  187. /// <returns></returns>
  188. public FeatureDataRow GetFeature(uint RowID)
  189. {
  190. throw new NotSupportedException("Attribute data is not supported by the GeometryProvider.");
  191. }
  192. /// <summary>
  193. /// Boundingbox of dataset
  194. /// </summary>
  195. /// <returns>boundingbox</returns>
  196. public BoundingBox GetExtents()
  197. {
  198. if (_Geometries.Count == 0)
  199. return null;
  200. BoundingBox box = null;// _Geometries[0].GetBoundingBox();
  201. for (int i = 0; i < _Geometries.Count; i++)
  202. if (!_Geometries[i].IsEmpty())
  203. box = box==null ? _Geometries[i].GetBoundingBox() : box.Join(_Geometries[i].GetBoundingBox());
  204. return box;
  205. }
  206. /// <summary>
  207. /// Gets the connection ID of the datasource
  208. /// </summary>
  209. /// <remarks>
  210. /// The ConnectionID is meant for Connection Pooling which doesn't apply to this datasource. Instead
  211. /// <c>String.Empty</c> is returned.
  212. /// </remarks>
  213. public string ConnectionID
  214. {
  215. get { return String.Empty; }
  216. }
  217. /// <summary>
  218. /// Opens the datasource
  219. /// </summary>
  220. public void Open()
  221. {
  222. //Do nothing;
  223. }
  224. /// <summary>
  225. /// Closes the datasource
  226. /// </summary>
  227. public void Close()
  228. {
  229. //Do nothing;
  230. }
  231. /// <summary>
  232. /// Returns true if the datasource is currently open
  233. /// </summary>
  234. public bool IsOpen
  235. {
  236. get { return true; }
  237. }
  238. #endregion
  239. private int _SRID = -1;
  240. /// <summary>
  241. /// The spatial reference ID (CRS)
  242. /// </summary>
  243. public int SRID
  244. {
  245. get { return _SRID; }
  246. set { _SRID = value; }
  247. }
  248. #region IDisposable Members
  249. /// <summary>
  250. /// Disposes the object
  251. /// </summary>
  252. public void Dispose()
  253. {
  254. _Geometries = null;
  255. }
  256. #endregion
  257. }
  258. }