Неточность преобразования UTM в широту и долготу

Я преобразовал координаты 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];
}

ОБНОВЛЕНИЕ 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];
}

person ratillo89    schedule 15.12.2015    source источник
comment
Proj4Net кажется мертвым. Вам следует обратить внимание на DotSpacial, так как у него более активное сообщество.   -  person Wagner DosAnjos    schedule 15.12.2015
comment
Спасибо. Я также использовал эту библиотеку. Я обновил пост.   -  person ratillo89    schedule 15.12.2015


Ответы (2)


Я думаю, что ключ Datum ED50

И вы правы. Вы конвертируете координаты UTM с датумом WGS84 в координаты LatLong с датумом WGS84. Поскольку ваши координаты UTM используют датум ED50, вы должны указать его вместо WGS84 для исходных координат.

Я не знаком с DotSpatial, но могу предположить, что вам нужно сделать что-то вроде этого:

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

(При условии, что Hayford является правильным эллипсоидом и ED50 используется в DotSpatial для таких данных.)

person jnovo    schedule 17.12.2015
comment
Я реализовал ваше решение, но оно не сработало для меня. Это мой текущий код: Источник ProjectionInfo = KnownCoordinateSystems.Projected.UtmOther.EuropeanDatum1950UTMZone30N; source.GeographicInfo.Datum.Spheroid.KnownEllipsoid = Proj4Ellipsoid.International_1909; source.AuthorityCode = 23030; ProjectionInfo dest = KnownCoordinateSystems.Geographic.World.WGS1984; dest.AuthorityCode = 4326; Reproject.ReprojectPoints(xy, z, источник, место назначения, 0, 1); Теперь я указываю authorCode (код EPSG), но не получаю ожидаемого результата. - person ratillo89; 18.12.2015
comment
Сколько ошибок вы получаете? Вы уверены, что исходный эллипсоид является правильным для ваших исходных координат UTM? Кстати, его было бы легче читать, и, возможно, другие могут помочь, если вы отредактируете свой пост, добавив этот новый код. - person jnovo; 18.12.2015
comment
@ratillo89, попробуйте интернациональный 1924 (Хейфорд) - person jnovo; 18.12.2015
comment
Спасибо! Я отредактировал свой пост. Я получаю ошибку 200 м или более. Я не знаю свой исходный эллипсоид, но если я введу исходные координаты на этой странице sumapa.com/ geocalc/geocalc.cfm работает нормально. - person ratillo89; 18.12.2015
comment
Proj4Ellipsoid.International_1924 кажется, что не существует в DosSpatial - person ratillo89; 18.12.2015
comment
@ ratillo89 ты нашел решение своей проблемы, потому что у меня такая же проблема. - person Kellie; 23.12.2020

Для тех из вас, кто интересуется, как перепроецировать в другие системы координат с помощью DotSpatial через шейп-файл, вот как я это делаю.

Вам понадобятся эти зависимости через nuget.

  • DotSpatial.Данные (v2.0.0-rc1)
  • DotSpatial.GeoAPI (v1.7.4.3)
  • DotSpatial.NetTopologySuite (v1.14.4)

    // open the shape file into a feature set
    var fs = FeatureSet.Open("someshapefile.shp");
    
    // fill the attributes table including related data from the dbf file 
    // this is not required but if you plan to access the data within the .dbf then you'll need to
    fs.FillAttributes();
    
    // check if the projection is not lat/lng
    // this assumes that the shapefile has a .prj file with projection info that it can parse
    if (!fs.Projection.IsLatLon)
    {
        // reproject to the coordinate system of your choice
        fs.Reproject(KnownCoordinateSystems.Geographic.World.WGS1984);
    }
    

Я предполагаю, что это будет работать от любой проекции к любой проекции, но я не тестировал другие.

person Ryan Tunis    schedule 21.06.2018