working_helen

[데이터 수집] 위도/경도 기반 지도 반경 내 데이터 본문

TAVE/뿌스팅 project

[데이터 수집] 위도/경도 기반 지도 반경 내 데이터

HaeWon_Seo 2023. 8. 7. 19:47

 데이터 수집 단계에서 학습한 내용 중 세번째로 위경도 기반 지도상 반경 내 데이터를 수집하는 방법에 대해 공부해본다.

 

1. Haversine 하버사인 공식이란?

2. Haversine 하버사인 공식 코드


1. Haversine 하버사인 공식이란?

출처 : https://kayuse88.github.io/haversine/

- 구면에서 두 점 사이의 최단 거리 구할 때 쓰이는 공식

- 평면에서 두 지점을 이은 직선이 최단거리인 반면, 구면에선 곡률의 영향으로 인해 단순히 두 지점을 직선 경로가 최단거리가 되지 않는다. 원의 일부, 즉 호 모양의 경로가 최단거리가 된다.

- 지도 상의 두 위치는 구형의 지구 위의 두 지점이므로 구면에서의 최단거리 공식을 통해 두 지점 간 거리를 구한다.

- 하버사인 공식은 두 지점의 위도, 경도, 지구 반지름을 이용해 두 지점 간 호의 길이를 계산한다.

 

 

2. Haversine 하버사인 코드

1) 공식 수식

(식 1) theta 구하기 : theta = hav역함수(h)

(식 2) 구한 theta로 두 점 사이 거리 d 구하기 (r은 지구 반지름)

모든 수식 출처 : https://en.wikipedia.org/wiki/Haversine_formula

 

 

 

2) 파이썬 코드

- 방법 1. Haversine 하버사인 공식을 이용하여 두 지점 간의 거리를 계산하는 함수 정의하기

import math

def haversine_1(lat1, lon1, lat2, lon2):
    
    radius = 6371 # 지구의 반지름 (단위: km)

    # 위도 및 경도를 라디안 단위로 변환
    lat1, lon1, lat2, lon2 = map(math.radians, [lat1, lon1, lat2, lon2])

    # 위도 및 경도 차이 계산
    dlat = lat2 - lat1
    dlon = lon2 - lon1

    # Haversine 공식 적용
    a = math.sin(dlat / 2) ** 2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon / 2) ** 2
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    distance = radius * c

    # 두 지점 간의 거리 (단위: km)
    return distance
def haversine_2(lat1, lon1, lat2, lon2):
    
    radius = 6371 # 지구 반지름 (단위: km)
    
    # 위도 및 경도 차이 계산 > 라디안 단위로 변환
    toRadian = math.pi / 180
    deltaLatitude = abs(lat1 - lat2) * toRadian
    deltaLongitude = abs(lon1 - lon2) * toRadian

    # Haversine 공식 적용
    sinDeltaLat = math.sin(deltaLatitude / 2)
    sinDeltaLng = math.sin(deltaLongitude / 2)
    squareRoot = math.sqrt(sinDeltaLat * sinDeltaLat + 
                           math.cos(x1 * toRadian) * math.cos(x2 * toRadian) * sinDeltaLng * sinDeltaLng)
    distance = 2 * radius * math.asin(squareRoot);

    # 두 지점 간의 거리 (단위: km)
    return distance

- 방법 2. python haversine package 이용

unit` 조건을 변경하여 FEET, KILOMETERS, MILES 등의 단위로 리턴 가능

pip install haversine
from haversine import haversine

haversine((lat1, lon1), (lat2, lon2), unit = 'km')

 

 

 

 

 

 

Jupyter Notebook

 

 

 

 

 

 

Reference

https://en.wikipedia.org/wiki/Haversine_formula
https://velog.io/@revimal/Mathematics-Haversine-Formula
https://kayuse88.github.io/haversine/
https://stricky.tistory.com/284
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=haley2203&logNo=222308267667&categoryNo=43&proxyReferer=