การแปลงพิกัดที่ฉายเป็น lat / lon โดยใช้ Python หรือไม่


50

ฉันถือว่านี่เป็นคำถามพื้นฐาน แต่ดูเหมือนไม่สามารถค้นหาหรือรู้จักวิธีแก้ปัญหา

ไซต์นี้ส่งคืน

Point:
X: -11705274.6374
Y: 4826473.6922

เมื่อคุณค้นหาด้วยค่าคีย์แรกของ 000090 เป็นตัวอย่าง ฉันเดาว่านี่เป็นการอ้างอิงเชิงพื้นที่และฉันก็เข้าใจว่ามันคืออะไร

ฉันกำลังมองหาคำแนะนำหรือตัวอย่างวิธีแปลงเป็น Latitude และลองจิจูดโดยใช้ Python

คำตอบ:


100

วิธีที่ง่ายที่สุดในการแปลงพิกัดในหลามเป็นpyprojคืออินเตอร์เฟซหลามไปยังห้องสมุด PROJ.4 ในความเป็นจริง:

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

ผลตอบแทน -105.150271116 39.7278572773


4
อ๋อ Pyproj ตลอดทาง
sgillies

มันใช้งานได้สำหรับฉัน
lenhhoxung

36

ตามค่าเริ่มต้นไซต์ที่คุณเชื่อมโยงจะใช้ระบบอ้างอิงเชิงพื้นที่ EPSG 3857 (WGS84 Web Mercator) ผมพบว่าข้อมูลเหล่านี้ที่นี่

คุณสามารถระบุระบบอ้างอิงเชิงพื้นที่อื่นโดยป้อน EPSG ที่ต้องการลงในแบบฟอร์มภายใต้Spatial Referenceหรือคุณสามารถแปลงพิกัดที่ส่งคืนด้วย Python

ตัวอย่างเช่นคุณสามารถใช้การผูก GDAL Pythonเพื่อแปลงจุดนี้จากระบบพิกัดที่คาดการณ์ (EPSG 3857) เป็นระบบพิกัดทางภูมิศาสตร์ (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()

สิ่งนี้จะส่งคืนจุดพิกัดของ-105.150271116 39.7278572773คุณ


6

เอาท์พุทไม่ได้เป็นระบบอ้างอิงเชิงพื้นที่ / พิกัดมันเป็นคู่ของพิกัด คุณจำเป็นต้องรู้ว่าการอ้างอิงเชิงพื้นที่คือการปฏิเสธพิกัด

อย่างไรก็ตามนั่นไม่จำเป็นในกรณีนี้ เพียงผ่านการอ้างอิงเชิงพื้นที่เอาท์พุทที่เหมาะสมไปยังบริการและมันจะส่งคืนพิกัดใน Lon / Lat

นี่คือหน้าเว็บที่มีพิกัดเอาต์พุตในรูปแบบ Lon / Lat โดยใช้ระบบอ้างอิงเชิงพื้นที่ WGS-84 ( EPSG 4326 )


6

afalciano มีคำตอบที่ถูกต้อง แต่ต้องการรวมการใช้ pyproj ที่หลากหลาย

มันไม่ต้องการให้คุณรู้ว่าสตริง proj4 และเป็นนิด ๆ หน่อย ๆ ได้เร็วขึ้น

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 แทนที่บรรทัดที่สองp = pyproj.Proj(init='epsg:3857')และผลลัพธ์จะเหมือนกัน
alphabetasoup

1
ผลลัพธ์เหมือนกัน แต่สุดท้ายฉันตรวจสอบว่านี่เร็วขึ้นเล็กน้อย
Marcel Wilson

3

ลองใช้รหัสที่แนะนำโดย Marcel Wilson และเร็วกว่า:

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

ฉันพบโพสต์นี้เมื่อมองหาวิธีการทำเช่นนี้ภายใน QGIS ตามที่อธิบายไว้ที่นี่วิธีการที่ใช้มีลักษณะดังนี้:

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
หมายเหตุมีการเปลี่ยนแปลง API ที่แตกหักใน QGIS 3 ดังนั้นหากใช้v3.xคุณจะต้องใช้xform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
Jonny

0

โปรดทราบว่าtransformฟังก์ชั่นการตอบpyprojรับด้วยarraysซึ่งค่อนข้างมีประโยชน์เมื่อมันมาถึง 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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.