首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NetTopologySuite TransformGeometry时出错

使用NetTopologySuite TransformGeometry时出错
EN

Stack Overflow用户
提问于 2013-07-17 16:15:24
回答 1查看 2.8K关注 0票数 3

我正在尝试读取一个将英国东北/东坐标系(BritishNationalGridOSGB36)转换为纬度/经度(WGS1984)的shapefile。我找到了一篇关于如何使用这里来实现这一目的的优秀文章NetTopologySuite。shapefile的读取工作良好,但在加载期间转换地理位置时会遇到问题。

我把这个问题归结为NetTopologySuite TransformGeometry方法。如果我使用DotSpatial ReprojectPoints转换了一个点,它就能正常工作(一旦我对BritishNationalGridOSGB36有了正确的定义,请参阅这里以获得有用的文章)。然而,NetTopologySuite的TransformGeometry给了我一个错误的答案。答案在两个方面是错误的。

  1. 它在经度中具有纬度值(应该是-0.095399303)
  2. 纬度是181560 (应该是51.517489)

我想使用NetTopologySuite的TransformGeometry,因为它处理几何学比取消每个坐标并更改它要好得多。我也认为我一定做了些什么,所以我想修复它,并学习。

这是我的NUNIT测试代码。

代码语言:javascript
复制
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测试上都失败。

你的帮助将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2013-07-18 14:38:42

在进一步的研究中,我发现了NetTopologySuite.CoordinateSystems.Transformation.DotSpatial.Projections代码中的一个bug。我报告过了,现在已经修好了。有关我发现的问题的详细信息,请看这里,并确认它已经解决了。http://code.google.com/p/nettopologysuite/issues/detail?id=152

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17705061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档