使用NetTopologySuite TransformGeometry时出错
本文关键字:出错 TransformGeometry NetTopologySuite 使用 | 更新日期: 2023-09-27 18:23:42
我正在尝试读取一个将英国北向/东向坐标系(BritishNationalGridOSGB36)转换为纬度/经度(WGS1984)的形状文件。我在这里找到了一篇关于如何使用NetTopologySuite来实现这一点的优秀文章。形状文件的读取效果很好,但在加载过程中转换地理位置时会遇到问题。
我已经将问题归结为NetTopologySuite TransformGeometry方法。如果我使用DotSpattial ReprojectPoints变换一个点,它会正确工作(一旦我对BritishNationalGridOSGB36有了正确的定义,请参阅此处以获取有关这方面的有用文章)。然而,NetTopologySuite的TransformGeometry给了我一个错误的答案。答案在两个方面是错误的
- 它在经度中具有纬度值(应为-0.0935399303)
- 纬度是181560(应该是51.517489)
我想使用NetTopologySuite的TransformGeometry,因为它处理几何图形比取消拾取每个坐标并更改它要好得多。我还认为我一定做了一些愚蠢的事情,所以我想修复它并学习。
这是我的NUNIT测试代码。
class TestConvert
{
//The standard DotSpatial definition, KnownCoordinateSystems.Projected.NationalGrids.BritishNationalGridOSGB36, is incorrect so needed defined string below
const string BritishNationalGridOsgb36String = "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894 +units=m +no_defs";
readonly ProjectionInfo _britishNationalGridOsgb36 = ProjectionInfo.FromProj4String(BritishNationalGridOsgb36String);
readonly ProjectionInfo _wgs84 = KnownCoordinateSystems.Geographic.World.WGS1984;
[Test]
public void ConvertAPointUsingDotSpatialReproject()
{
//SETUP
var xy = new double[] { 532248.29992272425, 181560.30052819476 };
var z = new double[] { 0 };
//ATTEMPT
Reproject.ReprojectPoints(xy, z,
_britishNationalGridOsgb36, _wgs84, 0, z.Length);
//VERIFY
xy[0].ShouldEqualWithTolerance(-0.095399303, 0.001);
xy[1].ShouldEqualWithTolerance(51.517489, 0.001);
}
[Test]
public void ConvertAPointUsingNetTopologySuiteTransformGeometry()
{
//SETUP
var factory = NetTopologySuite.Geometries.GeometryFactory.Default;
var pointNatGrid = new NetTopologySuite.Geometries.Point(532248.29992272425, 181560.30052819476);
//ATTEMPT
var transform = new DotSpatialMathTransform(
_britishNationalGridOsgb36, _wgs84);
var result = GeometryTransform.TransformGeometry(
factory, pointNatGrid, transform);
//VERIFY
result.GeometryType.ShouldEqual("Point");
result.Coordinates.Count().ShouldEqual(1);
result.Coordinates[0].X.ShouldEqualWithTolerance(-0.095399303, 0.001);
result.Coordinates[0].Y.ShouldEqualWithTolerance(51.517489, 0.001);
}
}
第一个测试通过,第二个测试在ShouldEqualWithTolerance测试中均失败。
非常感谢您的帮助。
在进一步的研究中,我在NetTopologySuite.CoordinateSystems.Transformation.DotSpatial.Projections代码中发现了一个错误。我报告了它,现在已经修复。请参阅此处了解我发现的问题的详细信息,并确认该问题已得到修复。http://code.google.com/p/nettopologysuite/issues/detail?id=152