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

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. namespace SharpMap.Geometries
  21. {
  22. /// <summary>
  23. /// A Polygon is a planar Surface, defined by 1 exterior boundary and 0 or more interior boundaries. Each
  24. /// interior boundary defines a hole in the Polygon.
  25. /// </summary>
  26. /// <remarks>
  27. /// Vertices of rings defining holes in polygons are in the opposite direction of the exterior ring.
  28. /// </remarks>
  29. [Serializable]
  30. public class Polygon : Surface
  31. {
  32. private LinearRing _ExteriorRing;
  33. private Collection<LinearRing> _InteriorRings;
  34. /// <summary>
  35. /// Instatiates a polygon based on one extorier ring and a collection of interior rings.
  36. /// </summary>
  37. /// <param name="exteriorRing">Exterior ring</param>
  38. /// <param name="interiorRings">Interior rings</param>
  39. public Polygon(LinearRing exteriorRing, Collection<LinearRing> interiorRings)
  40. {
  41. _ExteriorRing = exteriorRing;
  42. _InteriorRings = interiorRings;
  43. }
  44. /// <summary>
  45. /// Instatiates a polygon based on one extorier ring.
  46. /// </summary>
  47. /// <param name="exteriorRing">Exterior ring</param>
  48. public Polygon(LinearRing exteriorRing) : this(exteriorRing, new Collection<LinearRing>()) { }
  49. /// <summary>
  50. /// Instatiates a polygon
  51. /// </summary>
  52. public Polygon() : this(new LinearRing(), new Collection<LinearRing>()) { }
  53. /// <summary>
  54. /// Gets or sets the exterior ring of this Polygon
  55. /// </summary>
  56. /// <remarks>This method is supplied as part of the OpenGIS Simple Features Specification</remarks>
  57. public LinearRing ExteriorRing
  58. {
  59. get { return _ExteriorRing; }
  60. set { _ExteriorRing = value; }
  61. }
  62. /// <summary>
  63. /// Gets or sets the interior rings of this Polygon
  64. /// </summary>
  65. public Collection<LinearRing> InteriorRings
  66. {
  67. get { return _InteriorRings; }
  68. set { _InteriorRings = value; }
  69. }
  70. /// <summary>
  71. /// Returns the Nth interior ring for this Polygon as a LineString
  72. /// </summary>
  73. /// <remarks>This method is supplied as part of the OpenGIS Simple Features Specification</remarks>
  74. /// <param name="N"></param>
  75. /// <returns></returns>
  76. public LinearRing InteriorRing(int N)
  77. {
  78. return _InteriorRings[N];
  79. }
  80. /// <summary>
  81. /// Returns the number of interior rings in this Polygon
  82. /// </summary>
  83. /// <remarks>This method is supplied as part of the OpenGIS Simple Features Specification</remarks>
  84. /// <returns></returns>
  85. public int NumInteriorRing
  86. {
  87. get { return _InteriorRings.Count; }
  88. }
  89. /// <summary>
  90. /// Transforms the polygon to image coordinates, based on the map
  91. /// </summary>
  92. /// <param name="map">Map to base coordinates on</param>
  93. /// <returns>Polygon in image coordinates</returns>
  94. public System.Drawing.PointF[] TransformToImage(SharpMap.Map map)
  95. {
  96. int vertices = _ExteriorRing.Vertices.Count;
  97. for (int i = 0; i < _InteriorRings.Count;i++)
  98. vertices += _InteriorRings[i].Vertices.Count;
  99. System.Drawing.PointF[] v = new System.Drawing.PointF[vertices];
  100. for (int i = 0; i < _ExteriorRing.Vertices.Count; i++)
  101. v[i] = SharpMap.Utilities.Transform.WorldtoMap(_ExteriorRing.Vertices[i], map);
  102. int j = _ExteriorRing.Vertices.Count;
  103. for (int k = 0; k < _InteriorRings.Count;k++)
  104. {
  105. for (int i = 0; i < _InteriorRings[k].Vertices.Count; i++)
  106. v[j + i] = SharpMap.Utilities.Transform.WorldtoMap(_InteriorRings[k].Vertices[i], map);
  107. j += _InteriorRings[k].Vertices.Count;
  108. }
  109. return v;
  110. }
  111. #region "Inherited methods from abstract class Geometry"
  112. /// <summary>
  113. /// Determines if this Polygon and the specified Polygon object has the same values
  114. /// </summary>
  115. /// <param name="p">Polygon to compare with</param>
  116. /// <returns></returns>
  117. public bool Equals(Polygon p)
  118. {
  119. if (p == null)
  120. return false;
  121. if (!p.ExteriorRing.Equals(this.ExteriorRing))
  122. return false;
  123. if (p.InteriorRings.Count != this.InteriorRings.Count)
  124. return false;
  125. for (int i = 0; i < p.InteriorRings.Count; i++)
  126. if (!p.InteriorRings[i].Equals(this.InteriorRings[i]))
  127. return false;
  128. return true;
  129. }
  130. /// <summary>
  131. /// Serves as a hash function for a particular type. <see cref="GetHashCode"/> is suitable for use 
  132. /// in hashing algorithms and data structures like a hash table.
  133. /// </summary>
  134. /// <returns>A hash code for the current <see cref="GetHashCode"/>.</returns>
  135. public override int GetHashCode()
  136. {
  137. int hash = ExteriorRing.GetHashCode(); ;
  138. for (int i = 0; i < InteriorRings.Count; i++)
  139. hash = hash ^ InteriorRings[i].GetHashCode();
  140. return hash;
  141. }
  142. /// <summary>
  143. /// If true, then this Geometry represents the empty point set,