Fehler bei der Verwendung von NetTopologySuite TransformGeometry - c #, .net, gis, nettopologisuite

Ich versuche, in einem Shapefile, das UK Northing / Eastings Koordinatensystem (BritishNationalGridOSGB36) in Breite / Länge (WGS1984) hat, zu lesen. Ich habe einen ausgezeichneten Beitrag gefunden Hier wie man NetTopologySuite dazu benutzt. Das Lesen der Shapefile funktioniert gut, aber ich bekomme Probleme bei der Transformation der Geographie während der Ladung.

Ich habe das Problem auf dieNetTopologySuite TransformGeometry-Methode. Wenn ich einen Punkt mit den DotSpatial ReprojectPoints transformiere, funktioniert es korrekt (sobald ich die richtige Definition für BritishNationalGridOSGB36 habe, siehe Hier für einen nützlichen Beitrag dazu). Aber die TransformGeometry von NetTopologySuite gibt mir eine falsche Antwort. Die Antwort ist in zweierlei Hinsicht falsch

  1. es hat den Breitengradwert in der Länge (sollte -0.095399303 sein)
  2. der Breitengrad ist 181560 (sollte 51.517489 sein)

Ich möchte NetTopologySuite "s verwendenTransformGeometry, da es Geometrien viel besser handhabt, als jede Koordinate zu entfernen und sie zu ändern. Ich denke auch, dass ich etwas Dummes getan habe, also möchte ich es reparieren und lernen.

Hier ist mein NUNIT-Testcode.

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);
}

}

Der erste Test besteht, der zweite Test schlägt beide ShouldEqualWithTolerance Tests fehl.

Ihre Hilfe wäre willkommen.

Antworten:

2 für die Antwort № 1

Bei weiteren Recherchen fand ich einen Fehler in derNetTopologySuite.CoordinateSystems.Transformation.DotSpatial.Projections-Code. Ich habe es gemeldet und es ist jetzt behoben. Hier finden Sie Details zu dem Problem, das ich gefunden habe und Bestätigung, dass es behoben wurde. http://code.google.com/p/nettopologysuite/issues/detail?id=152