Nice programing

두 지점 (위도, 경도) 사이의 거리를 빠르게 추정하려면 어떻게해야합니까?

nicepro 2021. 1. 9. 11:36
반응형

두 지점 (위도, 경도) 사이의 거리를 빠르게 추정하려면 어떻게해야합니까?


두 지점 (위도, 경도) 사이의 거리를 추정 할 수 있기를 원합니다. 나는 이것이 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

반응형