La conversion des coordonnées X, Y en lat / long en utilisant pyproj et Proj.4 renvoie les mauvaises coordonnées

10

J'écris un script python qui lit plusieurs fichiers XML contenant des coordonnées x et y et les combine tous dans un seul fichier csv. La latitude et la longitude sont des champs obligatoires dans le csv, mais j'ai du mal à convertir les coordonnées x, y dans l'Ohio North State Plane usFt en WGS84.

>>> p = Proj(r'+proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs') #Nad83 State Plane Ohio North US Feet Proj object using parameters
>>> p(739400.91,2339327.3,inverse=True)
(-80.138057868777224, 60.278230707978487)
>>> p1 = Proj(init="epsg:3734") #Nad83 State Plane Ohio North US Feet Proj object using EPSG code
>>> p1(739400.91,2339327.3,inverse=True)
(-80.138057868777224, 60.278230707978487)

Les deux méthodes ci-dessus renvoient le même résultat, mais ce dernier se situe quelque part dans la baie d'Hudson. Lorsque je trace les coordonnées dans ArcMap, la lat longue correcte est: -81.142311,41.688205.

* Notez que tous les lat longs sont fournis longtemps, lat car c'est l'ordre utilisé par Proj

Est-ce que quelqu'un sait pourquoi j'obtiendrais les mauvaises coordonnées de Proj.4 et pyproj?

Brian
la source

Réponses:

8

J'obtiens les mêmes résultats que @geographika lorsque je lance gdaltransformet l'outil proj.4 cs2cs:

$ gdaltransform -s_srs EPSG:3734 -t_srs EPSG:4326
739400.9 2339327.3             
-87.3195485720169 45.9860670658218 0

cs2cs +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs +to +proj=lonlat +datum=WGS84
739400.9 2339327.3
87d19'10.375"W 45d59'9.841"N 0.000

Inverser les coordonnées x et y de votre point donne cependant le résultat que vous voyez dans ArcMap:

gdaltransform -s_srs EPSG:3734 -t_srs EPSG:4326
2339327.3 739400.9
-81.1423086719059 41.6882035384526 0

Vous devrez donc effectuer une vérification visuelle pour vous assurer que vos coordonnées x et y sont correctes. C'est un problème que j'ai eu dans le passé lorsque vous obtenez deux résultats suffisamment similaires pour le mettre à une erreur d'arrondi ou quelque chose du genre.

MerseyViking
la source
19

PyProj suppose que vos coordonnées sont en mètres. Je suppose que quelque chose concernant les pieds / mètres est la cause du problème.

Appel d'une instance de classe Proj avec les arguments lon, lat convertira lon / lat (en degrés) en coordonnées de projection de carte natives x / y (en mètres)

Si le mot-clé facultatif 'preserve_units' est True, les unités dans les coordonnées de projection de la carte ne sont pas forcément des mètres.

http://pyproj.googlecode.com/svn/trunk/docs/pyproj.Proj-class.html

Vos coordonnées initiales sont-elles en pieds? Lorsque vous chargez les données dans ArcMap, quelles unités la carte utilise-t-elle?

Cela rapproche un peu les coordonnées:

p1 = Proj(init="epsg:3734")
#1 foot = 0.3048 meters
conv = 0.3048
print p1(739400.91 * conv,2339327.3 * conv,inverse=True)
(-87.3195533069909, 45.98605408134072)

Un problème similaire peut être trouvé ici .

geographika
la source
Merci beaucoup. L'argument préserv_units a certainement fait l'affaire, mais les coordonnées sont toujours incorrectes. @MerseyViking Cette réponse m'a donné les bonnes coordonnées. J'aimerais pouvoir marquer les deux réponses comme réponse parce qu'elles ont toutes deux aidé.
Brian
Eh bien, si les gens votent pour la réponse de @ geographika plus que la mienne, tout ira bien :) Heureux que tout ait fonctionné.
MerseyViking
puisque le lien est rompu, il pourrait être utile de montrer que vous pouvez écrire:p1 = Proj( init="epsg:3734", preserve_units=True )
BenjaminGolder
4

J'essayais en fait de faire la même chose, sauf avec la grille de l'avion de l'État sud de l'OH et je suis tombé sur votre question. J'obtenais de mauvais résultats avec 3735, maintenant j'obtiens des résultats corrects avec 3729. Je m'attends à ce que si vous changez de 3734 à 3728, vous obtiendrez les résultats corrects.

EPSG: 3728: NAD83 (NSRS2007) / Ohio North (ftUS) EPSG: 3729: NAD83 (NSRS2007) / Ohio South (ftUS) EPSG: 3734: NAD83 / Ohio North (ftUS) EPSG: 3735: NAD83 / Ohio South (ftUS)

J'ai utilisé votre lat fourni, long et je suis hors de moins d'un pied.

p2 = pyproj.Proj (init = "epsg: 3728", preserve_units = True)

p2 (-81.142311,41.688205)

(2339326.6558868014, 739401.4226131936)

vs 2339327.3, 739400.91

ingénieur minier
la source