gpt4 book ai didi

c# - 使用 NetTopologySuite TransformGeometry 时出错

转载 作者:行者123 更新时间:2023-11-30 17:04:17 25 4
gpt4 key购买 nike

我正在尝试将具有英国北距/东距坐标系 (BritishNationalGridOSGB36) 的 shapefile 读入纬度/经度 (WGS1984)。我找到了一篇很棒的帖子 here关于如何使用 NetTopologySuite 来执行此操作。 shapefile 的读取工作正常,但在加载过程中转换地理时遇到问题。

我已将问题归结为 NetTopologySuite TransformGeometry 方法。如果我使用 DotSpatial ReprojectPoints 转换一个点,它会正常工作(一旦我对 BritishNationalGridOSGB36 有了正确的定义,请参阅 here 以获得关于此的有用帖子)。然而 NetTopologySuite 的 TransformGeometry 给了我一个错误的答案。答案在两个方面是错误的

  1. 它有经度的纬度值(应该是-0.095399303)
  2. 纬度是 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

关于c# - 使用 NetTopologySuite TransformGeometry 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17705061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com