Chuyển đổi tọa độ dự kiến ​​sang lat / lon bằng Python?


51

Tôi cho rằng đây là một câu hỏi cơ bản nhưng dường như tôi không thể tìm hoặc nhận ra giải pháp.

Trang web này trở lại

Point:
X: -11705274.6374
Y: 4826473.6922

khi bạn tìm kiếm với giá trị khóa đầu tiên là 000090 làm ví dụ. Tôi đoán đây là một tài liệu tham khảo không gian và tôi nhận được đó là gì.

Tôi đang tìm hướng dẫn hoặc ví dụ về cách chuyển đổi này thành Latitude và kinh độ bằng Python.

Câu trả lời:


100

Cách đơn giản nhất để chuyển đổi tọa độ trong Python là pyproj , tức là giao diện Python sang thư viện PROJ.4 . Trong thực tế:

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

trả lại -105.150271116 39.7278572773


4
Vâng. Pyproj tất cả các cách.
sgillies

Nó hoạt động với tôi
lenhhoxung

36

Theo mặc định, trang web bạn liên kết sử dụng Hệ thống tham chiếu không gian EPSG 3857 (WGS84 Web Mercator). Tôi tìm thấy thông tin này ở đây .

Bạn có thể chỉ định một Hệ thống tham chiếu không gian khác bằng cách nhập EPSG mong muốn vào biểu mẫu bên dưới Spatial Referencehoặc bạn có thể chuyển đổi tọa độ được trả về bằng Python.

Chẳng hạn, bạn có thể sử dụng các ràng buộc GDAL Python để chuyển đổi điểm này từ hệ tọa độ dự kiến ​​(EPSG 3857) sang hệ tọa độ địa lý (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()

Điều này trả về cho điểm của bạn tọa độ của -105.150271116 39.7278572773.


7

afalciano có câu trả lời đúng nhưng muốn bao gồm một cách sử dụng biến thể của pyproj.

không yêu cầu bạn biết chuỗi proj4 và nhanh hơn một chút.

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
Bạn không cần chuỗi proj4, thay thế dòng thứ hai p = pyproj.Proj(init='epsg:3857')và kết quả là như nhau.
alphabetasoup

1
Kết quả là như nhau nhưng cuối cùng tôi đã kiểm tra điều này nhanh hơn một chút.
Marcel Wilson

6

Đầu ra không phải là một hệ quy chiếu không gian / tọa độ , nó là một cặp tọa độ. Bạn cần biết tham chiếu không gian là gì để định hướng lại tọa độ.

Tuy nhiên, điều đó không bắt buộc trong trường hợp này. Chỉ cần chuyển một tham chiếu không gian đầu ra thích hợp cho dịch vụ và nó sẽ trả về tọa độ theo Lon / Lat.

Đây là trang có tọa độ đầu ra ở định dạng Lon / Lat sử dụng hệ thống tham chiếu không gian địa lý WGS-84 ( EPSG 4326 ).


4

Đã thử mã được đề xuất bởi Marcel Wilson và nó nhanh hơn:

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

Tôi đã tìm thấy bài đăng này khi tìm cách làm điều này trong QGIS. Như được mô tả ở đây , phương thức được sử dụng trông giống như vậy:

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
Lưu ý, có một thay đổi API đột phá trong QGIS 3, vì vậy nếu sử dụng v3.xbạn sẽ cần sử dụngxform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
Jonny

0

Xin lưu ý rằng transformchức năng pyprojchấp nhận cũng arrayskhá hữu ích khi nói đến dataframes

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.