python - 地理坐标值错误 : undefined inverse geodesic

标签 python geospatial pyproj

我想使用 pyproj 库中的 Geod 类来计算两个经/纬度点之间的距离。

from pyproj import Geod

g = Geod(ellps='WGS84')
lonlat1 = 10.65583081724002, -7.313341167341917
lonlat2 = 10.655830383300781, -7.313340663909912

_, _, dist = g.inv(lonlat1[0], lonlat1[1], lonlat2[0], lonlat2[1])

我收到以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-5-8ba490aa5fcc> in <module>()
----> 1 _, _, dist = g.inv(lonlat1[0], lonlat1[1], lonlat2[0], lonlat2[1])

/usr/lib/python2.7/dist-packages/pyproj/__init__.pyc in inv(self, lons1, lats1, lons2, lats2, radians)
    558         ind, disfloat, dislist, distuple = _copytobuffer(lats2)
    559         # call geod_inv function. inputs modified in place.
--> 560         _Geod._inv(self, inx, iny, inz, ind, radians=radians)
    561         # if inputs were lists, tuples or floats, convert back.
    562         outx = _convertback(xisfloat,xislist,xistuple,inx)

_geod.pyx in _geod.Geod._inv (_geod.c:1883)()

ValueError: undefined inverse geodesic (may be an antipodal point)

此错误消息从何而来?

最佳答案

这两点之间的距离只有几厘米。看起来 pyproj/Geod 不能很好地处理靠得很近的点。这有点奇怪,因为在这样的距离上简单的平面几何已经足够了。此外,该错误消息有点可疑,因为它暗示这两个点是 antipodal ,即截然相反,这显然不是这样的! OTOH,也许它提到的对映点是在计算中以某种方式出现的某个中间点......不过,我还是很犹豫要不要使用这样的库。

鉴于此缺陷,我怀疑 pyproj 还有其他缺陷。特别是,它可能使用旧的 Vincenty's formulae因为它的椭圆体测地线计算,已知在处理近对映点时不稳定,并且在大距离上不是特别准确。我建议使用 C. F. F. Karney 的现代算法。

Karney 博士是关于测地线的维基百科文章的主要贡献者,尤其是 Geodesics on an ellipsoid , 和他的 geographiclib在 PyPi 上可用,因此您可以使用 pip 轻松安装它。查看他的 SourceForge site了解更多信息,以及其他语言的 geographiclib 绑定(bind)​​。

FWIW,这是一个使用 geographiclib 计算问题中距离的简短演示。

from geographiclib.geodesic import Geodesic

Geo = Geodesic.WGS84

lat1, lon1 = -7.313341167341917, 10.65583081724002
lat2, lon2 = -7.313340663909912, 10.655830383300781

d = Geo.Inverse(lat1, lon1,  lat2, lon2)
print(d['s12'])

输出

0.07345528623159624

该数字以米为单位,因此这两点之间的距离略高于 73 毫米。


如果您希望看到 geographiclib 用于解决复杂的测地线问题,请参阅此 math.stackexchange answer我去年用 Python 2/3 源代码写过 gist .


希望这不再是问题,因为 pyproj now uses code from geographiclib .

关于python - 地理坐标值错误 : undefined inverse geodesic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40802309/

相关文章:

Python 在代理服务器后面发送电子邮件

python - 模块 'tensorflow' 没有属性 'log'

python - 将大型位置数据帧的东距和北距快速转换为纬度和经度

python - 无法从 'CRS' 导入名称 'pyproj' 以使用 osmnx 库

python - xpath 有一个空值,这会弄乱列表

python - "argument 1 has unexpected type ' 字符串 '"

mongodb - 如何在 MongoDB= 中的两个圆的差异内执行地理搜索

r - 将经/纬度转换为邮政编码/社区名称

c# - 如何将 SQL Server 2012/14 地理类型列设置为 null?

python - GDAL : Reprojecting netCDF file