C# 将UTM转换为经纬度的不精确性

C# 将UTM转换为经纬度的不精确性,c#,coordinate-systems,coordinate-transformation,utm,dotspatial,C#,Coordinate Systems,Coordinate Transformation,Utm,Dotspatial,我将UTM坐标(X/Y)(基准ED50)转换为纬度/经度,但结果不准确。至少有500米的误差 我用过图书馆 我认为关键是数据ED50 这是我的代码: //Zone: 30N public static string ConvertTolatlngString(double utmX, double utmY) { //Transform to latlong CoordinateTransformationFactory ctfac = new CoordinateTransformation

我将UTM坐标(X/Y)(基准ED50)转换为纬度/经度,但结果不准确。至少有500米的误差

我用过图书馆

我认为关键是数据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(),但得到了相同的结果:

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];
}
更新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];
}
我认为关键是数据ED50

你是对的。您正在将基准WGS84的UTM坐标转换为基准WGS84的LatLong坐标。由于UTM坐标使用基准ED50,因此必须为原始坐标指定基准ED50,而不是WGS84

我不熟悉DotSpatial,但我猜测您需要这样做:

string utmStr = "+proj=utm +zone=30 +ellps=Hayford +datum=ED50 +units=m +no_defs ";
(前提是Hayford是合适的椭球体,并且ED50在DotSpatial中用于该基准。)

我认为关键是数据ED50

你是对的。您正在将基准WGS84的UTM坐标转换为基准WGS84的LatLong坐标。由于UTM坐标使用基准ED50,因此必须为原始坐标指定基准ED50,而不是WGS84

我不熟悉DotSpatial,但我猜测您需要这样做:

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

(假设Hayford是合适的椭球体,ED50在DotSpatial中用于此类基准。)

对于那些想知道如何通过形状文件使用DotSpatial重新投影到不同坐标系的人,我就是这样做的

通过nuget,您将需要这些依赖项

  • DotSpatial.Data(v2.0.0-rc1)
  • DotSpatial.GeoAPI(v1.7.4.3)
  • DotSpatial.nettpologysuite(v1.14.4)


我假设这可以从任何投影到任何投影,但我没有测试其他投影。

对于那些想知道如何通过形状文件使用DotSpatial重新投影到不同坐标系的人,我就是这样做的

通过nuget,您将需要这些依赖项

  • DotSpatial.Data(v2.0.0-rc1)
  • DotSpatial.GeoAPI(v1.7.4.3)
  • DotSpatial.nettpologysuite(v1.14.4)


我假设这可以从任何投影到任何投影,但我还没有测试其他投影。

Proj4Net似乎已经死了。你应该看看,因为它有一个更活跃的社区。谢谢。我也用过这个图书馆。我已经更新了post.Proj4Net似乎死了。你应该看看,因为它有一个更活跃的社区。谢谢。我也用过这个图书馆。我已经更新了帖子。我实现了你的解决方案,但它对我不起作用。这是我当前的代码:ProjectionInfo source=known坐标系.Projected.UtmOther.EuropeanDatum1950UTMZone30N;source.GeographicInfo.Datum.Spheroid.KnownEllipsoid=proj4椭球体.International_1909;source.AuthorityCode=23030;ProjectionInfo dest=known坐标系.Geographic.World.WGS1984;dest.AuthorityCode=4326;重投影。重投影点(xy,z,源,目标,0,1);现在,我指定了“authorityCode”(EPSG代码),但没有得到预期的结果。您得到了多少错误?是否确定源椭球体是源UTM坐标的正确椭球体?顺便说一句,如果你编辑你的文章并添加新的代码,它会更容易阅读,也许其他人可以帮助你。@ratillo89,试试国际1924(Hayford)谢谢!我编辑了我的帖子。我得到了200米或更大的误差。我不知道我的源椭球体,但如果我在此页面中输入源坐标,效果很好。proj4elpiloid.International_1924似乎在DosSpatialI中不存在,但它对我不起作用。这是我当前的代码:ProjectionInfo source=known坐标系.Projected.UtmOther.EuropeanDatum1950UTMZone30N;source.GeographicInfo.Datum.Spheroid.KnownEllipsoid=proj4椭球体.International_1909;source.AuthorityCode=23030;ProjectionInfo dest=known坐标系.Geographic.World.WGS1984;dest.AuthorityCode=4326;重投影。重投影点(xy,z,源,目标,0,1);现在,我指定了“authorityCode”(EPSG代码),但没有得到预期的结果。您得到了多少错误?是否确定源椭球体是源UTM坐标的正确椭球体?顺便说一句,如果你编辑你的文章并添加新的代码,它会更容易阅读,也许其他人可以帮助你。@ratillo89,试试国际1924(Hayford)谢谢!我编辑了我的帖子。我得到了200米或更大的误差。我不知道我的源椭球体,但如果我在本页中输入源坐标,效果会很好。proj4eliploid.International_1924似乎不存在于DosSpatial中