使用Python将投影坐标转换​​为纬度/经度?


50

我认为这是一个基本问题,但我似乎找不到或认识到解决方案。

该网站返回

Point:
X: -11705274.6374
Y: 4826473.6922

以第一个键值000090为例进行搜索时。我想这是一个空间参考,我有点明白了。

我正在寻找有关如何使用Python将其转换为纬度和经度的说明或示例。

Answers:


100

在Python中转换坐标的最简单方法是pyproj,即PROJ.4库Python接口。事实上:

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

它对我
有用

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
结果是一样的,但最后我检查了一下,速度更快。
马塞尔·威尔逊

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

请注意,accepts 的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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.