2013-07-17 115 views
2

我正在尝试将英国Northing/Eastings坐标系(BritishNationalGridOSGB36)的shapefile读入经度/纬度(WGS1984)。关于如何使用NetTopologySuite执行此操作,我发现了一篇优秀的文章here。 shapefile的读取工作正常,但在加载期间转换地理位置时出现问题。使用NetTopologySuite时发生错误TransformGeometry

我已将问题归结为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测试上都失败。

您的帮助,将不胜感激。

回答

2

在进一步的研究中,我发现NetTopologySuite.CoordinateSystems.Transformation.DotSpatial.Projections代码中存在一个错误。我报告了它,现在它已经修复。有关我发现的问题的详细信息,请参阅此处并确认它已得到修复。 http://code.google.com/p/nettopologysuite/issues/detail?id=152