Djangoアプリケーションで2点間の距離を測定し、その結果を信頼できる測定値と比較するいくつかの方法を試しました。数値は離れています。たとえば、Google Mapsの報告によると、ダブリンとリバプールの間の実際の距離は約217kmであると想定しています。
geopy
を使用(
非常に正確):
>>> from geopy.distance import distance >>> dublin = (-6.270447, 53.339791) >>> liverpool = (-2.991028, 53.402061) >>> distance(dublin, liverpool).km 362.70989455939394
DjangoのGEOSAPIの使用(精度の低い線形計算):
>>> from django.contrib.gis.geos import Point >>> dublin = Point(-6.270447, 53.339791, srid=3857) >>> liverpool = Point(-2.991028, 53.402061, srid=3857) >>> dublin.distance(liverpool)*100 328.00101418228877
編集:この領域(UTM 30N)では、ほぼ同じ結果が得られます。
>>> dublin.transform(32630) >>> liverpool.transform(32630) >>> dublin.distance(liverpool)*100 328.32200116442266
どちらの場合もオフです。 100km以上!短い距離の測定(< 1km)も同様に不正確です。ここで何が間違っているのですか!?
コメント
回答
座標を逆にすると、機能しません(geopyは(緯度、経度)WGS84 crs)
dublin = (53.33306,-6.24889) liverpool = ( 53.41058,-2.97794) print distance(dublin, liverpool).km 217.863019038 print(vincenty(dublin, liverpool).kilometers) 217.863019038 print(great_circle(dublin, liverpool).kilometers) 217.211596704
GEOS(形の良い、django )デカルト平面とユークリッド距離を使用します。 pyproj (djangoは(経度、緯度)を使用)
from django.contrib.gis.geos import Point dublin = Point(-6.270447, 53.339791, srid=4326) # in degrees liverpool = Point(-2.991028, 53.402061, srid=4326) # in degrees dublin.distance(liverpool)*100 328.00101418228877 # units ? import pyproj # conversion from WGS84 to epsg:3857 p1 = pyproj.Proj(proj="latlong",datum="WGS84") p2 = pyproj.Proj(init="epsg:3857") a = pyproj.transform(p1,p2,-6.270447, 53.339791) b = pyproj.transform(p1,p2,-2.991028, 53.402061) dublin = Point(a) # in meters liverpool = Point(b) # in meters dublin.distance(liverpool)/1000 # Euclidean 365.2480859440489 #in km
ただし、Vinceとしてメルカトル図法を距離測定に使用しないでください。
EPSG:32630(UTMゾーン30N)の場合:
p3 = pyproj.Proj(init="epsg:32630") a = pyproj.transform(p1,p3,-6.270447, 53.339791) b = pyproj.transform(p1,p3,-2.991028, 53.402061) dublin = Point(a) liverpool = Point(b) dublin.distance(liverpool)/1000 218.32514783088294 #in km
そして、すべての結果(geopyとdjango)は、Googleの距離またはリバプールからダブリンまでの距離(218 km)
に匹敵します。コメント
- lon、lat / lat、lonの混乱が再び発生します!そこにあると確信していました。
geopy
のドキュメントやその他の回答には、投影については何もありません。取得したVincenty距離はmmレベルで正確である必要があります。 。dublin.distance(liverpool)*100
< -1000ではなく100を掛ける必要があるという事実は、何かを教えてくれるはずです。ここで疑わしいことが起こっています。