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

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 3D coordinate system, with its origin at the center of the Earth.
  24. /// </summary>
  25. public class GeocentricCoordinateSystem : CoordinateSystem, IGeocentricCoordinateSystem
  26. {
  27. internal GeocentricCoordinateSystem(IHorizontalDatum datum, ILinearUnit linearUnit, IPrimeMeridian primeMeridian, Collection<AxisInfo> axisinfo,
  28. string name, string authority, long code, string alias, 
  29. string remarks, string abbreviation)
  30. : base(name, authority, code, alias, abbreviation, remarks)
  31. {
  32. _HorizontalDatum = datum;
  33. _LinearUnit = linearUnit;
  34. _Primemeridan = primeMeridian;
  35. if (axisinfo.Count != 3)
  36. throw new ArgumentException("Axis info should contain three axes for geocentric coordinate systems");
  37. base.AxisInfo = axisinfo;
  38. }
  39. #region Predefined geographic coordinate systems
  40. /// <summary>
  41. /// Creates a geocentric coordinate system based on the WGS84 ellipsoid, suitable for GPS measurements
  42. /// </summary>
  43. public static IGeocentricCoordinateSystem WGS84
  44. {
  45. get
  46. {
  47. return new CoordinateSystemFactory().CreateGeocentricCoordinateSystem("WGS84 Geocentric",
  48. SharpMap.CoordinateSystems.HorizontalDatum.WGS84, SharpMap.CoordinateSystems.LinearUnit.Metre, 
  49. SharpMap.CoordinateSystems.PrimeMeridian.Greenwich);
  50. }
  51. }
  52. #endregion
  53. #region IGeocentricCoordinateSystem Members
  54. private IHorizontalDatum _HorizontalDatum;
  55. /// <summary>
  56. /// Returns the HorizontalDatum. The horizontal datum is used to determine where
  57. /// the centre of the Earth is considered to be. All coordinate points will be 
  58. /// measured from the centre of the Earth, and not the surface.
  59. /// </summary>
  60. public IHorizontalDatum HorizontalDatum
  61. {
  62. get { return _HorizontalDatum; }
  63. set { _HorizontalDatum = value; }
  64. }
  65. private ILinearUnit _LinearUnit;
  66. /// <summary>
  67. /// Gets the units used along all the axes.
  68. /// </summary>
  69. public ILinearUnit LinearUnit
  70. {
  71. get { return _LinearUnit; }
  72. set { _LinearUnit = value; }
  73. }
  74. /// <summary>
  75. /// Gets units for dimension within coordinate system. Each dimension in 
  76. /// the coordinate system has corresponding units.
  77. /// </summary>
  78. /// <param name="dimension">Dimension</param>
  79. /// <returns>Unit</returns>
  80. public override IUnit GetUnits(int dimension)
  81. {
  82. return _LinearUnit;
  83. }
  84. private IPrimeMeridian _Primemeridan;
  85. /// <summary>
  86. /// Returns the PrimeMeridian.
  87. /// </summary>
  88. public IPrimeMeridian PrimeMeridian
  89. {
  90. get { return _Primemeridan; }
  91. set { _Primemeridan = value; }
  92. }
  93. /// <summary>
  94. /// Returns the Well-known text for this object
  95. /// as defined in the simple features specification.
  96. /// </summary>
  97. public override string WKT
  98. {
  99. get
  100. {
  101. StringBuilder sb = new StringBuilder();
  102. sb.AppendFormat("GEOCCS["{0}", {1}, {2}, {3}", Name, HorizontalDatum.WKT, PrimeMeridian.WKT, LinearUnit.WKT);
  103. //Skip axis info if they contain default values
  104. if (AxisInfo.Count != 3 ||
  105. AxisInfo[0].Name != "X" || AxisInfo[0].Orientation != AxisOrientationEnum.Other ||
  106. AxisInfo[1].Name != "Y" || AxisInfo[1].Orientation != AxisOrientationEnum.East ||
  107. AxisInfo[2].Name != "Z" || AxisInfo[2].Orientation != AxisOrientationEnum.North)
  108. for (int i = 0; i < AxisInfo.Count; i++)
  109. sb.AppendFormat(", {0}", GetAxis(i).WKT);
  110. if (!String.IsNullOrEmpty(Authority) && AuthorityCode>0)
  111. sb.AppendFormat(", AUTHORITY["{0}", "{1}"]", Authority, AuthorityCode);
  112. sb.Append("]");
  113. return sb.ToString();
  114. }
  115. }
  116. /// <summary>
  117. /// Gets an XML representation of this object
  118. /// </summary>
  119. public override string XML
  120. {
  121. get
  122. {
  123. StringBuilder sb = new StringBuilder();
  124. sb.AppendFormat(SharpMap.Map.numberFormat_EnUS,
  125. "<CS_CoordinateSystem Dimension="{0}"><CS_GeocentricCoordinateSystem>{1}",
  126. this.Dimension, InfoXml);
  127. foreach (AxisInfo ai in this.AxisInfo)
  128. sb.Append(ai.XML);
  129. sb.AppendFormat("{0}{1}{2}</CS_GeocentricCoordinateSystem></CS_CoordinateSystem>",
  130. HorizontalDatum.XML, LinearUnit.XML, PrimeMeridian.XML);
  131. return sb.ToString();
  132. }
  133. }
  134. /// <summary>
  135. /// Checks whether the values of this instance is equal to the values of another instance.
  136. /// Only parameters used for coordinate system are used for comparison.
  137. /// Name, abbreviation, authority, alias and remarks are ignored in the comparison.
  138. /// </summary>
  139. /// <param name="obj"></param>
  140. /// <returns>True if equal</returns>
  141. public override bool EqualParams(object obj)
  142. {
  143. if (!(obj is GeocentricCoordinateSystem))
  144. return false;
  145. GeocentricCoordinateSystem gcc = obj as GeocentricCoordinateSystem;
  146. return gcc.HorizontalDatum.EqualParams(this.HorizontalDatum) &&
  147. gcc.LinearUnit.EqualParams(this.LinearUnit) &&
  148. gcc.PrimeMeridian.EqualParams(this.PrimeMeridian);
  149. }
  150. #endregion
  151. }
  152. }