UK Northing/Eastings 座標系 (BritishNationalGridOSGB36) を持つシェープファイルを緯度/経度 (WGS1984) に読み込もうとしています。NetTopologySuite を使用してこれを行う方法に関する優れた投稿を見つけました。シェープファイルの読み取りは正常に機能しますが、ロード中に地理を変換するときに問題が発生します。
問題を NetTopologySuite TransformGeometry メソッドに突き止めました。DotSpatial ReprojectPoints を使用してポイントを変換すると、正しく機能します (BritishNationalGridOSGB36 の正しい定義が得られたら、これに関する有用な投稿についてはこちらを参照してください)。しかし、NetTopologySuite の TransformGeometry は間違った答えを出してくれます。答えは2つの点で間違っています
- 経度に緯度の値があります (-0.095399303 である必要があります)
- 緯度は 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);
}
}
最初のテストはパスし、2 番目のテストは両方の ShouldEqualWithTolerance テストで失敗します。
あなたの助けをいただければ幸いです。