Python'u kullanarak öngörülen koordinatları lat / lon'a çevirmek?


50

Bunun temel bir soru olduğunu varsayıyorum, ancak çözümü bulamıyor veya tanıyamıyorum.

Bu site döner

Point:
X: -11705274.6374
Y: 4826473.6922

Örnek olarak 000090 'ın ilk anahtar değerini aradığınızda. Sanırım bu mekansal bir referans ve ne olduğunu anlayabiliyorum.

Python'u kullanarak bunun Enlem ve Boylam'a nasıl dönüştürüleceğine ilişkin talimatlar veya örnekler arıyorum.

Yanıtlar:


100

Python'daki koordinatları dönüştürmenin en basit yolu pyproj , yani Python arayüzü PROJ.4 kütüphanesine . Aslında:

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

döner -105.150271116 39.7278572773


4
Evet. Tüm yol boyunca Pyproj.
sgillies

Benim için çalışıyor
lenhhoxung 24:18

36

Varsayılan olarak bağladığınız site, Mekansal Referans Sistemi EPSG 3857'yi (WGS84 Web Mercator) kullanır. Bu bilgiyi burada buldum .

İstediğiniz EPSG'yi aşağıdaki forma girerek başka bir Mekansal Referans Sistemi belirtebilir Spatial Referenceveya döndürülen koordinatları Python ile dönüştürebilirsiniz.

Örneğin, bu noktayı öngörülen koordinat sisteminden (EPSG 3857) bir coğrafi koordinat sistemine (EPSG 4326) dönüştürmek için GDAL Python bağlayıcılarını kullanabilirsiniz.

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

Bu, noktanız için koordinatlarını döndürür -105.150271116 39.7278572773.


6

Çıktı mekansal / koordinat referans sistemi değil , bir çift koordinat. Mekansal referansın koordinatları reddetmek için ne olduğunu bilmek gerekir.

Ancak bu durumda bu gerekli değildir. Sadece servise uygun bir çıkış uzaysal referansı iletin, bu koordinatlar Lon / Lat cinsinden döndürülür.

İşte sayfa çıkış WGS-84 coğrafi uzamsal bir referans sistemi (kullanarak boylam / Lat biçiminde koordinatları ile EPSG 4326 ).


6

afalciano doğru bir cevaba sahip ancak pyproj'un değişken bir kullanımını da dahil etmek istedi.

Bu does Eğer proj4 dize biliyor gerektirmez ve küçük biraz daha hızlıdır.

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
Proj4 dizgisine ihtiyacınız yoktur, ikinci satırı yerine koyun p = pyproj.Proj(init='epsg:3857')ve sonuç aynı olur.
alphabetasoup

1
Sonuç aynı ama son kontrol ettim ki bu biraz daha hızlıydı.
Marcel Wilson

3

Marcel Wilson tarafından önerilen kodu denedim ve daha hızlı:

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

Bu yazıyı QGIS içinde yapmanın yollarını ararken buldum. Açıklandığı gibi burada , yöntem şöyle görünüyor kullandı:

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
Not, QGIS 3'te bir API değişikliği var, bu nedenle kullanmanız v3.xgerekecekxform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
Jonny

0

Lütfen transform, pyprojkabul edilen fonksiyonun arrays, veri çerçeveleri söz konusu olduğunda oldukça kullanışlıdır.

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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.