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

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. // SOURCECODE IS MODIFIED FROM ANOTHER WORK AND IS ORIGINALLY BASED ON GeoTools.NET:
  17. /*
  18.  *  Copyright (C) 2002 Urban Science Applications, Inc. 
  19.  *
  20.  *  This library is free software; you can redistribute it and/or
  21.  *  modify it under the terms of the GNU Lesser General Public
  22.  *  License as published by the Free Software Foundation; either
  23.  *  version 2.1 of the License, or (at your option) any later version.
  24.  *
  25.  *  This library is distributed in the hope that it will be useful,
  26.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  27.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  28.  *  Lesser General Public License for more details.
  29.  *
  30.  *  You should have received a copy of the GNU Lesser General Public
  31.  *  License along with this library; if not, write to the Free Software
  32.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  33.  *
  34.  */
  35. using System;
  36. using System.IO;
  37. using System.Text;
  38. using SharpMap.Geometries;
  39. namespace SharpMap.Converters.WellKnownText
  40. {
  41. /// <summary>
  42. /// Outputs the textual representation of a <see cref="SharpMap.Geometries.Geometry"/> instance.
  43. /// </summary>
  44. /// <remarks>
  45. /// <para>The Well-Known Text (WKT) representation of Geometry is designed to exchange geometry data in ASCII form.</para>
  46. /// Examples of WKT representations of geometry objects are:
  47. /// <list type="table">
  48. /// <listheader><term>Geometry </term><description>WKT Representation</description></listheader>
  49. /// <item><term>A Point</term>
  50. /// <description>POINT(15 20)<br/> Note that point coordinates are specified with no separating comma.</description></item>
  51. /// <item><term>A LineString with four points:</term>
  52. /// <description>LINESTRING(0 0, 10 10, 20 25, 50 60)</description></item>
  53. /// <item><term>A Polygon with one exterior ring and one interior ring:</term>
  54. /// <description>POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))</description></item>
  55. /// <item><term>A MultiPoint with three Point values:</term>
  56. /// <description>MULTIPOINT(0 0, 20 20, 60 60)</description></item>
  57. /// <item><term>A MultiLineString with two LineString values:</term>
  58. /// <description>MULTILINESTRING((10 10, 20 20), (15 15, 30 15))</description></item>
  59. /// <item><term>A MultiPolygon with two Polygon values:</term>
  60. /// <description>MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))</description></item>
  61. /// <item><term>A GeometryCollection consisting of two Point values and one LineString:</term>
  62. /// <description>GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))</description></item>
  63. /// </list>
  64. /// </remarks>
  65. public class GeometryToWKT
  66. {
  67. #region Methods
  68. /// <summary>
  69. /// Converts a Geometry to its Well-known Text representation.
  70. /// </summary>
  71. /// <param name="geometry">A Geometry to write.</param>
  72. /// <returns>A &lt;Geometry Tagged Text&gt; string (see the OpenGIS Simple
  73. ///  Features Specification)</returns>
  74. public static string Write(IGeometry geometry)
  75. {
  76. StringWriter sw = new StringWriter();
  77. Write(geometry, sw);
  78. return sw.ToString();
  79. }
  80. /// <summary>
  81. /// Converts a Geometry to its Well-known Text representation.
  82. /// </summary>
  83. /// <param name="geometry">A geometry to process.</param>
  84. /// <param name="writer">Stream to write out the geometry's text representation.</param>
  85. /// <remarks>
  86. /// Geometry is written to the output stream as &lt;Gemoetry Tagged Text&gt; string (see the OpenGIS
  87. /// Simple Features Specification).
  88. /// </remarks>
  89. public static void Write(IGeometry geometry, StringWriter writer)
  90. {
  91. AppendGeometryTaggedText(geometry, writer);
  92. }
  93. /// <summary>
  94. /// Converts a Geometry to &lt;Geometry Tagged Text &gt; format, then Appends it to the writer.
  95. /// </summary>
  96. /// <param name="geometry">The Geometry to process.</param>
  97. /// <param name="writer">The output stream to Append to.</param>
  98. private static void AppendGeometryTaggedText(IGeometry geometry, StringWriter writer)
  99. {
  100. if (geometry == null)
  101. throw new NullReferenceException("Cannot write Well-Known Text: geometry was null"); ;
  102. if (geometry is Point) 
  103. {
  104. Point point = geometry as Point;
  105. AppendPointTaggedText(point, writer);
  106. }
  107. else if (geometry is LineString) 
  108. AppendLineStringTaggedText(geometry as LineString, writer);
  109. else if (geometry is Polygon) 
  110. AppendPolygonTaggedText(geometry as Polygon, writer);
  111. else if (geometry is MultiPoint) 
  112. AppendMultiPointTaggedText(geometry as MultiPoint, writer);
  113. else if (geometry is MultiLineString) 
  114. AppendMultiLineStringTaggedText(geometry as MultiLineString, writer);
  115. else if (geometry is MultiPolygon) 
  116. AppendMultiPolygonTaggedText(geometry as MultiPolygon, writer);
  117. else if (geometry is GeometryCollection) 
  118. AppendGeometryCollectionTaggedText(geometry as GeometryCollection, writer);
  119. else 
  120. throw new NotSupportedException("Unsupported Geometry implementation:"+ geometry.GetType().Name);
  121. }
  122. /// <summary>
  123. /// Converts a Coordinate to &lt;Point Tagged Text&gt; format,
  124. /// then Appends it to the writer.
  125. /// </summary>
  126. /// <param name="coordinate">the <code>Coordinate</code> to process</param>
  127. /// <param name="writer">the output writer to Append to</param>
  128. private static void AppendPointTaggedText(Point coordinate, StringWriter writer)
  129. {
  130. writer.Write("POINT ");
  131. AppendPointText(coordinate, writer);
  132. }
  133. /// <summary>
  134. /// Converts a LineString to LineString tagged text format, 
  135. /// </summary>
  136. /// <param name="lineString">The LineString to process.</param>
  137. /// <param name="writer">The output stream writer to Append to.</param>
  138. private static void AppendLineStringTaggedText(LineString lineString, StringWriter writer)
  139. {
  140. writer.Write("LINESTRING ");
  141. AppendLineStringText(lineString, writer);
  142. }
  143. /// <summary>
  144. ///  Converts a Polygon to &lt;Polygon Tagged Text&gt; format,
  145. ///  then Appends it to the writer.
  146. /// </summary>
  147. /// <param name="polygon">Th Polygon to process.</param>
  148. /// <param name="writer">The stream writer to Append to.</param>
  149. private static void AppendPolygonTaggedText(Polygon polygon, StringWriter writer)
  150. {
  151. writer.Write("POLYGON ");
  152. AppendPolygonText(polygon, writer);
  153. }
  154. /// <summary>
  155. /// Converts a MultiPoint to &lt;MultiPoint Tagged Text&gt;
  156. /// format, then Appends it to the writer.
  157. /// </summary>
  158. /// <param name="multipoint">The MultiPoint to process.</param>
  159. /// <param name="writer">The output writer to Append to.</param>
  160. private static void AppendMultiPointTaggedText(MultiPoint multipoint, StringWriter writer)
  161. {
  162. writer.Write("MULTIPOINT ");
  163. AppendMultiPointText(multipoint, writer);
  164. }
  165. /// <summary>
  166. /// Converts a MultiLineString to &lt;MultiLineString Tagged
  167. /// Text&gt; format, then Appends it to the writer.
  168. /// </summary>
  169. /// <param name="multiLineString">The MultiLineString to process</param>
  170. /// <param name="writer">The output stream writer to Append to.</param>
  171. private static void AppendMultiLineStringTaggedText(MultiLineString multiLineString, StringWriter writer)
  172. {
  173. writer.Write("MULTILINESTRING ");
  174. AppendMultiLineStringText(multiLineString, writer);
  175. }
  176. /// <summary>
  177. /// Converts a MultiPolygon to &lt;MultiPolygon Tagged
  178. /// Text&gt; format, then Appends it to the writer.
  179. /// </summary>
  180. /// <param name="multiPolygon">The MultiPolygon to process</param>
  181. /// <param name="writer">The output stream writer to Append to.</param>
  182. private static void AppendMultiPolygonTaggedText(MultiPolygon multiPolygon, StringWriter writer)
  183. {
  184. writer.Write("MULTIPOLYGON ");
  185. AppendMultiPolygonText(multiPolygon, writer);
  186. }
  187. /// <summary>
  188. /// Converts a GeometryCollection to &lt;GeometryCollection Tagged
  189. /// Text&gt; format, then Appends it to the writer.
  190. /// </summary>
  191. /// <param name="geometryCollection">The GeometryCollection to process</param>
  192. /// <param name="writer">The output stream writer to Append to.</param>
  193. private static void AppendGeometryCollectionTaggedText(GeometryCollection geometryCollection, StringWriter writer)
  194. {
  195. writer.Write("GEOMETRYCOLLECTION ");
  196. AppendGeometryCollectionText(geometryCollection, writer);
  197. }
  198. /// <summary>
  199. /// Converts a Coordinate to Point Text format then Appends it to the writer.
  200. /// </summary>
  201. /// <param name="coordinate">The Coordinate to process.</param>
  202. /// <param name="writer">The output stream writer to Append to.</param>
  203. private static void AppendPointText(Point coordinate, StringWriter writer)
  204. {
  205. if (coordinate == null || coordinate.IsEmpty()) 
  206. writer.Write("EMPTY");
  207. else 
  208. {
  209. writer.Write("(");
  210. AppendCoordinate(coordinate, writer);
  211. writer.Write(")");
  212. }
  213. }
  214. /// <summary>
  215. /// Converts a Coordinate to &lt;Point&gt; format, then Appends
  216. /// it to the writer. 
  217. /// </summary>
  218. /// <param name="coordinate">The Coordinate to process.</param>
  219. /// <param name="writer">The output writer to Append to.</param>
  220. private static void AppendCoordinate(Point coordinate, StringWriter writer)
  221. {
  222. for(uint i=0;i<coordinate.NumOrdinates;i++)
  223. writer.Write(WriteNumber(coordinate[i]) + (i<coordinate.NumOrdinates-1?" ":""));
  224. }
  225. /// <summary>
  226. /// Converts a double to a string, not in scientific notation.
  227. /// </summary>
  228. /// <param name="d">The double to convert.</param>
  229. /// <returns>The double as a string, not in scientific notation.</returns>
  230. private static string WriteNumber(double d) 
  231. {
  232. return d.ToString(SharpMap.Map.numberFormat_EnUS);
  233. }
  234. /// <summary>
  235. /// Converts a LineString to &lt;LineString Text&gt; format, then
  236. /// Appends it to the writer.
  237. /// </summary>
  238. /// <param name="lineString">The LineString to process.</param>
  239. /// <param name="writer">The output stream to Append to.</param>
  240. private static void AppendLineStringText(LineString lineString, StringWriter writer)
  241. {
  242. if (lineString==null || lineString.IsEmpty() ) 
  243. writer.Write("EMPTY");
  244. else 
  245. {
  246. writer.Write("(");
  247. for (int i = 0; i < lineString.NumPoints; i++) 
  248. {
  249. if (i > 0) 
  250. writer.Write(", ");
  251. AppendCoordinate( lineString.Vertices[i], writer);
  252. }
  253. writer.Write(")");
  254. }
  255. }
  256. /// <summary>
  257. /// Converts a Polygon to &lt;Polygon Text&gt; format, then
  258. /// Appends it to the writer.
  259. /// </summary>
  260. /// <param name="polygon">The Polygon to process.</param>
  261. /// <param name="writer"></param>
  262. private static void AppendPolygonText(Polygon polygon, StringWriter writer)
  263. {
  264. if (polygon == null || polygon.IsEmpty() ) 
  265. writer.Write("EMPTY");
  266. else 
  267. {
  268. writer.Write("(");
  269. AppendLineStringText(polygon.ExteriorRing, writer);
  270. for (int i = 0; i < polygon.InteriorRings.Count; i++) 
  271. {
  272. writer.Write(", ");
  273. AppendLineStringText(polygon.InteriorRings[i], writer);
  274. }
  275. writer.Write(")");
  276. }
  277. }
  278. /// <summary>
  279. /// Converts a MultiPoint to &lt;MultiPoint Text&gt; format, then
  280. /// Appends it to the writer.
  281. /// </summary>
  282. /// <param name="multiPoint">The MultiPoint to process.</param>
  283. /// <param name="writer">The output stream writer to Append to.</param>
  284. private static void AppendMultiPointText(MultiPoint multiPoint, StringWriter writer)
  285. {
  286. if(multiPoint == null || multiPoint.IsEmpty() ) 
  287. writer.Write("EMPTY");
  288. else 
  289. {
  290. writer.Write("(");
  291. for (int i = 0; i < multiPoint.Points.Count; i++) 
  292. {
  293. if (i > 0) 
  294. writer.Write(", ");
  295. AppendCoordinate(multiPoint[i], writer);
  296. }
  297. writer.Write(")");
  298. }
  299. }
  300. /// <summary>
  301. /// Converts a MultiLineString to &lt;MultiLineString Text&gt;
  302. /// format, then Appends it to the writer.
  303. /// </summary>
  304. /// <param name="multiLineString">The MultiLineString to process.</param>
  305. /// <param name="writer">The output stream writer to Append to.</param>
  306. private static void AppendMultiLineStringText(MultiLineString multiLineString, StringWriter writer)
  307. {
  308. if (multiLineString == null || multiLineString.IsEmpty() ) 
  309. writer.Write("EMPTY");
  310. else 
  311. {
  312. writer.Write("(");
  313. for (int i = 0; i < multiLineString.LineStrings.Count; i++) 
  314. {
  315. if (i > 0) 
  316. writer.Write(", ");
  317. AppendLineStringText(multiLineString[i], writer);
  318. }
  319. writer.Write(")");
  320. }
  321. }
  322. /// <summary>
  323. /// Converts a MultiPolygon to &lt;MultiPolygon Text&gt; format, then Appends to it to the writer.
  324. /// </summary>
  325. /// <param name="multiPolygon">The MultiPolygon to process.</param>
  326. /// <param name="writer">The output stream to Append to.</param>
  327. private static void AppendMultiPolygonText(MultiPolygon multiPolygon, StringWriter writer)
  328. {
  329. if (multiPolygon==null || multiPolygon.IsEmpty() ) 
  330. writer.Write("EMPTY");
  331. else 
  332. {
  333. writer.Write("(");
  334. for (int i = 0; i < multiPolygon.Polygons.Count; i++) 
  335. {
  336. if (i > 0) 
  337. writer.Write(", ");
  338. AppendPolygonText(multiPolygon[i], writer);
  339. }
  340. writer.Write(")");
  341. }
  342. }
  343. /// <summary>
  344. /// Converts a GeometryCollection to &lt;GeometryCollection Text &gt; format, then Appends it to the writer.
  345. /// </summary>
  346. /// <param name="geometryCollection">The GeometryCollection to process.</param>
  347. /// <param name="writer">The output stream writer to Append to.</param>
  348. private static void AppendGeometryCollectionText(GeometryCollection geometryCollection, StringWriter writer)
  349. {
  350. if (geometryCollection==null || geometryCollection.IsEmpty() ) 
  351. writer.Write("EMPTY");
  352. else 
  353. {
  354. writer.Write("(");
  355. for (int i = 0; i < geometryCollection.Collection.Count; i++) 
  356. {
  357. if (i > 0) 
  358. writer.Write(", ");
  359. AppendGeometryTaggedText(geometryCollection[i], writer);
  360. }
  361. writer.Write(")");
  362. }
  363. }
  364. #endregion
  365. }
  366. }