Python을 사용하여 투영 좌표를 위도 / 경도로 변환 하시겠습니까?


50

나는 이것이 기본적인 질문이라고 생각하지만 해결책을 찾거나 인식하지 못하는 것 같습니다.

이 사이트

Point:
X: -11705274.6374
Y: 4826473.6922

첫 번째 키 값 000090으로 검색 할 때 나는 이것이 공간 참조라고 생각하고 나는 그것이 무엇인지 얻습니다.

파이썬을 사용하여 위도 및 경도로 변환하는 방법에 대한 지침 또는 예제를 찾고 있습니다.

답변:


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
네. 파이프 로즈
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로 반환됩니다.

다음은 WGS-84 지리 공간 참조 시스템 ( EPSG 4326 )을 사용하여 Lon / Lat 형식의 출력 좌표 가있는 페이지 입니다 .


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
QGIS 3에는 API가 크게 변경되었으므로 사용 v3.x하는 경우xform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
Jonny

0

accept 의 transform기능 pyprojarrays데이터 프레임과 관련하여 매우 유용합니다.

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.