0

Я преобразовал координаты UTM (X/Y) (Datum ED50) в широту/долготу, но результат не является точным. Ошибка составляет не менее 500 метров.Неточность для преобразования UTM в широту долготы

Я использовал библиотеку 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]; 
} 
+0

Proj4Net кажется мертвым. Вы должны взглянуть на [DotSpacial] (http://dotspatial.codeplex.com/), поскольку он имеет более активное сообщество. – wdosanjos

+0

Спасибо. Я также использовал эту библиотеку. Я обновил сообщение. – ratillo89

ответ

0

Я думаю, что ключ является Datum ED50

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

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

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

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

+0

Я реализовал ваше решение, но оно не сработало для меня. Это мой текущий код: ProjectionInfo source = 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, source, dest, 0, 1); Теперь я задаю «authorityCode» (код EPSG), но я не получаю ожидаемого результата. – ratillo89

+0

Насколько вы ошибаетесь? Вы уверены, что исходный эллипсоид является правильным для ваших исходных координат UTM? Кстати, было бы легче читать, и, возможно, другие могут помочь, если вы отредактируете свой пост, добавив новый код. – jnovo

+0

@ ratillo89, попробуйте с международным 1924 (Hayford) – jnovo

Смежные вопросы