pyprojとgeopyの宛先の場所の違い


8

方位と範囲を指定したポイントから目的地の位置を(Pythonで)計算する方法を探しています。

subject(geopypyproj)の2つのライブラリからの結果の比較に基づいて、最終的な出力の違いが大きくなっていることに気付きました。たとえば、100 kmでは、およそデシメートルのオーダーです。これは私が意味することの最小限の例です:

from __future__ import absolute_import, division, print_function

long_1 = -1.729722
lat_1 = 53.320556
bearing = 96.021667
distance = 124.8  #in km

# using geopy

import geopy
from geopy.distance import VincentyDistance

origin = geopy.Point(lat_1, long_1)
destination = VincentyDistance(kilometers=distance).destination(origin, bearing)
gp_lat_2 = destination.latitude
gp_long_2 = destination.longitude

# using pyproj

from pyproj import Geod
g = Geod(ellps='WGS84')
prj_long_2, prj_lat_2, prj_bearing_2 = g.fwd(long_1, lat_1, bearing, distance*1000)

# results comparison
print("        | pyproj        | geopy")
print("long_2   %.6f     %.6f" % (prj_long_2, gp_long_2))
print("lat_2    %.6f     %.6f" % (prj_lat_2, gp_lat_2))

print("> DELTA pyproj, geopy")
print("delta long_2   %.7f" % (prj_long_2 - gp_long_2))
print("delta lat_2    %.7f" % (prj_lat_2 - gp_lat_2))

私はこれらの結果を得ました:

        | pyproj        | geopy
long_2   0.127201         0.127199
lat_2    53.188432        53.188432

> DELTA pyproj, geopy
delta long_2   0.0000021
delta lat_2    -0.0000002

私の主な質問は、私が何か間違っているのかどうかです(両方の設定でを使用する必要がありますWGS84)。

そうでない場合、使用されている異なる数式による違いはありますか(VincentyとgeopyKarneyの違いpyproj)?たとえば、ここで引用されている丸め誤差

回答:


6

すべてが正しく行われたようです。逆計算を実行して、出発地と目的地の座標を指定して距離を求め、次に距離の残差を評価することにより、各方法の誤差を評価できます。これは往復運動です。

# For Vincenty's method:
geopy_inv_dist = geopy.distance.vincenty(origin, destination).m
# For Karney's method:
prj_inv_dist = g.inv(long_1, lat_1, prj_long_2, prj_lat_2)[2]  # s12

print("> inverse distance residule (m)")
print("geopy  %.7f" % (distance * 1000 - geopy_inv_dist))
print("prj    %.7f" % (distance * 1000 - prj_inv_dist))

ショー:

> inverse distance residule (m)
geopy  0.1434377
prj    0.0000000

したがって、Vincentyの方法では、同じ座標で異なるデシメートルを超える逆距離が決定されることがわかります。Karneyの方法には、15ナノメートル未満の機械精度の誤差があります。この例では、誤差は0.1455 nmであり、これは水素原子の直径付近です。


問題はおそらくgeopyの宛先メソッドにあります。ここに示すように、Vincentyのメソッドの2番目の実装をPostGISバージョン2.1と比較してみましょう。(PostGISバージョン2.2とProj 4.9以降ではKarneyの方法を使用しています)。PostGIS 2.1からの往復距離残差は常に1 cm未満です。この例では、255 nmです。

SELECT PostGIS_Version(),
  ST_AsText(origin) AS origin,
  ST_AsText(ST_Project(origin, distance, azimuth)) AS destination,
  ST_Distance(ST_Project(origin, distance, azimuth), origin) AS roundtrip_distance,
  distance - ST_Distance(ST_Project(origin, distance, azimuth), origin) AS postgis_residual
FROM (
  SELECT 124.8 * 1000 AS distance, radians(96.021667) AS azimuth,
    ST_SetSRID(ST_MakePoint(-1.729722, 53.320556), 4326)::geography AS origin
) AS f;
-[ RECORD 1 ]------+-----------------------------------------
postgis_version    | 2.1 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
origin             | POINT(-1.729722 53.320556)
destination        | POINT(0.12720134063267 53.1884316458524)
roundtrip_distance | 124799.999999745
postgis_residual   | 2.54993210546672e-007

この非常に徹底的で非常にインテリジェントな回答をありがとう!
Jason Scheirer、2015

@ mike-t、いい答えをありがとう!私は、第3のソースのアイデアのように..私は開いているgeopy:のチケットgithub.com/geopy/geopy/issues/140
gmas80

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.