2016-11-25 65 views
1

我想通过使用pyproj库中的Geod类来计算两个lon/lat点之间的距离。Geod ValueError:undefined inverse geodesic

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) 

哪里此错误消息从何而来?

回答

3

这两点只有几厘米的距离。它看起来像pyproj/Geod不能很好地处理那些靠得很近的点。这有点奇怪,因为在这样的距离上,简单的平面几何就足够了。而且,该错误消息有点可疑,因为它暗示两点是antipodal,即完全相反,这显然不是这种情况! OTOH,也许它提到的对位点是计算中出现的某个中间点......但是,在使用类似这样的库时,我会犹豫不决。

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

Karney博士是维基百科关于测地线文章的主要撰稿人,特别是Geodesics on an ellipsoid,他的geographiclib可在PyPi上使用,因此您可以使用pip轻松安装。有关详细信息,请参阅他的SourceForge site,并使用其他语言的geographiclib绑定。

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被用来解决一个复杂的测地问题,请参阅gist这个math.stackexchange answer我去年写的,与Python 2/3的源代码。


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

+0

[看起来pyproj现在使用地理资源库进行计算。](https://github.com/jswhit/pyproj/blob/master/Changelog)。 – mnky9800n

+0

@ mnky9800n感谢您的信息! –

相关问题