我认为这是一个基本问题,但是我似乎找不到或认识到解决方案。以第一个键值000090进行搜索为例。我想这是一个空间参考,我有点明白了。

我正在寻找有关如何使用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')


评论


是的一路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

#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 楼

请注意,transformpyproj函数也接受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