84 votos

¿Cómo convertir coordenadas proyectadas a lat/lon utilizando Python?

Supongo que es una pregunta básica pero no consigo encontrar o reconocer la solución.

Este sitio devuelve

Point:
X: -11705274.6374
Y: 4826473.6922

al buscar con el primer valor de la clave 000090 como ejemplo. Supongo que se trata de una referencia espacial y más o menos entiendo lo que es.

Estoy buscando instrucciones o ejemplos de cómo convertir esto en Latitud y Longitud usando Python.

146voto

Nikola Puntos 21

La forma más sencilla de transformar coordenadas en Python es pyproj es decir, el Interfaz de Python para la biblioteca PROJ.4 . De hecho:

from pyproj import Proj, transform

inProj = Proj(init='epsg:3857')
outProj = Proj(init='epsg:4326')
x1,y1 = -11705274.6374,4826473.6922
x2,y2 = transform(inProj,outProj,x1,y1)
print x2,y2

devuelve -105.150271116 39.7278572773


EDITADO a partir del comentario de Marc:

pyproj 2.4 da un FutureWarning sobre el deprecated Proj inicialización con el init= sintaxis. La sintaxis actualizada es idéntica pero sin el init= . Así:

inProj = Proj('epsg:3857')
outProj = Proj('epsg:4326')

0 votos

pyproj 2.4 da un FutureWarning sobre la inicialización de Proj() obsoleta con el init= sintaxis. La sintaxis actualizada es idéntica pero sin el init= . Así: inProj = Proj('epsg:3857') y outProj = Proj('epsg:4326')

1 votos

He quitado el 'init=' basado en la edición, pero mi salida de transform(inProj,outProj,x1,y1) me dio (latitude, longitude) en lugar de (longitude, latitude) . ¿Alguien sabe por qué?

2 votos

38voto

Peter and the wolf Puntos 121

Por defecto, el sitio al que ha enlazado utiliza el Sistema de Referencia Espacial EPSG 3857 (WGS84 Web Mercator). He encontrado esta información aquí .

Puede especificar otro Sistema de Referencia Espacial introduciendo el EPSG deseado en el formulario bajo Spatial Reference o puede convertir las coordenadas devueltas con Python.

Por ejemplo, puede utilizar el Enlaces GDAL Python para convertir este punto del sistema de coordenadas proyectadas (EPSG 3857) a un sistema de coordenadas geográficas (EPSG 4326).

import ogr, osr

pointX = -11705274.6374 
pointY = 4826473.6922

# Spatial Reference System
inputEPSG = 3857
outputEPSG = 4326

# create a geometry from coordinates
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(pointX, pointY)

# create coordinate transformation
inSpatialRef = osr.SpatialReference()
inSpatialRef.ImportFromEPSG(inputEPSG)

outSpatialRef = osr.SpatialReference()
outSpatialRef.ImportFromEPSG(outputEPSG)

coordTransform = osr.CoordinateTransformation(inSpatialRef, outSpatialRef)

# transform point
point.Transform(coordTransform)

# print point in EPSG 4326
print point.GetX(), point.GetY()

Esto devuelve para su punto las coordenadas de -105.150271116 39.7278572773 .

10voto

Celeritas Puntos 228

afalciano tiene la respuesta correcta pero quería incluir una variante de uso de pyproj.

Es hace requiere que conozcas la cadena proj4 y es un poco más rápido.

import pyproj
p = pyproj.Proj("+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs")
lon, lat = p(x, y, inverse=True)
print lat, lon

2 votos

No necesitas la cadena proj4, sustituye la segunda línea por p = pyproj.Proj(init='epsg:3857') y el resultado es el mismo.

1 votos

El resultado es el mismo, pero la última vez que lo comprobé era un poco más rápido.

3 votos

Aunque no era la intención de esta respuesta, es especialmente útil cuando se tiene una proyección totalmente personalizada, que no aparece en el repositorio EPSG.

8voto

Lucas Puntos 128

La salida no es un sistema de referencia espacial/de coordenadas es un par de coordenadas. Es necesario saber cuál es la referencia espacial para reproyectar las coordenadas.

Sin embargo, eso no es necesario en este caso. Basta con pasar una referencia espacial de salida adecuada al servicio y éste devolverá las coordenadas en Lon/Lat.

Aquí está el página con coordenadas de salida en formato Lon/Lat utilizando el sistema de referencia espacial geográfico WGS-84 ( EPSG 4326 ).

7voto

Visconde Puntos 8

He probado el código sugerido por Marcel Wilson y es más rápido:

from pyproj import Proj, transform
import time
import pyproj

# Test 1 - 0.0006158 s
start=time.time()
inProj = Proj(init='epsg:3857')
outProj = Proj(init='epsg:4326')
x1,y1 = -11705274.6374,4826473.6922
x2,y2 = transform(inProj,outProj,x1,y1)
end=time.time()
print(y2,x2)
print('%.7f' % (end-start))

# Test 2 - 0.0000517 s --- factor 11,9
start=time.time()
x,y = -11705274.6374,4826473.6922
p = pyproj.Proj("+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs")
lon, lat = p(x, y, inverse=True)
end=time.time()
print(lat, lon)
print('%.7f' % (end-start))
-----------------

39.72785727727918 -105.15027111593008
0.0006158
39.72785727727918 -105.15027111593008
0.0000517

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X