두 지점 (위도, 경도) 사이의 거리를 빠르게 추정하려면 어떻게해야합니까?
두 지점 (위도, 경도) 사이의 거리를 추정 할 수 있기를 원합니다. 나는 이것이 A * 그래프 검색을위한 것이고 빠른 속도 를 원하기 때문에 언더 슛을 원한다 . 포인트는 최대 800km 떨어져 있습니다.
에 대한 답변 파이썬 (두 GPS 점 간의 방위 및 거리)에있는 하버 사인 포뮬러 귀하의 질문에 대답 파이썬 구현을 제공합니다.
아래 구현을 사용하여 구형 노트북에서 1 초 이내에 100,000 회 반복을 수행했습니다 . 나는 당신의 목적을 위해 이것으로 충분하다고 생각합니다. 그러나 성능을 최적화하기 전에 무엇이든 프로파일 링해야합니다.
from math import radians, cos, sin, asin, sqrt
def haversine(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
# Radius of earth in kilometers is 6371
km = 6371* c
return km
과소 평가 haversine(lat1, long1, lat2, long2) * 0.90
하거나 원하는 요소를. 과소 평가에 오류를 도입하는 것이 얼마나 유용한 지 모르겠습니다.
거리가 상대적으로 작기 때문에 정방형 거리 근사를 사용할 수 있습니다. 이 근사는 Haversine 공식을 사용하는 것보다 빠릅니다. 따라서 기준점 (lat1 / lon1)에서 테스트중인 지점 (lat2 / lon2)까지의 거리를 구하려면 아래 공식을 사용하십시오. 중요 참고 : 모든 위도 / 경도 포인트를 라디안으로 변환해야합니다.
R = 6371 // radius of the earth in km
x = (lon2 - lon1) * cos( 0.5*(lat2+lat1) )
y = lat2 - lat1
d = R * sqrt( x*x + y*y )
'R'은 km 단위이므로 거리 'd'는 km 단위가됩니다.
참조 : http://www.movable-type.co.uk/scripts/latlong.html
속도에 대한 한 가지 아이디어는 긴 / 위도 좌표를 3D (x, y, z) 좌표로 변환하는 것입니다. 점을 전처리 한 후 점 사이의 유클리드 거리를 실제 거리의 신속하게 계산 된 언더 슛으로 사용합니다.
최대 속도를 위해 좌표 거리에 대한 무지개 테이블 과 같은 것을 만들 수 있습니다 . 작업중인 영역을 이미 알고있는 것처럼 들리므로 사전 계산이 가능할 것 같습니다. 그런 다음 가장 가까운 조합을로드하고 사용할 수 있습니다.
예를 들어, 미국 대륙에서 경도는 55도 범위이고 위도는 20입니다. 즉, 1100 개의 정수 포인트가됩니다. 가능한 모든 조합 사이의 거리는 (n-1) (n) / 2 또는 약 600k 조합으로 답변되는 핸드 셰이크 문제 입니다. 저장하고 검색하는 것이 꽤 가능해 보입니다. 요구 사항에 대한 추가 정보를 제공하면 더 구체적으로 설명 할 수 있습니다.
지점 사이의 거리가 비교적 작은 경우 (미터에서 몇 km 범위) 빠른 접근 중 하나는
from math import cos, sqrt
def qick_distance(Lat1, Long1, Lat2, Long2):
x = Lat2 - Lat1
y = (Long2 - Long1) * cos((Lat2 + Lat1)*0.00872664626)
return 111.319 * sqrt(x*x + y*y)
Lat, Long은 라디안 단위이며 거리는 km 단위입니다.
Haversine 거리와의 편차는 1 % 정도이며 속도 이득은 ~ 10x 이상입니다.
0.00872664626 = 0.5 * 파이 / 180,
111.319 - is the distance that corresponds to 1degree at Equator, you could replace it with your median value like here https://www.cartographyunchained.com/cgsta1/ or replace it with a simple lookup table.
Please use the following code.
def distance(lat1, lng1, lat2, lng2):
#return distance as meter if you want km distance, remove "* 1000"
radius = 6371 * 1000
dLat = (lat2-lat1) * math.pi / 180
dLng = (lng2-lng1) * math.pi / 180
lat1 = lat1 * math.pi / 180
lat2 = lat2 * math.pi / 180
val = sin(dLat/2) * sin(dLat/2) + sin(dLng/2) * sin(dLng/2) * cos(lat1) * cos(lat2)
ang = 2 * atan2(sqrt(val), sqrt(1-val))
return radius * ang
To calculate a haversine distance between 2 points u can simply use mpu.haversine_distance() library, like this:
>>> import mpu
>>> munich = (48.1372, 11.5756)
>>> berlin = (52.5186, 13.4083)
>>> round(mpu.haversine_distance(munich, berlin), 1)
>>> 504.2
ReferenceURL : https://stackoverflow.com/questions/15736995/how-can-i-quickly-estimate-the-distance-between-two-latitude-longitude-points
'Nice programing' 카테고리의 다른 글
Apache gzip 압축을 사용하려면 어떻게해야합니까? (0) | 2021.01.09 |
---|---|
파일이 이미 Windows 방식으로 존재하는 경우 자동으로 이름 바꾸기 (0) | 2021.01.09 |
Spring Boot에서 "기본 보안 암호 사용"제거 (0) | 2021.01.09 |
기기에서 Firebase 클라우드 메시징 알림을받지 못함 (0) | 2021.01.09 |
CSS 픽셀 크기는 어떻게 계산됩니까? (0) | 2021.01.08 |