ProjectedCoordinateSystem.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 2D cartographic coordinate system.
  24. /// </summary>
  25. public class ProjectedCoordinateSystem : HorizontalCoordinateSystem,  IProjectedCoordinateSystem
  26. {
  27. /// <summary>
  28. /// Initializes a new instance of a projected coordinate system
  29. /// </summary>
  30. /// <param name="datum">Horizontal datum</param>
  31. /// <param name="geographicCoordinateSystem">Geographic coordinate system</param>
  32. /// <param name="linearUnit">Linear unit</param>
  33. /// <param name="projection">Projection</param>
  34. /// <param name="axisInfo">Axis info</param>
  35. /// <param name="name">Name</param>
  36. /// <param name="authority">Authority name</param>
  37. /// <param name="code">Authority-specific identification code.</param>
  38. /// <param name="alias">Alias</param>
  39. /// <param name="abbreviation">Abbreviation</param>
  40. /// <param name="remarks">Provider-supplied remarks</param>
  41. internal ProjectedCoordinateSystem(IHorizontalDatum datum, IGeographicCoordinateSystem geographicCoordinateSystem,
  42. ILinearUnit linearUnit, IProjection projection, Collection<AxisInfo> axisInfo,
  43. string name, string authority, long code, string alias,
  44. string remarks, string abbreviation)
  45. : base(datum, axisInfo, name, authority, code, alias, abbreviation, remarks)
  46. {
  47. _GeographicCoordinateSystem = geographicCoordinateSystem;
  48. _LinearUnit = linearUnit;
  49. _Projection = projection;
  50. }
  51. #region Predefined projected coordinate systems
  52. /*
  53. /// <summary>
  54. /// Universal Transverse Mercator - WGS84
  55. /// </summary>
  56. /// <param name="Zone">UTM zone</param>
  57. /// <param name="ZoneIsNorth">true of Northern hemisphere, false if southern</param>
  58. /// <returns>UTM/WGS84 coordsys</returns>
  59. public static ProjectedCoordinateSystem WGS84_UTM(int Zone, bool ZoneIsNorth)
  60. {
  61. ParameterInfo pInfo = new ParameterInfo();
  62. pInfo.Add("latitude_of_origin", 0);
  63. pInfo.Add("central_meridian", Zone * 6 - 183);
  64. pInfo.Add("scale_factor", 0.9996);
  65. pInfo.Add("false_easting", 500000);
  66. pInfo.Add("false_northing", ZoneIsNorth ? 0 : 10000000);
  67. Projection proj = new Projection(String.Empty,String.Empty,pInfo,AngularUnit.Degrees,
  68. SharpMap.SpatialReference.LinearUnit.Metre,Ellipsoid.WGS84,
  69. "Transverse_Mercator", "EPSG", 32600 + Zone + (ZoneIsNorth ? 0 : 100), String.Empty, String.Empty, String.Empty);
  70. return new ProjectedCoordinateSystem("Large and medium scale topographic mapping and engineering survey.",
  71. SharpMap.SpatialReference.GeographicCoordinateSystem.WGS84,
  72. SharpMap.SpatialReference.LinearUnit.Metre, proj, pInfo,
  73. "WGS 84 / UTM zone " + Zone.ToString() + (ZoneIsNorth ? "N" : "S"), "EPSG", 32600 + Zone + (ZoneIsNorth ? 0 : 100),
  74. String.Empty,String.Empty,string.Empty);
  75. }*/
  76. #endregion
  77. #region IProjectedCoordinateSystem Members
  78. private IGeographicCoordinateSystem _GeographicCoordinateSystem;
  79. /// <summary>
  80. /// Gets or sets the GeographicCoordinateSystem.
  81. /// </summary>
  82. public IGeographicCoordinateSystem GeographicCoordinateSystem
  83. {
  84. get { return _GeographicCoordinateSystem; }
  85. set { _GeographicCoordinateSystem = value; }
  86. }
  87. private ILinearUnit _LinearUnit;
  88. /// <summary>
  89. /// Gets or sets the <see cref="LinearUnit">LinearUnits</see>. The linear unit must be the same as the <see cref="CoordinateSystem"/> units.
  90. /// </summary>
  91. public ILinearUnit LinearUnit
  92. {
  93. get { return _LinearUnit; }
  94. set { _LinearUnit = value; }
  95. }
  96. /// <summary>
  97. /// Gets units for dimension within coordinate system. Each dimension in 
  98. /// the coordinate system has corresponding units.
  99. /// </summary>
  100. /// <param name="dimension">Dimension</param>
  101. /// <returns>Unit</returns>
  102. public override IUnit GetUnits(int dimension)
  103. {
  104. return _LinearUnit;
  105. }
  106. private IProjection _Projection;
  107. /// <summary>
  108. /// Gets or sets the projection
  109. /// </summary>
  110. public IProjection Projection
  111. {
  112. get { return _Projection; }
  113. set { _Projection = value; }
  114. }
  115. /// <summary>
  116. /// Returns the Well-known text for this object
  117. /// as defined in the simple features specification.
  118. /// </summary>
  119. public override string WKT
  120. {
  121. get
  122. {
  123. StringBuilder sb = new StringBuilder();
  124. sb.AppendFormat("PROJCS["{0}", {1}, {2}",Name, GeographicCoordinateSystem.WKT, Projection.WKT);
  125. for(int i=0;i<Projection.NumParameters;i++)
  126. sb.AppendFormat(SharpMap.Map.numberFormat_EnUS, ", {0}", Projection.GetParameter(i).WKT);
  127. sb.AppendFormat(", {0}", LinearUnit.WKT);
  128. //Skip axis info if they contain default values
  129. if (AxisInfo.Count != 2 ||
  130. AxisInfo[0].Name != "X" || AxisInfo[0].Orientation != AxisOrientationEnum.East ||
  131. AxisInfo[1].Name != "Y" || AxisInfo[1].Orientation != AxisOrientationEnum.North)
  132. for (int i = 0; i < AxisInfo.Count; i++)
  133. sb.AppendFormat(", {0}", GetAxis(i).WKT);
  134. if (!String.IsNullOrEmpty(Authority) && AuthorityCode > 0)
  135. sb.AppendFormat(", AUTHORITY["{0}", "{1}"]", Authority, AuthorityCode);
  136. sb.Append("]");
  137. return sb.ToString();
  138. }
  139. }
  140. /// <summary>
  141. /// Gets an XML representation of this object.
  142. /// </summary>
  143. public override string XML
  144. {
  145. get
  146. {
  147. StringBuilder sb = new StringBuilder();
  148. sb.AppendFormat(SharpMap.Map.numberFormat_EnUS,
  149. "<CS_CoordinateSystem Dimension="{0}"><CS_ProjectedCoordinateSystem>{1}",
  150. this.Dimension, InfoXml);
  151. foreach (AxisInfo ai in this.AxisInfo)
  152. sb.Append(ai.XML);
  153. sb.AppendFormat("{0}{1}{2}</CS_ProjectedCoordinateSystem></CS_CoordinateSystem>",
  154. GeographicCoordinateSystem.XML, LinearUnit.XML, Projection.XML);
  155. return sb.ToString();
  156. }
  157. }
  158. /// <summary>
  159. /// Checks whether the values of this instance is equal to the values of another instance.
  160. /// Only parameters used for coordinate system are used for comparison.
  161. /// Name, abbreviation, authority, alias and remarks are ignored in the comparison.
  162. /// </summary>
  163. /// <param name="obj"></param>
  164. /// <returns>True if equal</returns>
  165. public override bool EqualParams(object obj)
  166. {
  167. if (!(obj is ProjectedCoordinateSystem))
  168. return false;
  169. ProjectedCoordinateSystem pcs = obj as ProjectedCoordinateSystem;
  170. if(pcs.Dimension != this.Dimension)
  171. return false;
  172. for (int i = 0; i < pcs.Dimension; i++)
  173. {
  174. if(pcs.GetAxis(i).Orientation != this.GetAxis(i).Orientation)
  175. return false;
  176. if (!pcs.GetUnits(i).EqualParams(this.GetUnits(i)))
  177. return false;
  178. }
  179. return pcs.GeographicCoordinateSystem.EqualParams(this.GeographicCoordinateSystem) && 
  180. pcs.HorizontalDatum.EqualParams(this.HorizontalDatum) &&
  181. pcs.LinearUnit.EqualParams(this.LinearUnit) &&
  182. pcs.Projection.EqualParams(this.Projection);
  183. }
  184. #endregion
  185. }
  186. }