匀称的线串.长度单位

Ell*_*Rob 5 python spatial coordinate-systems shapely

我试图在 Shapely 中找到线串的长度(以米为单位),但似乎无法达到预期的结果。几乎可以肯定我在坐标系方面犯了一些错误,但我一直无法弄清楚。

这是单行的一些简化代码:

from shapely.geometry import LineString
line = LineString([(12875996.563923, -3940011.116702), (12872802.929335, -3937989.118438)])
line.crs = 'EPSG:3857'
line.length
Run Code Online (Sandbox Code Playgroud)

输出为3779.92m。不过根据我的测量,应该是~3159m。

这是基于检查以下地点的点(两个环岛的中心)的位置,然后在 Google 地球中测量它们之间的位置。

第 1 点: http://epsg.io/map#srs=3857&x=12875996.563923&y=-3940011.116702&z=14&layer=streets
第 2 点: http: //epsg.io/map#srs=3857&x=12872802.929468&y=-3937989.1185 38&z =17&层=街道

swa*_*hai 4

为了表明,line.length形状几何只是欧几里得距离,可以这样计算:

import math
x1, y1 = (12875996.563923, -3940011.116702)
x2, y2 = (12872802.929335, -3937989.118438)
math.hypot(x2-x1,  y2-y1)  # 3779.91783790157
Run Code Online (Sandbox Code Playgroud)

要获得与pyproj模块的正确距离,请按照下列步骤操作:

import pyproj  #v2.4.1
x1, y1 = (12875996.563923, -3940011.116702)
x2, y2 = (12872802.929335, -3937989.118438)
lon1, lat1 = pyproj.Proj("epsg:3857")(x1, y1, inverse=True)
lon2, lat2 = pyproj.Proj("epsg:3857")(x2, y2, inverse=True)
_,_,dist_km = pyproj.Geod(ellps='WGS84').inv(lon1, lat1, lon2, lat2)
dist_km   # 3157.214113925091
Run Code Online (Sandbox Code Playgroud)