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

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. /// Builds up complex objects from simpler objects or values.
  24. /// </summary>
  25. /// <remarks>
  26. /// <para>ICoordinateSystemFactory allows applications to make coordinate systems that 
  27. /// cannot be created by a <see cref="ICoordinateSystemAuthorityFactory"/>. This factory is very 
  28. /// flexible, whereas the authority factory is easier to use.</para>
  29. /// <para>So <see cref="ICoordinateSystemAuthorityFactory"/>can be used to make 'standard' coordinate 
  30. /// systems, and <see cref="CoordinateSystemFactory"/> can be used to make 'special' 
  31. /// coordinate systems.</para>
  32. /// <para>For example, the EPSG authority has codes for USA state plane coordinate systems 
  33. /// using the NAD83 datum, but these coordinate systems always use meters. EPSG does not 
  34. /// have codes for NAD83 state plane coordinate systems that use feet units. This factory
  35. /// lets an application create such a hybrid coordinate system.</para>
  36. /// </remarks>
  37. public class CoordinateSystemFactory : ICoordinateSystemFactory
  38. {
  39. #region ICoordinateSystemFactory Members
  40. /// <summary>
  41. /// Creates a coordinate system object from an XML string.
  42. /// </summary>
  43. /// <param name="xml">XML representation for the spatial reference</param>
  44. /// <returns>The resulting spatial reference object</returns>
  45. public ICoordinateSystem CreateFromXml(string xml)
  46. {
  47. throw new Exception("The method or operation is not implemented.");
  48. }
  49. /// <summary>
  50. /// Creates a spatial reference object given its Well-known text representation.
  51. /// The output object may be either a <see cref="IGeographicCoordinateSystem"/> or
  52. /// a <see cref="IProjectedCoordinateSystem"/>.
  53. /// </summary>
  54. /// <param name="WKT">The Well-known text representation for the spatial reference</param>
  55. /// <returns>The resulting spatial reference object</returns>
  56. public ICoordinateSystem CreateFromWkt(string WKT)
  57. {
  58. return SharpMap.Converters.WellKnownText.CoordinateSystemWktReader.Parse(WKT) as ICoordinateSystem;
  59. }
  60. /// <summary>
  61. /// Creates a <see cref="ICompoundCoordinateSystem"/> [NOT IMPLEMENTED].
  62. /// </summary>
  63. /// <param name="name">Name of compound coordinate system.</param>
  64. /// <param name="head">Head coordinate system</param>
  65. /// <param name="tail">Tail coordinate system</param>
  66. /// <returns>Compound coordinate system</returns>
  67. public ICompoundCoordinateSystem CreateCompoundCoordinateSystem(string name, ICoordinateSystem head, ICoordinateSystem tail)
  68. {
  69. throw new NotImplementedException();
  70. }
  71. /// <summary>
  72. /// Creates a <see cref="IFittedCoordinateSystem"/>.
  73. /// </summary>
  74. /// <remarks>The units of the axes in the fitted coordinate system will be 
  75. /// inferred from the units of the base coordinate system. If the affine map
  76. /// performs a rotation, then any mixed axes must have identical units. For
  77. /// example, a (lat_deg,lon_deg,height_feet) system can be rotated in the 
  78. /// (lat,lon) plane, since both affected axes are in degrees. But you 
  79. /// should not rotate this coordinate system in any other plane.</remarks>
  80. /// <param name="name">Name of coordinate system</param>
  81. /// <param name="baseCoordinateSystem">Base coordinate system</param>
  82. /// <param name="toBaseWkt"></param>
  83. /// <param name="arAxes"></param>
  84. /// <returns>Fitted coordinate system</returns>
  85. public IFittedCoordinateSystem CreateFittedCoordinateSystem(string name, ICoordinateSystem baseCoordinateSystem, string toBaseWkt, Collection<AxisInfo> arAxes)
  86. {
  87. throw new NotImplementedException();
  88. }
  89. /// <summary>
  90. /// Creates a <see cref="ILocalCoordinateSystem">local coordinate system</see>.
  91. /// </summary>
  92. /// <remarks>
  93. ///  The dimension of the local coordinate system is determined by the size of 
  94. /// the axis array. All the axes will have the same units. If you want to make 
  95. /// a coordinate system with mixed units, then you can make a compound 
  96. /// coordinate system from different local coordinate systems.
  97. /// </remarks>
  98. /// <param name="name">Name of local coordinate system</param>
  99. /// <param name="datum">Local datum</param>
  100. /// <param name="unit">Units</param>
  101. /// <param name="axes">Axis info</param>
  102. /// <returns>Local coordinate system</returns>
  103. public ILocalCoordinateSystem CreateLocalCoordinateSystem(string name, ILocalDatum datum, IUnit unit, Collection<AxisInfo> axes)
  104. {
  105. throw new Exception("The method or operation is not implemented.");
  106. }
  107. /// <summary>
  108. /// Creates an <see cref="Ellipsoid"/> from radius values.
  109. /// </summary>
  110. /// <seealso cref="CreateFlattenedSphere"/>
  111. /// <param name="name">Name of ellipsoid</param>
  112. /// <param name="semiMajorAxis"></param>
  113. /// <param name="semiMinorAxis"></param>
  114. /// <param name="linearUnit"></param>
  115. /// <returns>Ellipsoid</returns>
  116. public IEllipsoid CreateEllipsoid(string name, double semiMajorAxis, double semiMinorAxis, ILinearUnit linearUnit)
  117. {
  118. return new Ellipsoid(semiMajorAxis, semiMinorAxis, 1.0, false, linearUnit, name, String.Empty, -1, String.Empty, string.Empty, string.Empty);
  119. }
  120. /// <summary>
  121. /// Creates an <see cref="Ellipsoid"/> from an major radius, and inverse flattening.
  122. /// </summary>
  123. /// <seealso cref="CreateEllipsoid"/>
  124. /// <param name="name">Name of ellipsoid</param>
  125. /// <param name="semiMajorAxis">Semi major-axis</param>
  126. /// <param name="inverseFlattening">Inverse flattening</param>
  127. /// <param name="linearUnit">Linear unit</param>
  128. /// <returns>Ellipsoid</returns>
  129. public IEllipsoid CreateFlattenedSphere(string name, double semiMajorAxis, double inverseFlattening, ILinearUnit linearUnit)
  130. {
  131. if (String.IsNullOrEmpty(name))
  132. throw new ArgumentException("Invalid name");
  133. return new Ellipsoid(semiMajorAxis, -1, inverseFlattening, true, linearUnit, name, String.Empty, -1, String.Empty, String.Empty, String.Empty);
  134. }
  135. /// <summary>
  136. /// Creates a <see cref="ProjectedCoordinateSystem"/> using a projection object.
  137. /// </summary>
  138. /// <param name="name">Name of projected coordinate system</param>
  139. /// <param name="gcs">Geographic coordinate system</param>
  140. /// <param name="projection">Projection</param>
  141. /// <param name="linearUnit">Linear unit</param>
  142. /// <param name="axis0">Primary axis</param>
  143. /// <param name="axis1">Secondary axis</param>
  144. /// <returns>Projected coordinate system</returns>
  145. public IProjectedCoordinateSystem CreateProjectedCoordinateSystem(string name, IGeographicCoordinateSystem gcs, IProjection projection, ILinearUnit linearUnit, AxisInfo axis0, AxisInfo axis1)
  146. {
  147. if (String.IsNullOrEmpty(name))
  148. throw new ArgumentException("Invalid name");
  149. if (gcs == null)
  150. throw new ArgumentException("Geographic coordinate system was null");
  151. if (projection == null)
  152. throw new ArgumentException("Projection was null");
  153. if (linearUnit == null)
  154. throw new ArgumentException("Linear unit was null");
  155.             //Collection<AxisInfo> info = new Collection<AxisInfo>(2);
  156.             Collection<AxisInfo> info = new Collection<AxisInfo>();
  157. info.Add(axis0);
  158. info.Add(axis1);
  159. return new ProjectedCoordinateSystem(null, gcs, linearUnit, projection, info, name, String.Empty, -1, String.Empty, String.Empty, String.Empty);
  160. }
  161. /// <summary>
  162. /// Creates a <see cref="Projection"/>.
  163. /// </summary>
  164. /// <param name="name">Name of projection</param>
  165. /// <param name="wktProjectionClass">Projection class</param>
  166. /// <param name="parameters">Projection parameters</param>
  167. /// <returns>Projection</returns>
  168. public IProjection CreateProjection(string name, string wktProjectionClass, Collection<ProjectionParameter> parameters)
  169. {
  170. if (String.IsNullOrEmpty(name))
  171. throw new ArgumentException("Invalid name");
  172. if(parameters==null || parameters.Count==0)
  173. throw new ArgumentException("Invalid projection parameters");
  174. return new Projection(wktProjectionClass, parameters, name, String.Empty, -1, String.Empty, String.Empty, String.Empty);
  175. }
  176. /// <summary>
  177. /// Creates <see cref="HorizontalDatum"/> from ellipsoid and Bursa-World parameters.
  178. /// </summary>
  179. /// <remarks>
  180. /// Since this method contains a set of Bursa-Wolf parameters, the created 
  181. /// datum will always have a relationship to WGS84. If you wish to create a
  182. /// horizontal datum that has no relationship with WGS84, then you can 
  183. /// either specify a <see cref="DatumType">horizontalDatumType</see> of <see cref="DatumType.HD_Other"/>, or create it via WKT.
  184. /// </remarks>
  185. /// <param name="name">Name of ellipsoid</param>
  186. /// <param name="datumType">Type of datum</param>
  187. /// <param name="ellipsoid">Ellipsoid</param>
  188. /// <param name="toWgs84">Wgs84 conversion parameters</param>
  189. /// <returns>Horizontal datum</returns>
  190. public IHorizontalDatum CreateHorizontalDatum(string name, DatumType datumType, IEllipsoid ellipsoid, Wgs84ConversionInfo toWgs84)
  191. {
  192. if (String.IsNullOrEmpty(name))
  193. throw new ArgumentException("Invalid name");
  194. if (ellipsoid == null)
  195. throw new ArgumentException("Ellipsoid was null");
  196. return new HorizontalDatum(ellipsoid, toWgs84, datumType, name, String.Empty, -1, String.Empty, String.Empty, String.Empty);
  197. }
  198. /// <summary>
  199. /// Creates a <see cref="PrimeMeridian"/>, relative to Greenwich.
  200. /// </summary>
  201. /// <param name="name">Name of prime meridian</param>
  202. /// <param name="angularUnit">Angular unit</param>
  203. /// <param name="longitude">Longitude</param>
  204. /// <returns>Prime meridian</returns>
  205. public IPrimeMeridian CreatePrimeMeridian(string name, IAngularUnit angularUnit, double longitude)
  206. {
  207. if (String.IsNullOrEmpty(name))
  208. throw new ArgumentException("Invalid name");
  209. return new PrimeMeridian(longitude, angularUnit, name, String.Empty, -1, String.Empty, String.Empty, String.Empty);
  210. }
  211. /// <summary>
  212. /// Creates a <see cref="GeographicCoordinateSystem"/>, which could be Lat/Lon or Lon/Lat.
  213. /// </summary>
  214. /// <param name="name">Name of geographical coordinate system</param>
  215. /// <param name="angularUnit">Angular units</param>
  216. /// <param name="datum">Horizontal datum</param>
  217. /// <param name="primeMeridian">Prime meridian</param>
  218. /// <param name="axis0">First axis</param>
  219. /// <param name="axis1">Second axis</param>
  220. /// <returns>Geographic coordinate system</returns>
  221. public IGeographicCoordinateSystem CreateGeographicCoordinateSystem(string name, IAngularUnit angularUnit, IHorizontalDatum datum, IPrimeMeridian primeMeridian, AxisInfo axis0, AxisInfo axis1)
  222. {
  223. if (String.IsNullOrEmpty(name))
  224. throw new ArgumentException("Invalid name");
  225.             //Collection<AxisInfo> info = new Collection<AxisInfo>(2);
  226.             Collection<AxisInfo> info = new Collection<AxisInfo>();
  227. info.Add(axis0);
  228. info.Add(axis1);
  229. return new GeographicCoordinateSystem(angularUnit, datum, primeMeridian,info, name, String.Empty, -1, String.Empty, String.Empty, String.Empty);
  230. }
  231. /// <summary>
  232. /// Creates a <see cref="ILocalDatum"/>.
  233. /// </summary>
  234. /// <param name="name">Name of datum</param>
  235. /// <param name="datumType">Datum type</param>
  236. /// <returns></returns>
  237. public ILocalDatum CreateLocalDatum(string name, DatumType datumType)
  238. {
  239. throw new NotImplementedException();
  240. }
  241. /// <summary>
  242. /// Creates a <see cref="IVerticalDatum"/> from an enumerated type value.
  243. /// </summary>
  244. /// <param name="name">Name of datum</param>
  245. /// <param name="datumType">Type of datum</param>
  246. /// <returns>Vertical datum</returns>
  247. public IVerticalDatum CreateVerticalDatum(string name, DatumType datumType)
  248. {
  249. throw new NotImplementedException();
  250. }
  251. /// <summary>
  252. /// Creates a <see cref="IVerticalCoordinateSystem"/> from a <see cref="IVerticalDatum">datum</see> and <see cref="LinearUnit">linear units</see>.
  253. /// </summary>
  254. /// <param name="name">Name of vertical coordinate system</param>
  255. /// <param name="datum">Vertical datum</param>
  256. /// <param name="verticalUnit">Unit</param>
  257. /// <param name="axis">Axis info</param>
  258. /// <returns>Vertical coordinate system</returns>
  259. public IVerticalCoordinateSystem CreateVerticalCoordinateSystem(string name, IVerticalDatum datum, ILinearUnit verticalUnit, AxisInfo axis)
  260. {
  261. throw new NotImplementedException();
  262. }
  263. /// <summary>
  264. /// Creates a <see cref="CreateGeocentricCoordinateSystem"/> from a <see cref="IHorizontalDatum">datum</see>, 
  265. /// <see cref="ILinearUnit">linear unit</see> and <see cref="IPrimeMeridian"/>.
  266. /// </summary>
  267. /// <param name="name">Name of geocentric coordinate system</param>
  268. /// <param name="datum">Horizontal datum</param>
  269. /// <param name="linearUnit">Linear unit</param>
  270. /// <param name="primeMeridian">Prime meridian</param>
  271. /// <returns>Geocentric Coordinate System</returns>
  272. public IGeocentricCoordinateSystem CreateGeocentricCoordinateSystem(string name, IHorizontalDatum datum, ILinearUnit linearUnit, IPrimeMeridian primeMeridian)
  273. {
  274. if (String.IsNullOrEmpty(name))
  275. throw new ArgumentException("Invalid name");
  276.             //Collection<AxisInfo> info = new Collection<AxisInfo>(3);
  277.             Collection<AxisInfo> info = new Collection<AxisInfo>();
  278. info.Add(new AxisInfo("X", AxisOrientationEnum.Other));
  279. info.Add(new AxisInfo("Y", AxisOrientationEnum.Other));
  280. info.Add(new AxisInfo("Z", AxisOrientationEnum.Other));
  281. return new GeocentricCoordinateSystem(datum, linearUnit, primeMeridian, info, name,String.Empty,-1,String.Empty,String.Empty,String.Empty);
  282. }
  283. #endregion
  284. }
  285. }