Chr*_*Chr 2 python geospatial pyproj
我想通过使用库中的Geod类来计算两个lon/lat点之间的距离pyproj.
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])
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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)
Run Code Online (Sandbox Code Playgroud)
此错误消息来自哪里?
这两点相距仅几厘米.看起来pyproj/ Geod不能很好地应对那些紧密相连的点.这有点奇怪,因为简单的平面几何在这样的距离上是足够的.此外,该错误信息是有点可疑,因为它表明了两点是对极,即截然相反,这显然不是这样的!OTOH,也许它提到的对映点是在计算中以某种方式出现的一些中间点......但是,我仍然对使用像这样的库的犹豫不决.
鉴于此缺陷,我怀疑pyproj还有其他缺陷.特别是,它可能使用旧的Vincenty公式进行椭圆体测地线计算,已知在处理近对映点时不稳定,而且在远距离上不是特别准确.我建议使用CFF Karney的现代算法.
Karney博士是维基百科有关测地线的文章的主要贡献者,特别是椭圆体上的Geodesics,他的地理图书可以在PyPi上使用,因此您可以使用它轻松安装它pip.有关详细信息,请参阅其SourceForge站点,以及使用其他语言进行的geoplib绑定.
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'])
Run Code Online (Sandbox Code Playgroud)
产量
0.07345528623159624
Run Code Online (Sandbox Code Playgroud)
这个数字以米为单位,因此这两个点相距73毫米.
如果你想看到geographiclib被用来解决一个复杂的问题,短程,请参阅本math.stackexchange答案我去年写的,对Python的2/3的源代码要点.
希望这不再是一个问题,因为pyproj现在使用来自geographiclib的代码.
| 归档时间: |
|
| 查看次数: |
1034 次 |
| 最近记录: |