2016-11-25 10 views
1

Geodクラスを使用して、2つのlon/latポイント間の距離をpyprojライブラリから計算したいとします。Geod ValueError:未定義逆測地系

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

これらの2つのポイントはわずか数センチメートル離れています。 pyproj/Geodのように見えるのは、近くにあるポイントにはうまく対処できません。そのような距離では、単純な平面の幾何学的形状が十分すぎるので、少し奇妙です。また、そのエラーメッセージは、2つの点がantipodal、すなわち正反対であることを示唆しているため、少し疑わしいですが、明らかにそうではありません! OTOH、多分それが言及する対角線のポイントは、何らかの形で計算に生じるいくつかの中間点です...まだ、私はむしろこれのような振る舞いをするライブラリを使うことに躊躇しています。

この欠陥があると、pyprojには他の欠陥があると思われます。特に、旧式のVincenty's formulaeを楕円体の測地線の計算に使用していますが、これは対角線に近い点を扱うときに不安定であり、遠距離では正確ではないことが知られています。 C. F. F. Karneyの最新のアルゴリズムを使うことをお勧めします。

博士Karneyは特にGeodesics on an ellipsoidで、測地線のWikipediaの記事の主要な原因である、と彼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 

すなわち図はメートルであるので、これらの2点が離れて少し上に73ミリメートルです。


あなたはgeographiclibが複雑な測地線の問題を解決するために使用されて見たい場合は、私はgist上のPythonの2月3日のソースコードで、昨年書いたこのmath.stackexchange answerを参照してください。


pyproj now uses code from geographiclib以降、この問題は発生しなくなりました。

+0

[pyprojが計算を行うために地理的ライブラリを使用しているようです。](https://github.com/jswhit/pyproj/blob/master/Changelog)。 – mnky9800n

+0

@ mnky9800nその情報をありがとう! –