1

UTM 座標 (X/Y) (Datum ED50) を緯度/経度に変換しましたが、結果が正確ではありません。少なくとも 500 メートルの誤差があります。

ライブラリを使用しましたhttps://proj4net.codeplex.com/

キーは Datum ED50 だと思います

これは私のコードです:

//Zone: 30N
public static string ConvertTolatlngString(double utmX, double utmY)
{

//Transform to latlong
CoordinateTransformationFactory ctfac = new CoordinateTransformationFactory();
ICoordinateSystem wgs84geo = ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84;
ICoordinateSystem utm = ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WGS84_UTM(30, true);
ICoordinateTransformation trans = ctfac.CreateFromCoordinateSystems(utm,wgs84geo);
double[] pUtm = trans.MathTransform.Transform(new double[] { utmX, utmY });

double latfromutm = pUtm[1];
double longfromutm = pUtm[0];

return String.Format("{0},{1}", latfromutm,longfromutm);
}

更新しました

DotSpatial ( https://dotspatial.codeplex.com ) も使用しましたが、同じ結果が得られます。

public static void UTMToLatLongDSP(double X, double Y, out double latitude, out double longitude)
{
    double[] XY = new double[2];
    XY[0] = X;
    XY[1] = Y;

    double[] Z = new double[1];
    Z[0] = 1;

    string utmStr = "+proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs ";
    }

    ProjectionInfo projIn = ProjectionInfo.FromProj4String(utmStr);
    ProjectionInfo projOut = KnownCoordinateSystems.Geographic.World.WGS1984;
    Reproject.ReprojectPoints(XY, Z, projIn, projOut, 0, 1);

    longitude = XY[0];
    latitude = XY[1];
}

UPDATE 2 EPGS コードを指定しましたが、期待した結果が得られません。これは私の新しいコードです:

public static void UTMToLatLongDSP(double X, double Y, out double latitude, out double longitude)
{
    double[] xy = new double[] { X, Y };
    double[] z = new double[] { 0 };

    // Source projection information.
    ProjectionInfo source = KnownCoordinateSystems.Projected.UtmOther.EuropeanDatum1950UTMZone30N;
    source.GeographicInfo.Datum.Spheroid.KnownEllipsoid = Proj4Ellipsoid.International_1909;
    source.AuthorityCode = 23030;

    // Destination projection information
    ProjectionInfo dest = KnownCoordinateSystems.Geographic.World.WGS1984;
    dest.AuthorityCode = 4326;

    // Call the projection utility.
    Reproject.ReprojectPoints(xy, z, source, dest, 0, 1);

    longitude = xy[0];
    latitude = xy[1];
}
4

2 に答える 2

0

キーは Datum ED50 だと思います

そして、あなたは正しいです。データム WGS84 の UTM 座標をデータム WGS84 の LatLong 座標に変換しています。UTM 座標はデータム ED50 を使用するため、元の座標の WGS84 の代わりにそれを指定する必要があります。

私は DotSpatial に精通していませんが、次のようなことをする必要があると思われます:

string utmStr = "+proj=utm +zone=30 +ellps=Hayford +datum=ED50 +units=m +no_defs ";

( Hayfordが適切な楕円体であり、ED50がそのようなデータに対して DotSpatial で使用される場合)。

于 2015-12-17T16:07:02.543 に答える