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

GIS编程

开发平台:

C#

  1. // Copyright 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.Transformations
  21. {
  22. /// <summary>
  23. /// Transformation for applying 
  24. /// </summary>
  25. internal class DatumTransform : MathTransform
  26. {
  27. protected IMathTransform _inverse;
  28. private Wgs84ConversionInfo _ToWgs94;
  29. double[] v;
  30. private bool _isInverse = false;
  31. public DatumTransform(Wgs84ConversionInfo towgs84) : this(towgs84,false)
  32. {
  33. }
  34. private DatumTransform(Wgs84ConversionInfo towgs84, bool isInverse)
  35. {
  36. _ToWgs94 = towgs84;
  37. v = _ToWgs94.GetAffineTransform();
  38. _isInverse = isInverse;
  39. }
  40. public override string WKT
  41. {
  42. get { throw new Exception("The method or operation is not implemented."); }
  43. }
  44. public override string XML
  45. {
  46. get { throw new Exception("The method or operation is not implemented."); }
  47. }
  48. public override IMathTransform Inverse()
  49. {
  50. if (_inverse == null)
  51. _inverse = new DatumTransform(_ToWgs94,!_isInverse);
  52. return _inverse;
  53. }
  54. private SharpMap.Geometries.Point3D Apply(SharpMap.Geometries.Point3D p)
  55. {
  56. return new SharpMap.Geometries.Point3D(
  57. v[0] * p.X - v[3] * p.Y + v[2] * p.Z + v[4],
  58. v[3] * p.X + v[0] * p.Y - v[1] * p.Z + v[5],
  59.    -v[2] * p.X + v[1] * p.Y + v[0] * p.Z + v[6]);
  60. //double[,] v = GetAffineTransform();
  61. //return new SharpMap.Geometries.Point3D(
  62. //    v[0, 0] * p.X + v[0, 1] * p.Y + v[0, 2] * p.Z + v[0, 3],
  63. //    v[1, 0] * p.X + v[1, 1] * p.Y + v[1, 2] * p.Z + v[1, 3],
  64. //    v[2, 0] * p.X + v[2, 1] * p.Y + v[2, 2] * p.Z + v[2, 3]);
  65. }
  66. private SharpMap.Geometries.Point3D ApplyInverted(SharpMap.Geometries.Point3D p)
  67. {
  68. return new SharpMap.Geometries.Point3D(
  69. v[0] * p.X + v[3] * p.Y - v[2] * p.Z - v[4],
  70.    -v[3] * p.X + v[0] * p.Y + v[1] * p.Z - v[5],
  71.     v[2] * p.X - v[1] * p.Y + v[0] * p.Z - v[6]);
  72. //double[,] v = GetAffineTransform();
  73. //return new SharpMap.Geometries.Point3D(
  74. //    v[0, 0] * p.X + v[0, 1] * p.Y + v[0, 2] * p.Z + v[0, 3],
  75. //    v[1, 0] * p.X + v[1, 1] * p.Y + v[1, 2] * p.Z + v[1, 3],
  76. //    v[2, 0] * p.X + v[2, 1] * p.Y + v[2, 2] * p.Z + v[2, 3]);
  77. }
  78. public override SharpMap.Geometries.Point Transform(SharpMap.Geometries.Point point)
  79. {
  80. if (!(point is SharpMap.Geometries.Point3D))
  81. throw new ArgumentException("Datum transformation requires a 3D point");
  82. if (!_isInverse)
  83. return Apply(point as SharpMap.Geometries.Point3D);
  84. else
  85. return ApplyInverted(point as SharpMap.Geometries.Point3D);
  86. }
  87. public override Collection<SharpMap.Geometries.Point> TransformList(Collection<SharpMap.Geometries.Point> points)
  88. {
  89.             //Collection<SharpMap.Geometries.Point> pnts = new Collection<SharpMap.Geometries.Point>(points.Count);
  90.             Collection<SharpMap.Geometries.Point> pnts = new Collection<SharpMap.Geometries.Point>();
  91. foreach(SharpMap.Geometries.Point p in points)
  92. pnts.Add(Transform(p));
  93. return pnts;
  94. }
  95. public override void Invert()
  96. {
  97. _isInverse = !_isInverse;
  98. }
  99. }
  100. }