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

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. using System;
  17. using System.Collections.Generic;
  18. using System.Collections.ObjectModel;
  19. using System.Text;
  20. using SharpMap.Geometries;
  21. namespace SharpMap.Layers
  22. {
  23. /// <summary>
  24. /// Class for vector layer properties
  25. /// </summary>
  26. /// <example>
  27. /// Adding a VectorLayer to a map:
  28. /// <code lang="C#">
  29. /// //Initialize a new map
  30. /// SharpMap.Map myMap = new SharpMap.Map(new System.Drawing.Size(300,600));
  31. /// //Create a layer
  32. /// SharpMap.Layers.VectorLayer myLayer = new SharpMap.Layers.VectorLayer("My layer");
  33. /// //Add datasource
  34. /// myLayer.DataSource = new SharpMap.Data.Providers.ShapeFile(@"C:dataMyShapeData.shp");
  35. /// //Set up styles
  36. /// myLayer.Style.Outline = new Pen(Color.Magenta, 3f);
  37. /// myLayer.Style.EnableOutline = true;
  38. /// myMap.Layers.Add(myLayer);
  39. /// //Zoom to fit the data in the view
  40. /// myMap.ZoomToExtents();
  41. /// //Render the map:
  42. /// System.Drawing.Image mapImage = myMap.GetMap();
  43. /// </code>
  44. /// </example>
  45. public class VectorLayer : Layer, IDisposable
  46. {
  47. /// <summary>
  48. /// Initializes a new layer
  49. /// </summary>
  50. /// <param name="layername">Name of layer</param>
  51. public VectorLayer(string layername)
  52. {
  53. this.Style = new SharpMap.Styles.VectorStyle();
  54. this.LayerName = layername;
  55. this.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
  56. }
  57. /// <summary>
  58. /// Initializes a new layer with a specified datasource
  59. /// </summary>
  60. /// <param name="layername">Name of layer</param>
  61. /// <param name="dataSource">Data source</param>
  62. public VectorLayer(string layername, SharpMap.Data.Providers.IProvider dataSource) : this(layername)
  63. {
  64. _DataSource = dataSource;
  65. }
  66. private SharpMap.Rendering.Thematics.ITheme _theme;
  67. /// <summary>
  68. /// Gets or sets thematic settings for the layer. Set to null to ignore thematics
  69. /// </summary>
  70. public SharpMap.Rendering.Thematics.ITheme Theme
  71. {
  72. get { return _theme; }
  73. set { _theme = value; }
  74. }
  75. private bool _ClippingEnabled = false;
  76. /// <summary>
  77. /// Specifies whether polygons should be clipped prior to rendering
  78. /// </summary>
  79. /// <remarks>
  80. /// <para>Clipping will clip <see cref="SharpMap.Geometries.Polygon"/> and
  81. /// <see cref="SharpMap.Geometries.MultiPolygon"/> to the current view prior
  82. /// to rendering the object.</para>
  83. /// <para>Enabling clipping might improve rendering speed if you are rendering 
  84. /// only small portions of very large objects.</para>
  85. /// </remarks>
  86. public bool ClippingEnabled
  87. {
  88. get { return _ClippingEnabled; }
  89. set { _ClippingEnabled = value; }
  90. }
  91. private System.Drawing.Drawing2D.SmoothingMode _SmoothingMode;
  92. /// <summary>
  93. /// Render whether smoothing (antialiasing) is applied to lines and curves and the edges of filled areas
  94. /// </summary>
  95. public System.Drawing.Drawing2D.SmoothingMode SmoothingMode
  96. {
  97. get { return _SmoothingMode; }
  98. set { _SmoothingMode = value; }
  99. }
  100. private SharpMap.Data.Providers.IProvider _DataSource;
  101. /// <summary>
  102. /// Gets or sets the datasource
  103. /// </summary>
  104. public SharpMap.Data.Providers.IProvider DataSource
  105. {
  106. get { return _DataSource; }
  107. set { _DataSource = value; }
  108. }
  109. private Styles.VectorStyle _Style;
  110. /// <summary>
  111. /// Gets or sets the rendering style of the vector layer.
  112. /// </summary>
  113. public Styles.VectorStyle Style
  114. {
  115. get { return _Style; }
  116. set { _Style = value; }
  117. }
  118. #region ILayer Members
  119. /// <summary>
  120. /// Renders the layer to a graphics object
  121. /// </summary>
  122. /// <param name="g">Graphics object reference</param>
  123. /// <param name="map">Map which is rendered</param>
  124. public override void Render(System.Drawing.Graphics g, Map map)
  125. {
  126. if (map.Center == null)
  127. throw (new ApplicationException("Cannot render map. View center not specified"));
  128. g.SmoothingMode = this.SmoothingMode;
  129. SharpMap.Geometries.BoundingBox envelope = map.Envelope; //View to render
  130. if (this.CoordinateTransformation != null)
  131. envelope = SharpMap.CoordinateSystems.Transformations.GeometryTransform.TransformBox(envelope, this.CoordinateTransformation.MathTransform.Inverse());
  132. //List<SharpMap.Geometries.Geometry> features = this.DataSource.GetGeometriesInView(map.Envelope);
  133. if (this.DataSource == null)
  134. throw (new ApplicationException("DataSource property not set on layer '" + this.LayerName + "'"));
  135. //If thematics is enabled, we use a slighty different rendering approach
  136. if (this.Theme != null) 
  137. {
  138. SharpMap.Data.FeatureDataSet ds = new SharpMap.Data.FeatureDataSet();
  139. this.DataSource.Open();
  140. this.DataSource.ExecuteIntersectionQuery(envelope, ds);
  141. this.DataSource.Close();
  142. SharpMap.Data.FeatureDataTable features = (SharpMap.Data.FeatureDataTable)ds.Tables[0];
  143. if (this.CoordinateTransformation != null)
  144. for (int i = 0; i < features.Count; i++)
  145. features[i].Geometry = SharpMap.CoordinateSystems.Transformations.GeometryTransform.TransformGeometry(features[i].Geometry, this.CoordinateTransformation.MathTransform);
  146. //Linestring outlines is drawn by drawing the layer once with a thicker line
  147. //before drawing the "inline" on top.
  148. if (Style.EnableOutline)
  149. {
  150. //foreach (SharpMap.Geometries.Geometry feature in features)
  151. for (int i = 0; i < features.Count; i++)
  152. {
  153. SharpMap.Data.FeatureDataRow feature = features[i];
  154. //Draw background of all line-outlines first
  155. if(feature.Geometry is SharpMap.Geometries.LineString)
  156. {
  157. SharpMap.Styles.VectorStyle outlinestyle1 = this.Theme.GetStyle(feature) as SharpMap.Styles.VectorStyle;
  158. if (outlinestyle1.Enabled && outlinestyle1.EnableOutline)
  159. SharpMap.Rendering.VectorRenderer.DrawLineString(g, feature.Geometry as LineString, outlinestyle1.Outline, map);
  160. }
  161. else if(feature.Geometry is SharpMap.Geometries.MultiLineString)
  162. {
  163. SharpMap.Styles.VectorStyle outlinestyle2 = this.Theme.GetStyle(feature) as SharpMap.Styles.VectorStyle;
  164. if (outlinestyle2.Enabled && outlinestyle2.EnableOutline)
  165. SharpMap.Rendering.VectorRenderer.DrawMultiLineString(g, feature.Geometry as MultiLineString, outlinestyle2.Outline, map);
  166. }
  167. }
  168. }
  169. for(int i=0;i<features.Count;i++)
  170. {
  171. SharpMap.Data.FeatureDataRow feature = features[i];
  172. SharpMap.Styles.VectorStyle style = this.Theme.GetStyle(feature) as SharpMap.Styles.VectorStyle;
  173. RenderGeometry(g, map, feature.Geometry, style);
  174. }
  175. }
  176. else
  177. {
  178. this.DataSource.Open();
  179. Collection<SharpMap.Geometries.Geometry> geoms = this.DataSource.GetGeometriesInView(envelope);
  180. this.DataSource.Close();
  181. if (this.CoordinateTransformation != null)
  182. for (int i = 0; i < geoms.Count; i++)
  183. geoms[i] = SharpMap.CoordinateSystems.Transformations.GeometryTransform.TransformGeometry(geoms[i], this.CoordinateTransformation.MathTransform);
  184. //Linestring outlines is drawn by drawing the layer once with a thicker line
  185. //before drawing the "inline" on top.
  186. if (this.Style.EnableOutline)
  187. {
  188. foreach (SharpMap.Geometries.Geometry geom in geoms)
  189. {
  190. if (geom != null)
  191. {
  192. //Draw background of all line-outlines first
  193. switch (geom.GetType().FullName)
  194. {
  195. case "SharpMap.Geometries.LineString":
  196. SharpMap.Rendering.VectorRenderer.DrawLineString(g, geom as LineString, this.Style.Outline, map);
  197. break;
  198. case "SharpMap.Geometries.MultiLineString":
  199. SharpMap.Rendering.VectorRenderer.DrawMultiLineString(g, geom as MultiLineString, this.Style.Outline, map);
  200. break;
  201. default:
  202. break;
  203. }
  204. }
  205. }
  206. }
  207. for (int i = 0; i < geoms.Count; i++)
  208. {
  209. if(geoms[i]!=null)
  210. RenderGeometry(g, map, geoms[i], this.Style);
  211. }
  212. }
  213. base.Render(g, map);
  214. }
  215. private void RenderGeometry(System.Drawing.Graphics g, Map map, Geometry feature, SharpMap.Styles.VectorStyle style)
  216. {
  217. switch (feature.GetType().FullName)
  218. {
  219. case "SharpMap.Geometries.Polygon":
  220. if (style.EnableOutline)
  221. SharpMap.Rendering.VectorRenderer.DrawPolygon(g, (Polygon)feature, style.Fill, style.Outline, _ClippingEnabled, map);
  222. else
  223. SharpMap.Rendering.VectorRenderer.DrawPolygon(g, (Polygon)feature, style.Fill, null, _ClippingEnabled, map);
  224. break;
  225. case "SharpMap.Geometries.MultiPolygon":
  226. if (style.EnableOutline)
  227. SharpMap.Rendering.VectorRenderer.DrawMultiPolygon(g, (MultiPolygon)feature, style.Fill, style.Outline, _ClippingEnabled, map);
  228. else
  229. SharpMap.Rendering.VectorRenderer.DrawMultiPolygon(g, (MultiPolygon)feature, style.Fill, null, _ClippingEnabled, map);
  230. break;
  231. case "SharpMap.Geometries.LineString":
  232. SharpMap.Rendering.VectorRenderer.DrawLineString(g, (LineString)feature, style.Line, map);
  233. break;
  234. case "SharpMap.Geometries.MultiLineString":
  235. SharpMap.Rendering.VectorRenderer.DrawMultiLineString(g, (MultiLineString)feature, style.Line, map);
  236. break;
  237. case "SharpMap.Geometries.Point":
  238. SharpMap.Rendering.VectorRenderer.DrawPoint(g, (Point)feature, style.Symbol, style.SymbolScale, style.SymbolOffset, style.SymbolRotation, map);
  239. break;
  240. case "SharpMap.Geometries.MultiPoint":
  241. SharpMap.Rendering.VectorRenderer.DrawMultiPoint(g, (MultiPoint)feature, style.Symbol, style.SymbolScale, style.SymbolOffset, style.SymbolRotation, map);
  242. break;
  243. case "SharpMap.Geometries.GeometryCollection":
  244. foreach(Geometries.Geometry geom in (GeometryCollection)feature)
  245. RenderGeometry(g, map, geom, style);
  246. break;
  247. default:
  248. break;
  249. }
  250. }
  251. /// <summary>
  252. /// Returns the extent of the layer
  253. /// </summary>
  254. /// <returns>Bounding box corresponding to the extent of the features in the layer</returns>
  255. public override BoundingBox Envelope
  256. {
  257. get
  258. {
  259. if (this.DataSource == null)
  260. throw (new ApplicationException("DataSource property not set on layer '" + this.LayerName + "'"));
  261. bool wasOpen = this.DataSource.IsOpen;
  262. if (!wasOpen)
  263. this.DataSource.Open();
  264. SharpMap.Geometries.BoundingBox box = this.DataSource.GetExtents();
  265. if (!wasOpen) //Restore state
  266. this.DataSource.Close();
  267. if (this.CoordinateTransformation != null)
  268. return SharpMap.CoordinateSystems.Transformations.GeometryTransform.TransformBox(box, this.CoordinateTransformation.MathTransform);
  269. return box;
  270. }
  271. }
  272. #endregion
  273. /// <summary>
  274. /// Gets or sets the SRID of this VectorLayer's data source
  275. /// </summary>
  276. public override int SRID
  277. {
  278. get {
  279. if (this.DataSource == null)
  280. throw (new ApplicationException("DataSource property not set on layer '" + this.LayerName + "'"));
  281. return this.DataSource.SRID; }
  282. set { this.DataSource.SRID = value; }
  283. }
  284. #region ICloneable Members
  285. /// <summary>
  286. /// Clones the layer
  287. /// </summary>
  288. /// <returns>cloned object</returns>
  289. public override object Clone()
  290. {
  291. throw new NotImplementedException();
  292. }
  293. #endregion
  294. #region IDisposable Members
  295. /// <summary>
  296. /// Disposes the object
  297. /// </summary>
  298. public void Dispose()
  299. {
  300. if(DataSource is IDisposable)
  301. ((IDisposable)DataSource).Dispose();
  302. }
  303. #endregion
  304. }
  305. }