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

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.CoordinateSystems
  21. {
  22. /// <summary>
  23. /// A coordinate system based on latitude and longitude. 
  24. /// </summary>
  25. /// <remarks>
  26. /// Some geographic coordinate systems are Lat/Lon, and some are Lon/Lat. 
  27. /// You can find out which this is by examining the axes. You should also 
  28. /// check the angular units, since not all geographic coordinate systems 
  29. /// use degrees.
  30. /// </remarks>
  31. public class GeographicCoordinateSystem : HorizontalCoordinateSystem, IGeographicCoordinateSystem
  32. {
  33. /// <summary>
  34. /// Creates an instance of a Geographic Coordinate System
  35. /// </summary>
  36. /// <param name="angularUnit">Angular units</param>
  37. /// <param name="horizontalDatum">Horizontal datum</param>
  38. /// <param name="primeMeridian">Prime meridian</param>
  39. /// <param name="axisInfo">Axis info</param>
  40. /// <param name="name">Name</param>
  41. /// <param name="authority">Authority name</param>
  42. /// <param name="authorityCode">Authority-specific identification code.</param>
  43. /// <param name="alias">Alias</param>
  44. /// <param name="abbreviation">Abbreviation</param>
  45. /// <param name="remarks">Provider-supplied remarks</param>
  46. internal GeographicCoordinateSystem(IAngularUnit angularUnit, IHorizontalDatum horizontalDatum, IPrimeMeridian primeMeridian, Collection<AxisInfo> axisInfo, string name, string authority, long authorityCode, string alias, string abbreviation, string remarks)
  47. :
  48. base(horizontalDatum, axisInfo, name, authority, authorityCode, alias, abbreviation, remarks)
  49. {
  50. _AngularUnit = angularUnit;
  51. _PrimeMeridian = primeMeridian;
  52. }
  53. #region Predefined geographic coordinate systems
  54. /// <summary>
  55. /// Creates a decimal degrees geographic coordinate system based on the WGS84 ellipsoid, suitable for GPS measurements
  56. /// </summary>
  57. public static GeographicCoordinateSystem WGS84
  58. {
  59. get {
  60.                 //Collection<AxisInfo> axes = new Collection<AxisInfo>(2);
  61.                 Collection<AxisInfo> axes = new Collection<AxisInfo>();
  62. axes.Add(new AxisInfo("Lon", AxisOrientationEnum.East));
  63. axes.Add(new AxisInfo("Lat", AxisOrientationEnum.North));
  64. return new GeographicCoordinateSystem(SharpMap.CoordinateSystems.AngularUnit.Degrees,
  65. SharpMap.CoordinateSystems.HorizontalDatum.WGS84, SharpMap.CoordinateSystems.PrimeMeridian.Greenwich, axes,
  66. "WGS 84", "EPSG", 4326, String.Empty, string.Empty, string.Empty);
  67. }
  68. }
  69. #endregion
  70. #region IGeographicCoordinateSystem Members
  71. private IAngularUnit _AngularUnit;
  72. /// <summary>
  73. /// Gets or sets the angular units of the geographic coordinate system.
  74. /// </summary>
  75. public IAngularUnit AngularUnit
  76. {
  77. get { return _AngularUnit; }
  78. set { _AngularUnit = value; }
  79. }
  80. /// <summary>
  81. /// Gets units for dimension within coordinate system. Each dimension in 
  82. /// the coordinate system has corresponding units.
  83. /// </summary>
  84. /// <param name="dimension">Dimension</param>
  85. /// <returns>Unit</returns>
  86. public override IUnit GetUnits(int dimension)
  87. {
  88. return _AngularUnit;
  89. }
  90. private IPrimeMeridian _PrimeMeridian;
  91. /// <summary>
  92. /// Gets or sets the prime meridian of the geographic coordinate system.
  93. /// </summary>
  94. public IPrimeMeridian PrimeMeridian
  95. {
  96. get { return _PrimeMeridian; }
  97. set { _PrimeMeridian = value; }
  98. }
  99. /// <summary>
  100. /// Gets the number of available conversions to WGS84 coordinates.
  101. /// </summary>
  102. public int NumConversionToWGS84
  103. {
  104. get { return _WGS84ConversionInfo.Count; }
  105. }
  106. private List<Wgs84ConversionInfo> _WGS84ConversionInfo;
  107. internal List<Wgs84ConversionInfo> WGS84ConversionInfo
  108. {
  109. get { return _WGS84ConversionInfo; }
  110. set { _WGS84ConversionInfo = value; }
  111. }
  112. /// <summary>
  113. /// Gets details on a conversion to WGS84.
  114. /// </summary>
  115. public Wgs84ConversionInfo GetWgs84ConversionInfo(int index)
  116. {
  117. return _WGS84ConversionInfo[index];
  118. }
  119. /// <summary>
  120. /// Returns the Well-known text for this object
  121. /// as defined in the simple features specification.
  122. /// </summary>
  123. public override string WKT
  124. {
  125. get
  126. {
  127. StringBuilder sb = new StringBuilder();
  128. sb.AppendFormat("GEOGCS["{0}", {1}, {2}, {3}",Name, HorizontalDatum.WKT, PrimeMeridian.WKT, AngularUnit.WKT);
  129. //Skip axis info if they contain default values
  130. if (AxisInfo.Count != 2 ||
  131. AxisInfo[0].Name != "Lon" || AxisInfo[0].Orientation != AxisOrientationEnum.East ||
  132. AxisInfo[1].Name != "Lat" || AxisInfo[1].Orientation != AxisOrientationEnum.North)
  133. for (int i = 0; i < AxisInfo.Count; i++)
  134. sb.AppendFormat(", {0}", GetAxis(i).WKT);
  135. if (!String.IsNullOrEmpty(Authority) && AuthorityCode > 0)
  136. sb.AppendFormat(", AUTHORITY["{0}", "{1}"]", Authority, AuthorityCode);
  137. sb.Append("]");
  138. return sb.ToString();
  139. }
  140. }
  141. /// <summary>
  142. /// Gets an XML representation of this object
  143. /// </summary>
  144. public override string XML
  145. {
  146. get
  147. {
  148. StringBuilder sb = new StringBuilder();
  149. sb.AppendFormat(SharpMap.Map.numberFormat_EnUS,
  150. "<CS_CoordinateSystem Dimension="{0}"><CS_GeographicCoordinateSystem>{1}",
  151. this.Dimension, InfoXml);
  152. foreach(AxisInfo ai in this.AxisInfo)
  153. sb.Append(ai.XML);
  154. sb.AppendFormat("{0}{1}{2}</CS_GeographicCoordinateSystem></CS_CoordinateSystem>",
  155. HorizontalDatum.XML, AngularUnit.XML, PrimeMeridian.XML);
  156. return sb.ToString();
  157. }
  158. }
  159. /// <summary>
  160. /// Checks whether the values of this instance is equal to the values of another instance.
  161. /// Only parameters used for coordinate system are used for comparison.
  162. /// Name, abbreviation, authority, alias and remarks are ignored in the comparison.
  163. /// </summary>
  164. /// <param name="obj"></param>
  165. /// <returns>True if equal</returns>
  166. public override bool EqualParams(object obj)
  167. {
  168. if (!(obj is GeographicCoordinateSystem))
  169. return false;
  170. GeographicCoordinateSystem gcs = obj as GeographicCoordinateSystem;
  171. if (gcs.Dimension != this.Dimension) return false;
  172. if (this.WGS84ConversionInfo != null && gcs.WGS84ConversionInfo == null) return false;
  173. if (this.WGS84ConversionInfo == null && gcs.WGS84ConversionInfo != null) return false;
  174. if (this.WGS84ConversionInfo != null && gcs.WGS84ConversionInfo != null)
  175. {
  176. if (this.WGS84ConversionInfo.Count != gcs.WGS84ConversionInfo.Count) return false;
  177. for (int i = 0; i < this.WGS84ConversionInfo.Count; i++)
  178. if (!gcs.WGS84ConversionInfo[i].Equals(this.WGS84ConversionInfo[i]))
  179. return false;
  180. }
  181. if (this.AxisInfo.Count != gcs.AxisInfo.Count) return false;
  182. for (int i = 0; i < gcs.AxisInfo.Count; i++)
  183. if (gcs.AxisInfo[i].Orientation != this.AxisInfo[i].Orientation)
  184. return false;
  185. return gcs.AngularUnit.EqualParams(this.AngularUnit) &&
  186. gcs.HorizontalDatum.EqualParams(this.HorizontalDatum) &&
  187. gcs.PrimeMeridian.EqualParams(this.PrimeMeridian);
  188. }
  189. #endregion
  190. }
  191. }