저는 Django 애플리케이션에서 두 지점 사이의 거리를 측정하고 그 결과를 신뢰할 수있는 측정과 비교하는 여러 방법을 시도했습니다. 예를 들어 Google지도에서보고 한대로 더블린과 리버풀 간의 실제 거리가 ~ 217km라고 가정합니다.

여기에 이미지 설명 입력

geopy 사용 ( 매우 정확함 ) :

>>> from geopy.distance import distance >>> dublin = (-6.270447, 53.339791) >>> liverpool = (-2.991028, 53.402061) >>> distance(dublin, liverpool).km 362.70989455939394 

Django의 GEOS API 사용 (덜 정확하지 않은 선형 계산) :

>>> 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)도 정확하지 않습니다. 내가 여기서 뭘 잘못하고 있니!?

댓글

  • 장고 예제의 경우 하지 않습니다 ' EPSG : 3857은도 대신 미터를 사용하지 않습니까 ?
  • Mercator는 거리 측정, 특히 먼 북쪽에 사용해서는 안됩니다.
  • 지점을 32630 (UTM 구역 30N)으로 변환 해 보았고 328.3km를 얻었습니다. 이 경우에는 거의 차이가 없습니다. ' geopy 문서 또는 기타 답변의 투영에 대한 내용이 없으며 내가 얻은 Vincenty 거리는 mm 수준에서 정확해야합니다. .
  • dublin.distance(liverpool)*100 <-1000 대신 100을 곱해야했다는 사실은 무언가를 알려줍니다. 의심스러운 일이 벌어지고 있습니다.

Answer

좌표를 반대로하면 작동하지 않습니다 (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 거리 또는 리버풀에서 더블린까지의 거리 (218km)

와 비슷합니다. 댓글

  • 경도 / 위도 / 경도 혼동이 다시 발생합니다! 바로 거기에 있다고 확신했습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다