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

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.Text;
  19. namespace SharpMap.CoordinateSystems
  20. {
  21. /// <summary>
  22. /// Horizontal datum defining the standard datum information.
  23. /// </summary>
  24. public class HorizontalDatum : Datum, IHorizontalDatum
  25. {
  26. /// <summary>
  27. /// Initializes a new instance of a horizontal datum
  28. /// </summary>
  29. /// <param name="ellipsoid">Ellipsoid</param>
  30. /// <param name="toWgs84">Parameters for a Bursa Wolf transformation into WGS84</param>
  31. /// <param name="type">Datum type</param>
  32. /// <param name="name">Name</param>
  33. /// <param name="authority">Authority name</param>
  34. /// <param name="code">Authority-specific identification code.</param>
  35. /// <param name="alias">Alias</param>
  36. /// <param name="abbreviation">Abbreviation</param>
  37. /// <param name="remarks">Provider-supplied remarks</param>
  38. internal HorizontalDatum(
  39. IEllipsoid ellipsoid, Wgs84ConversionInfo toWgs84, DatumType type,
  40. string name, string authority, long code, string alias, string remarks, string abbreviation)
  41. : base(type, name, authority, code, alias, remarks, abbreviation)
  42. {
  43. _Ellipsoid = ellipsoid;
  44. _Wgs84ConversionInfo = toWgs84;
  45. }
  46. #region Predefined datums
  47. /// <summary>
  48. /// EPSG's WGS 84 datum has been the then current realisation. No distinction is made between the original WGS 84 
  49. /// frame, WGS 84 (G730), WGS 84 (G873) and WGS 84 (G1150). Since 1997, WGS 84 has been maintained within 10cm of 
  50. /// the then current ITRF.
  51. /// </summary>
  52. /// <remarks>
  53. /// <para>Area of use: World</para>
  54. /// <para>Origin description: Defined through a consistent set of station coordinates. These have changed with time: by 0.7m 
  55. /// on 29/6/1994 [WGS 84 (G730)], a further 0.2m on 29/1/1997 [WGS 84 (G873)] and a further 0.06m on 
  56. /// 20/1/2002 [WGS 84 (G1150)].</para>
  57. /// </remarks>
  58. public static HorizontalDatum WGS84
  59. {
  60. get
  61. {
  62. return new HorizontalDatum(SharpMap.CoordinateSystems.Ellipsoid.WGS84, 
  63. null, DatumType.HD_Geocentric, "World Geodetic System 1984", "EPSG", 6326, String.Empty, 
  64. "EPSG's WGS 84 datum has been the then current realisation. No distinction is made between the original WGS 84 frame, WGS 84 (G730), WGS 84 (G873) and WGS 84 (G1150). Since 1997, WGS 84 has been maintained within 10cm of the then current ITRF.", String.Empty);
  65. }
  66. }
  67. /// <summary>
  68. /// World Geodetic System 1972
  69. /// </summary>
  70. /// <remarks>
  71. /// <para>Used by GPS before 1987. For Transit satellite positioning see also WGS 72BE. Datum code 6323 reserved for southern hemisphere ProjCS's.</para>
  72. /// <para>Area of use: World</para>
  73. /// <para>Origin description: Developed from a worldwide distribution of terrestrial and
  74. /// geodetic satellite observations and defined through a set of station coordinates.</para>
  75. /// </remarks>
  76. public static HorizontalDatum WGS72
  77. {
  78. get
  79. {
  80. HorizontalDatum datum = 
  81. new HorizontalDatum(SharpMap.CoordinateSystems.Ellipsoid.WGS72,
  82. null, DatumType.HD_Geocentric, "World Geodetic System 1972", "EPSG", 6322, String.Empty,
  83. "Used by GPS before 1987. For Transit satellite positioning see also WGS 72BE. Datum code 6323 reserved for southern hemisphere ProjCS's.", String.Empty);
  84. datum.Wgs84Parameters = new Wgs84ConversionInfo(0, 0, 4.5, 0, 0, 0.554, 0.219);
  85. return datum;
  86. }
  87. }
  88. /// <summary>
  89. /// European Terrestrial Reference System 1989
  90. /// </summary>
  91. /// <remarks>
  92. /// <para>Area of use: 
  93. /// Europe: Albania; Andorra; Austria; Belgium; Bosnia and Herzegovina; Bulgaria; Croatia; 
  94. /// Cyprus; Czech Republic; Denmark; Estonia; Finland; Faroe Islands; France; Germany; Greece; 
  95. /// Hungary; Ireland; Italy; Latvia; Liechtenstein; Lithuania; Luxembourg; Malta; Netherlands; 
  96. /// Norway; Poland; Portugal; Romania; San Marino; Serbia and Montenegro; Slovakia; Slovenia; 
  97. /// Spain; Svalbard; Sweden; Switzerland; United Kingdom (UK) including Channel Islands and 
  98. /// Isle of Man; Vatican City State.</para>
  99. /// <para>Origin description: Fixed to the stable part of the Eurasian continental 
  100. /// plate and consistent with ITRS at the epoch 1989.0.</para>
  101. /// </remarks>
  102. public static HorizontalDatum ETRF89
  103. {
  104. get
  105. {
  106. HorizontalDatum datum = new HorizontalDatum(SharpMap.CoordinateSystems.Ellipsoid.GRS80, null, DatumType.HD_Geocentric, 
  107. "European Terrestrial Reference System 1989", "EPSG", 6258, "ETRF89", "The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used for the realisation.", String.Empty);
  108. datum.Wgs84Parameters = new Wgs84ConversionInfo();
  109. return datum;
  110. }
  111. }
  112. /// <summary>
  113. /// European Datum 1950
  114. /// </summary>
  115. /// <remarks>
  116. /// <para>Area of use:
  117. /// Europe - west - Denmark; Faroe Islands; France offshore; Israel offshore; Italy including San 
  118. /// Marino and Vatican City State; Ireland offshore; Netherlands offshore; Germany; Greece (offshore);
  119. /// North Sea; Norway; Spain; Svalbard; Turkey; United Kingdom UKCS offshore. Egypt - Western Desert.
  120. /// </para>
  121. /// <para>Origin description: Fundamental point: Potsdam (Helmert Tower). 
  122. /// Latitude: 52 deg 22 min 51.4456 sec N; Longitude: 13 deg  3 min 58.9283 sec E (of Greenwich).</para>
  123. /// </remarks>
  124. public static HorizontalDatum ED50
  125. {
  126. get
  127. {
  128. return new HorizontalDatum(SharpMap.CoordinateSystems.Ellipsoid.International1924, new Wgs84ConversionInfo(-87,-98,-121,0,0,0,0), DatumType.HD_Geocentric,
  129. "European Datum 1950", "EPSG", 6230, "ED50", String.Empty, String.Empty);
  130. }
  131. }
  132. #endregion
  133. #region IHorizontalDatum Members
  134. IEllipsoid _Ellipsoid;
  135. /// <summary>
  136. /// Gets or sets the ellipsoid of the datum
  137. /// </summary>
  138. public IEllipsoid Ellipsoid
  139. {
  140. get { return _Ellipsoid;  }
  141. set { _Ellipsoid = value; }
  142. }
  143. Wgs84ConversionInfo _Wgs84ConversionInfo;
  144. /// <summary>
  145. /// Gets preferred parameters for a Bursa Wolf transformation into WGS84
  146. /// </summary>
  147. public Wgs84ConversionInfo Wgs84Parameters
  148. {
  149. get { return _Wgs84ConversionInfo; }
  150. set { _Wgs84ConversionInfo = value; }
  151. }
  152. /// <summary>
  153. /// Returns the Well-known text for this object
  154. /// as defined in the simple features specification.
  155. /// </summary>
  156. public override string WKT
  157. {
  158. get
  159. {
  160. StringBuilder sb = new StringBuilder();
  161. sb.AppendFormat("DATUM["{0}", {1}", Name, _Ellipsoid.WKT);
  162. if(_Wgs84ConversionInfo!=null)
  163. sb.AppendFormat(", {0}", _Wgs84ConversionInfo.WKT);
  164. if (!String.IsNullOrEmpty(Authority) && AuthorityCode > 0)
  165. sb.AppendFormat(", AUTHORITY["{0}", "{1}"]", Authority, AuthorityCode);
  166. sb.Append("]");
  167. return sb.ToString();
  168. }
  169. }
  170. /// <summary>
  171. /// Gets an XML representation of this object
  172. /// </summary>
  173. public override string XML
  174. {
  175. get
  176. {
  177. return String.Format(SharpMap.Map.numberFormat_EnUS,
  178. "<CS_HorizontalDatum DatumType="{0}">{1}{2}{3}</CS_HorizontalDatum>",
  179. (int)DatumType, InfoXml, Ellipsoid.XML, (Wgs84Parameters==null?String.Empty:Wgs84Parameters.XML));
  180. }
  181. }
  182. #endregion
  183. /// <summary>
  184. /// Checks whether the values of this instance is equal to the values of another instance.
  185. /// Only parameters used for coordinate system are used for comparison.
  186. /// Name, abbreviation, authority, alias and remarks are ignored in the comparison.
  187. /// </summary>
  188. /// <param name="obj"></param>
  189. /// <returns>True if equal</returns>
  190. public override bool EqualParams(object obj)
  191. {
  192. if (!(obj is SharpMap.CoordinateSystems.HorizontalDatum))
  193. return false;
  194. HorizontalDatum datum = obj as HorizontalDatum;
  195. if(datum.Wgs84Parameters==null && this.Wgs84Parameters!=null) return false;
  196. if(datum.Wgs84Parameters!=null && !datum.Wgs84Parameters.Equals(this.Wgs84Parameters))
  197. return false;
  198. return datum.Ellipsoid == this.Ellipsoid && this.DatumType == datum.DatumType;
  199. }
  200. }
  201. }