Projizierte Koordinaten mit Python nach Lat / Lon konvertieren?

51

Ich gehe davon aus, dass dies eine grundlegende Frage ist, aber ich kann die Lösung scheinbar nicht finden oder erkennen.

Diese Seite kehrt zurück

Point:
X: -11705274.6374
Y: 4826473.6922

bei der Suche mit dem ersten Schlüsselwert 000090 als Beispiel. Ich denke, dies ist ein räumlicher Bezug und ich verstehe irgendwie, was das ist.

Ich suche nach Anweisungen oder Beispielen, wie man dies mit Python in Breite und Länge konvertiert.

Vincent
quelle

Antworten:

100

Der einfachste Weg, Koordinaten in Python zu transformieren, ist pyproj , dh die Python-Schnittstelle zur PROJ.4-Bibliothek . Eigentlich:

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

kehrt zurück -105.150271116 39.7278572773

Antonio Falciano
quelle
4
Ja. Pyproj den ganzen Weg.
sgillies
Es funktioniert für mich
Lenhhoxung
36

Standardmäßig verwendet die von Ihnen verknüpfte Site das Raumbezugssystem EPSG 3857 (WGS84 Web Mercator). Ich habe diese Informationen hier gefunden .

Sie können entweder ein anderes Raumbezugssystem angeben, indem Sie die gewünschte EPSG in das Formular unter eingeben, Spatial Referenceoder Sie können die zurückgegebenen Koordinaten mit Python konvertieren.

Sie können beispielsweise die GDAL-Python-Bindungen verwenden , um diesen Punkt aus dem projizierten Koordinatensystem (EPSG 3857) in ein geografisches Koordinatensystem (EPSG 4326) zu konvertieren.

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()

Dies gibt für Ihren Punkt die Koordinaten von zurück -105.150271116 39.7278572773.

ustroetz
quelle
7

afalciano hat die richtige antwort, wollte aber eine variante verwendung von pyproj aufnehmen.

Es setzt voraus, dass Sie den proj4-String kennen und ein kleines bisschen schneller sind.

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
Marcel Wilson
quelle
2
Sie brauchen den proj4-String nicht, ersetzen Sie ihn durch die zweite Zeile p = pyproj.Proj(init='epsg:3857')und das Ergebnis ist dasselbe.
Alphabetasoup
1
Das Ergebnis ist das gleiche, aber zuletzt habe ich überprüft, dass dies ein kleines bisschen schneller war.
Marcel Wilson
6

Die Ausgabe ist kein Raum- / Koordinatenbezugssystem , sondern ein Koordinatenpaar. Sie müssen den Raumbezug kennen, um die Koordinaten neu zu projizieren.

Dies ist in diesem Fall jedoch nicht erforderlich. Übergeben Sie einfach einen entsprechenden räumlichen Ausgabebezug an den Dienst und er gibt die Koordinaten in Lon / Lat zurück.

Hier ist die Seite mit den Ausgabekoordinaten im Lon / Lat-Format unter Verwendung des geografischen räumlichen Bezugssystems WGS-84 ( EPSG 4326 ).

user2856
quelle
4

Versuchte den von Marcel Wilson vorgeschlagenen Code und es ist schneller:

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
user1174460
quelle
1

Ich habe diesen Beitrag gefunden, als ich nach Möglichkeiten gesucht habe, dies in QGIS zu tun. Wie hier beschrieben , sieht die verwendete Methode folgendermaßen aus:

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)
Toivo Säwén
quelle
2
Beachten Sie, dass es in QGIS 3 eine wichtige Änderung in der API gibt. Wenn v3.xSie also verwenden, müssen Sie Folgendes verwendenxform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
Jonny,
0

Bitte beachten Sie, dass die transformFunktion von auch pyprojakzeptiert arrays, was sehr nützlich ist, wenn es um Datenrahmen geht

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())
J. Doe
quelle
-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()
Subhash Verma
quelle