Ошибка при использовании NetTopologySuite TransformGeometry

Я пытаюсь прочитать в шейп-файле, который имеет систему координат Северный / Восточный в Великобритании (BritishNationalGridOSGB36), в широту / долготу (WGS1984). Я нашел отличный пост здесь о том, как использовать NetTopologySuite для этого. Чтение шейп-файла работает нормально, но у меня возникают проблемы при преобразовании географии во время загрузки.

Я связал проблему с методом NetTopologySuite TransformGeometry. Если я преобразую точку, используя точки DotSpatial ReprojectPoints, она будет работать правильно (если у меня есть правильное определение для BritishNationalGridOSGB36, см. Здесь полезную статью об этом). Однако TransformGeometry от NetTopologySuite дает мне неправильный ответ. Ответ неверен в двух отношениях

  1. оно имеет значение широты в долготе (должно быть -0,095399303)
  2. Широта 181560 (должна быть 51,517489)

Я хочу использовать TransformGeometry от NetTopologySuite, так как он обрабатывает геометрию намного лучше, чем снимает отметку с каждой координаты и изменяет ее. Я также думаю, что, должно быть, сделал что-то глупое, поэтому я хочу исправить это и учиться.

Вот мой тестовый код 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);
    }

}

Первый тест пройден, второй тест не пройден в обоих тестах NeedEqualWithTolerance.

Ваша помощь будет оценена.

1 ответ

В ходе дальнейших исследований я нашел ошибку в коде NetTopologySuite.CoordinateSystems.Transformation.DotSpatial.Projection. Я сообщил об этом, и теперь это исправлено. Смотрите здесь подробности проблемы, которую я нашел, и подтверждение того, что она была исправлена. http://code.google.com/p/nettopologysuite/issues/detail?id=152

Другие вопросы по тегам