我正在寻找有关如何使用Python将其转换为纬度和经度的说明或示例。
#1 楼
在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
基于Marc的评论进行编辑:
pyproj 2.4提供了有关使用
Proj
语法弃用的init=
初始化的FutureWarning。更新的语法相同,但没有init=
。 喜欢:
inProj = Proj('epsg:3857')
outProj = Proj('epsg:4326')
#2 楼
默认情况下,您链接到的站点使用空间参考系统EPSG 3857(WGS84 Web Mercator)。我在这里找到了此信息。您可以通过在
Spatial Reference
下的表单中输入所需的EPSG来指定另一个空间参考系统,也可以使用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
。#3 楼
afalciano的答案正确,但希望包含pyproj的变体用法。它确实需要您知道proj4字符串,并且要快一点。 “ lang-python prettyprint-override”>
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
评论
您不需要proj4字符串,将第二行替换为p = pyproj.Proj(init ='epsg:3857'),结果是相同的。
– alphabetasoup
16 Sep 15'0:08
结果是一样的,但最后我检查了一下,速度更快。
–马塞尔·威尔逊(Marcel Wilson)
16-09-17在17:03
即使不是这个答案的目的,当您有一个完全自定义的投影时(在EPSG存储库中未列出),它特别有用。
– Andreas L.
1月13日13:51
#4 楼
输出不是空间/坐标参考系统,而是一对坐标。您需要知道什么是空间参考以重新投影坐标。但是,在这种情况下,这不是必需的。只需将适当的输出空间参考传递给服务,它将以Lon / Lat返回坐标。
这是使用WGS-84地理空间参考系统以Lon / Lat格式输出坐标的页面(EPSG 4326)。
#5 楼
尝试了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
#6 楼
请注意,transform
的pyproj
函数也接受arrays
,这在涉及数据帧时非常有用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())
#7 楼
使用pyproj时,请注意与各种发行版在如何转换数据方面的区别。以下是根据问题使用新/旧功能的一些示例:使用pyproj> = 2.2.0
import pyproj
print(pyproj.__version__) # 2.4.1
print(pyproj.proj_version_str) # 6.2.1
proj = pyproj.Transformer.from_crs(3857, 4326, always_xy=True)
x1, y1 = (-11705274.6374, 4826473.6922)
x2, y2 = proj.transform(x1, y1)
print((x2, y2)) # (-105.15027111593008, 39.72785727727918)
使用pyproj < = 1.9.6
import pyproj
print(pyproj.__version__) # 1.9.6
print(pyproj.proj_version_str) # 4.9.3
inProj = pyproj.Proj(init='epsg:3857')
outProj = pyproj.Proj(init='epsg:4326')
x1, y1 = (-11705274.6374, 4826473.6922)
x2, y2 = pyproj.transform(inProj, outProj, x1, y1)
print((x2, y2)) # (-105.15027111593008, 39.72785727727918)
对于不同版本的PROJ / pyproj,有一些注意事项:
>
对于旧版本,
transform
始终返回相同的轴顺序“ x,y”或“经度,纬度”,而PROJ 6+是EPSG定义的顺序,除非指定了类似always_xy=True
的选项Proj
仅限于在一个基准内的地理坐标和投影坐标之间进行转换,而较新的Transformer
考虑了基准偏移,建议用于较新的pyproj使用#8 楼
我在寻找在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)
评论
请注意,QGIS 3中API发生了重大变化,因此,如果使用v3.x,则需要使用xform = QgsCoordinateTransform(crsSrc,crsDest,QgsProject.instance())
–珍妮
19年1月17日在15:38
评论
是的一路Pyproj。
–傻瓜
2013年12月2日15:14
这个对我有用
– lenhhoxung
18年8月24日在12:50
pyproj 2.4提供了有关使用init =语法弃用的Proj()初始化的FutureWarning。更新后的语法相同,但没有init =。像这样:inProj = Proj('epsg:3857')和outProj = Proj('epsg:4326')
– Marc Compere
19/12/19在21:35
我基于编辑删除了“ init =”,但是我的transform(inProj,outProj,x1,y1)的输出给了我(纬度,经度)而不是(经度,纬度)。有人知道为什么吗?
– gdelab
2月18日15:18
@gdelab参见github.com/pyproj4/pyproj/issues/538#issuecomment-585734088
– Antonio Falciano
2月22日17:17