0

J'ai converti les coordonnées UTM (X/Y) (Datum ED50) en latitude/longitude mais le résultat n'est pas exact. Une erreur d'au moins 500 mètres s'est produite.Imprécision pour convertir l'UTM en longitude

J'utilise la bibliothèque https://proj4net.codeplex.com/

Je pense que la clé est le Datum ED50

Voici mon code:

//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); 
} 

MISE À JOUR

J'ai aussi utilisé DotSpatial (https://dotspatial.codeplex.com) mais j'ai le même résultat:

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]; 
} 

MISE À JOUR 2 J'ai spécifié le code EPGS mais je n'obtiens pas le résultat attendu. Ceci est mon nouveau code:

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 semble mort. Vous devriez jeter un oeil à [DotSpacial] (http://dotspatial.codeplex.com/) car il a une communauté plus active. – wdosanjos

+0

Merci. J'ai aussi utilisé cette bibliothèque. J'ai mis à jour le post. – ratillo89

Répondre

0

Je pense que la clé est le Datum ED50

Et vous avez raison. Vous convertissez les coordonnées UTM avec la référence WGS84 en coordonnées LatLong avec la référence WGS84. Puisque vos coordonnées UTM utilisent la donnée ED50, vous devez la spécifier à la place de WGS84 pour les coordonnées d'origine.

Je ne suis pas familier avec DotSpatial mais une conjecture sauvage serait que vous devez faire quelque chose comme ceci:

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

(A condition que Hayford est le ellipsoïde approprié et ED50 utilisé dans le DotSpatial pour une telle référence.)

+0

J'ai implémenté votre solution mais cela n'a pas fonctionné pour moi. C'est mon code actuel: 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); Maintenant, je spécifie le "authorityCode" (code EPSG) mais je n'obtiens pas le résultat attendu. – ratillo89

+0

Combien d'erreurs obtenez-vous? Êtes-vous certain que l'ellipsoïde source est le bon pour vos coordonnées UTM source? Btw, il serait plus facile à lire et peut-être que d'autres peuvent vous aider si vous éditez votre message en ajoutant ce nouveau code. – jnovo

+0

@ ratillo89, essayez avec international 1924 (Hayford) – jnovo