测量值:未定义的逆测量



我想通过使用pyproj库中的Geod类来计算两个LON/LAT点之间的距离。

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与靠近的点不能很好地应对。这有点奇怪,因为在这种距离上,简单的平面几何形状足够了。另外,该错误消息有点可疑,因为这表明这两个点是对抗原的,即截然相反,这显然不是这种情况!OTOH,也许它提到的反物点是计算中某种方式出现的一些中间点……尽管如此,我对使用这种行为的库感到犹豫。

鉴于此缺陷,我怀疑pyproj还有其他缺陷。特别是,它可能使用旧文森蒂的公式进行椭圆形的测量计算,这在处理近距离点时已知不稳定,并且在大距离内并不是特别准确。我建议使用C. F. F. Karney的现代算法。

Karney博士是Wikipedia文章的主要贡献者,尤其是在椭圆形上的大地测量公司,他的Geographiclib在PYPI上可用,因此您可以使用pip轻松安装它。有关更多信息,请参见他的SourceForge网站,并以其他语言的方式绑定地理。

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

那个数字以米为单位,所以这两个点相距73mm。


如果您想查看Geographiclib被用来解决复杂的地理问题,请参阅此Math.stackexchange答案,我去年写的是GIST上的Python 2/3源代码。


希望这不再是问题,因为Pyproj现在使用地理位置中的代码。

相关内容

  • 没有找到相关文章

最新更新