¿Convertir coordenadas proyectadas a lat / lon usando Python?


51

Supongo que esta es una pregunta básica, pero parece que no puedo encontrar o reconocer la solución.

Este sitio vuelve

Point:
X: -11705274.6374
Y: 4826473.6922

cuando busca con el primer valor clave de 000090 como ejemplo. Supongo que esta es una referencia espacial y entiendo de qué se trata.

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

Respuestas:


100

La forma más simple de transformar coordenadas en Python es pyproj , es decir, la interfaz de Python a 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

devoluciones -105.150271116 39.7278572773


44
Sí. Pyproj todo el camino.
sgillies

Funciona para mí
lenhhoxung

36

De manera predeterminada, el sitio al que se vinculó utiliza el Sistema de referencia espacial EPSG 3857 (WGS84 Web Mercator). Encontré esta información aquí .

Puede especificar otro Sistema de referencia espacial ingresando el EPSG deseado en el formulario Spatial Referenceo puede convertir las coordenadas devueltas con Python.

Por ejemplo, puede usar los enlaces GDAL Python para convertir este punto del sistema de coordenadas proyectado (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.


8

Afalciano tiene la respuesta correcta, pero quería incluir un uso variante de pyproj.

Se hace necesita conocer la cadena de proj4 y es un poquito 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
No necesita la cadena proj4, sustituya la segunda línea p = pyproj.Proj(init='epsg:3857')y el resultado es el mismo.
alphabetasoup

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

6

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

Sin embargo, eso no es necesario en este caso. Simplemente pase una referencia espacial de salida apropiada al servicio y devolverá las coordenadas en Lon / Lat.

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


4

Intenté 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

1

Encontré esta publicación cuando buscaba formas de hacerlo dentro de QGIS. Como se describe aquí , el método utilizado se ve así:

def convertProjection(self,x,y,from_crs,to_crs):
    crsSrc = QgsCoordinateReferenceSystem(from_crs)
    crsDest = QgsCoordinateReferenceSystem(to_crs)
    xform = QgsCoordinateTransform(crsSrc, crsDest)
    pt = xform.transform(QgsPoint(x,y))
    return pt.x, pt.y

# Remove the "EPSG:" part
from_crs = 3857
to_crs = 4326
x = -11705274.6374    
y = 4826473.6922
lon, lat = self.convertProjection(x,y,from_crs, to_crs)

2
Tenga en cuenta que hay un cambio de API de última hora en QGIS 3, por lo que si lo usa v3.xtendrá que usarloxform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
Jonny

0

Tenga en cuenta que la transformfunción de pyprojacepta también arrays, que es bastante útil cuando se trata de marcos de datos

import pandas as pd
from pyproj import Proj, transform

df = pd.DataFrame({'x': [-11705274.6374]*100, 
                   'y': [4826473.6922]*100})
inProj, outProj = Proj(init='epsg:3857'), Proj(init='epsg:4326')
df['x2'], df['y2'] = transform(inProj, outProj, df['x'].tolist(), df['y'].tolist())

-1
import cv2
import numpy as np
def onMouse(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
       # draw circle here (etc...)
       print('x = %f, y = %f'%((x*2/100),(y*2/100)))
a=float(input("enter length of original dimension in cm"))
b=float(input("enter width of original dimension in cm"))
print("origional image coordinates")
im=cv2.imread('mask1.jpg',0)
re_im=cv2.resize(im,(round(a*100/2),round(b*100/2)))
cv2.imshow('image',re_im)
cv2.setMouseCallback('image', onMouse)
cv2.waitKey(0)
cv2.destroyAllWindows()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.