GeometryTransform.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. using SharpMap.Geometries;
  21. namespace SharpMap.CoordinateSystems.Transformations
  22. {
  23. /// <summary>
  24. /// Helper class for transforming <see cref="SharpMap.Geometries.Geometry"/>
  25. /// </summary>
  26. public class GeometryTransform
  27. {
  28. /// <summary>
  29. /// Transforms a <see cref="SharpMap.Geometries.BoundingBox"/>.
  30. /// </summary>
  31. /// <param name="box">BoundingBox to transform</param>
  32. /// <param name="transform">Math Transform</param>
  33. /// <returns>Transformed object</returns>
  34. public static BoundingBox TransformBox(BoundingBox box, IMathTransform transform)
  35. {
  36. if (box == null)
  37. return null;
  38. SharpMap.Geometries.Point[] corners = new Point[4];
  39. corners[0] = transform.Transform(box.Min); //LL
  40. corners[1] = transform.Transform(box.Max); //UR
  41. corners[2] = transform.Transform(new Point(box.Min.X, box.Max.Y)); //UL
  42. corners[3] = transform.Transform(new Point(box.Max.X, box.Min.Y)); //LR
  43. BoundingBox result = corners[0].GetBoundingBox();
  44. for (int i = 1; i < 4; i++)
  45. result = result.Join(corners[i].GetBoundingBox());
  46. return result;
  47. }
  48. /// <summary>
  49. /// Transforms a <see cref="SharpMap.Geometries.Geometry"/>.
  50. /// </summary>
  51. /// <param name="g">Geometry to transform</param>
  52. /// <param name="transform">MathTransform</param>
  53. /// <returns>Transformed Geometry</returns>
  54. public static Geometry TransformGeometry(Geometry g, IMathTransform transform)
  55. {
  56. if (g==null)
  57. return null;
  58. else if (g is Point)
  59. return TransformPoint(g as Point, transform);
  60. else if (g is LineString)
  61. return TransformLineString(g as LineString, transform);
  62. else if (g is Polygon)
  63. return TransformPolygon(g as Polygon, transform);
  64. else if (g is MultiPoint)
  65. return TransformMultiPoint(g as MultiPoint, transform);
  66. else if (g is MultiLineString)
  67. return TransformMultiLineString(g as MultiLineString, transform);
  68. else if (g is MultiPolygon)
  69. return TransformMultiPolygon(g as MultiPolygon, transform);
  70. else
  71. throw new ArgumentException("Could not transform geometry type '" + g.GetType().ToString() +"'");
  72. }
  73. /// <summary>
  74. /// Transforms a <see cref="SharpMap.Geometries.Point"/>.
  75. /// </summary>
  76. /// <param name="p">Point to transform</param>
  77. /// <param name="transform">MathTransform</param>
  78. /// <returns>Transformed Point</returns>
  79. public static Point TransformPoint(Point p, IMathTransform transform)
  80. {
  81. try { return transform.Transform(p); }
  82. catch { return null; }
  83. }
  84. /// <summary>
  85. /// Transforms a <see cref="SharpMap.Geometries.LineString"/>.
  86. /// </summary>
  87. /// <param name="l">LineString to transform</param>
  88. /// <param name="transform">MathTransform</param>
  89. /// <returns>Transformed LineString</returns>
  90. public static LineString TransformLineString(LineString l, IMathTransform transform)
  91. {
  92. try { return new LineString(transform.TransformList(l.Vertices)); }
  93. catch { return null; }
  94. }
  95. /// <summary>
  96. /// Transforms a <see cref="SharpMap.Geometries.LinearRing"/>.
  97. /// </summary>
  98. /// <param name="r">LinearRing to transform</param>
  99. /// <param name="transform">MathTransform</param>
  100. /// <returns>Transformed LinearRing</returns>
  101. public static LinearRing TransformLinearRing(LinearRing r, IMathTransform transform)
  102. {
  103. try { return new LinearRing(transform.TransformList(r.Vertices)); }
  104. catch { return null; }
  105. }
  106. /// <summary>
  107. /// Transforms a <see cref="SharpMap.Geometries.Polygon"/>.
  108. /// </summary>
  109. /// <param name="p">Polygon to transform</param>
  110. /// <param name="transform">MathTransform</param>
  111. /// <returns>Transformed Polygon</returns>
  112. public static Polygon TransformPolygon(Polygon p, IMathTransform transform)
  113. {
  114. Polygon pOut = new Polygon(TransformLinearRing(p.ExteriorRing, transform));
  115.             //pOut.InteriorRings = new Collection<LinearRing>(p.InteriorRings.Count); //Pre-inialize array size for better performance
  116.             pOut.InteriorRings = new Collection<LinearRing>();
  117. for (int i = 0; i < p.InteriorRings.Count; i++)
  118. pOut.InteriorRings.Add(TransformLinearRing(p.InteriorRings[i], transform));
  119. return pOut;
  120. }
  121. /// <summary>
  122. /// Transforms a <see cref="SharpMap.Geometries.MultiPoint"/>.
  123. /// </summary>
  124. /// <param name="points">MultiPoint to transform</param>
  125. /// <param name="transform">MathTransform</param>
  126. /// <returns>Transformed MultiPoint</returns>
  127. public static MultiPoint TransformMultiPoint(MultiPoint points, IMathTransform transform)
  128. {
  129. MultiPoint pOut = new MultiPoint();
  130. pOut.Points = transform.TransformList(points.Points);
  131. return pOut;
  132. }
  133. /// <summary>
  134. /// Transforms a <see cref="SharpMap.Geometries.MultiLineString"/>.
  135. /// </summary>
  136. /// <param name="lines">MultiLineString to transform</param>
  137. /// <param name="transform">MathTransform</param>
  138. /// <returns>Transformed MultiLineString</returns>
  139. public static MultiLineString TransformMultiLineString(MultiLineString lines, IMathTransform transform)
  140. {
  141. MultiLineString lOut = new MultiLineString();
  142.             //lOut.LineStrings = new Collection<LineString>(lines.LineStrings.Count); //Pre-inialize array size for better performance
  143.             lOut.LineStrings = new Collection<LineString>(); //Pre-inialize array size for better performance
  144. for (int i = 0; i < lines.LineStrings.Count;i++ )
  145. lOut.LineStrings.Add(TransformLineString(lines[i], transform));
  146. return lOut;
  147. }
  148. /// <summary>
  149. /// Transforms a <see cref="SharpMap.Geometries.MultiPolygon"/>.
  150. /// </summary>
  151. /// <param name="polys">MultiPolygon to transform</param>
  152. /// <param name="transform">MathTransform</param>
  153. /// <returns>Transformed MultiPolygon</returns>
  154. public static MultiPolygon TransformMultiPolygon(MultiPolygon polys, IMathTransform transform)
  155. {
  156. MultiPolygon pOut = new MultiPolygon();
  157.             //pOut.Polygons = new Collection<Polygon>(polys.Polygons.Count); //Pre-inialize array size for better performance
  158.             pOut.Polygons = new Collection<Polygon>();
  159. for (int i = 0; i < polys.NumGeometries; i++)
  160. pOut.Polygons.Add(TransformPolygon(polys[i], transform));
  161. return pOut;
  162. }
  163. /// <summary>
  164. /// Transforms a <see cref="SharpMap.Geometries.GeometryCollection"/>.
  165. /// </summary>
  166. /// <param name="geoms">GeometryCollection to transform</param>
  167. /// <param name="transform">MathTransform</param>
  168. /// <returns>Transformed GeometryCollection</returns>
  169. public static GeometryCollection TransformGeometryCollection(GeometryCollection geoms, IMathTransform transform)
  170. {
  171. GeometryCollection gOut = new GeometryCollection();
  172.             //gOut.Collection = new Collection<Geometry>(geoms.Collection.Count); //Pre-inialize array size for better performance
  173.             gOut.Collection = new Collection<Geometry>(); //Pre-inialize array size for better performance
  174. for (int i = 0; i < geoms.Collection.Count;i++ )
  175. gOut.Collection.Add(TransformGeometry(geoms[i], transform));
  176. return gOut;
  177. }
  178. }
  179. }