LineString.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 LineString is a Curve with linear interpolation between points. Each consecutive pair of points defines a
  24. /// line segment.
  25. /// </summary>
  26. [Serializable]
  27. public class LineString : Curve
  28. {
  29. private Collection<Point> _Vertices;
  30. /// <summary>
  31. /// Initializes an instance of a LineString from a set of vertices
  32. /// </summary>
  33. /// <param name="vertices"></param>
  34. public LineString(Collection<Point> vertices)
  35. {
  36. _Vertices = vertices;
  37. }
  38. /// <summary>
  39. /// Initializes an instance of a LineString
  40. /// </summary>
  41. public LineString() : this(new Collection<Point>()) { }
  42. /// <summary>
  43. /// Gets or sets the collection of vertices in this Geometry
  44. /// </summary>
  45. public virtual Collection<Point> Vertices
  46. {
  47. get { return _Vertices; }
  48. set { _Vertices = value; }
  49. }
  50. #region OpenGIS Methods
  51. /// <summary>
  52. /// Returns the specified point N in this Linestring.
  53. /// </summary>
  54. /// <remarks>This method is supplied as part of the OpenGIS Simple Features Specification</remarks>
  55. /// <param name="N"></param>
  56. /// <returns></returns>
  57. public Point Point(int N)
  58. {
  59. return _Vertices[N];
  60. }
  61. /// <summary>
  62. /// The number of points in this LineString.
  63. /// </summary>
  64. /// <remarks>This method is supplied as part of the OpenGIS Simple Features Specification</remarks>
  65. public virtual int NumPoints
  66. {
  67. get { return _Vertices.Count; }
  68. }
  69. #endregion
  70. /// <summary>
  71. /// Transforms the linestring to image coordinates, based on the map
  72. /// </summary>
  73. /// <param name="map">Map to base coordinates on</param>
  74. /// <returns>Linestring in image coordinates</returns>
  75. public System.Drawing.PointF[] TransformToImage(Map map)
  76. {
  77. System.Drawing.PointF[] v = new System.Drawing.PointF[_Vertices.Count];
  78. for (int i = 0; i < this.Vertices.Count; i++)
  79. v[i] = SharpMap.Utilities.Transform.WorldtoMap(_Vertices[i], map);
  80. return v;
  81. }
  82. #region "Inherited methods from abstract class Geometry"
  83. /// <summary>
  84. /// Checks whether this instance is spatially equal to the LineString 'l'
  85. /// </summary>
  86. /// <param name="l">LineString to compare to</param>
  87. /// <returns>true of the objects are spatially equal</returns>
  88. public bool Equals(LineString l)
  89. {
  90. if (l == null)
  91. return false;
  92. if (l.Vertices.Count != this.Vertices.Count)
  93. return false;
  94. for(int i = 0; i < l.Vertices.Count; i++)
  95. if (!l.Vertices[i].Equals(this.Vertices[i]))
  96. return false;
  97. return true;
  98. }
  99. /// <summary>
  100. /// Serves as a hash function for a particular type. <see cref="GetHashCode"/> is suitable for use 
  101. /// in hashing algorithms and data structures like a hash table.
  102. /// </summary>
  103. /// <returns>A hash code for the current <see cref="GetHashCode"/>.</returns>
  104. public override int GetHashCode()
  105. {
  106. int hash = 0;
  107. for (int i = 0; i < Vertices.Count; i++)
  108. hash = hash ^ Vertices[i].GetHashCode();
  109. return hash;
  110. }
  111. /// <summary>
  112. /// If true, then this Geometry represents the empty point set,