🖥️ IT, 컴퓨터/🐍 Python

[Python] 공간 상 점들 간 거리행렬 계산하는 코드 :: 대원거리 Haversine 활용

김 홍시 2024. 7. 5. 11:00
반응형

 

 

실제 경위도 좌표를 포함한 공간 데이터에서 거리행렬을 계산하기 위해서는 두 좌표 간의 대원거리를 계산해야 합니다. 이는 하버사인 공식(Haversine formula)을 사용하여 계산할 수 있습니다. 하버사인 공식은 두 지점 간의 거리를 구하는데 적합한 공식을 제공합니다.

다음은 파이썬(Python)을 사용하여 경위도 좌표를 가진 50개의 점 간의 거리행렬을 계산하는 방법입니다.

1. 필요한 라이브러리 임포트

먼저 필요한 라이브러리를 임포트합니다. 여기서는 NumPy와 하버사인 공식을 계산하기 위해 math 라이브러리를 사용할 것입니다.

import numpy as np
from math import radians, sin, cos, sqrt, atan2

2. 하버사인 공식 함수 정의

하버사인 공식을 사용하여 두 경위도 좌표 간의 거리를 계산하는 함수를 정의합니다.

def haversine(lon1, lat1, lon2, lat2):
    # 지구의 반지름 (km)
    R = 6371.0

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

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

    # 하버사인 공식 적용
    a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
    c = 2 * atan2(sqrt(a), sqrt(1 - a))

    # 거리 계산
    distance = R * c
    return distance

3. 경위도 좌표 리스트 생성

50개의 경위도 좌표를 랜덤하게 생성하거나 직접 정의할 수 있습니다. 여기서는 예시로 50개의 랜덤 경위도 좌표를 생성하겠습니다.

np.random.seed(0)  # 재현성을 위해 시드 설정
lats = np.random.uniform(-90, 90, 50)
lons = np.random.uniform(-180, 180, 50)
points = np.column_stack((lons, lats))

4. 거리행렬 계산

각 점 쌍 간의 하버사인 거리를 계산하여 거리행렬을 생성합니다.

def calculate_distance_matrix(points):
    num_points = points.shape[0]
    distance_matrix = np.zeros((num_points, num_points))

    for i in range(num_points):
        for j in range(num_points):
            distance_matrix[i, j] = haversine(points[i][0], points[i][1], points[j][0], points[j][1])

    return distance_matrix

distance_matrix = calculate_distance_matrix(points)

5. 거리행렬 출력

마지막으로 거리행렬을 출력하거나 확인할 수 있습니다.

print(distance_matrix)

전체 코드

위의 과정을 모두 포함한 전체 코드는 다음과 같습니다:

import numpy as np
from math import radians, sin, cos, sqrt, atan2

# 하버사인 공식 함수 정의
def haversine(lon1, lat1, lon2, lat2):
    R = 6371.0  # 지구의 반지름 (km)
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
    c = 2 * atan2(sqrt(a), sqrt(1 - a))
    distance = R * c
    return distance

# 경위도 좌표 리스트 생성
np.random.seed(0)  # 재현성을 위해 시드 설정
lats = np.random.uniform(-90, 90, 50)
lons = np.random.uniform(-180, 180, 50)
points = np.column_stack((lons, lats))

# 거리행렬 계산 함수 정의
def calculate_distance_matrix(points):
    num_points = points.shape[0]
    distance_matrix = np.zeros((num_points, num_points))

    for i in range(num_points):
        for j in range(num_points):
            distance_matrix[i, j] = haversine(points[i][0], points[i][1], points[j][0], points[j][1])

    return distance_matrix

# 거리행렬 계산
distance_matrix = calculate_distance_matrix(points)

# 거리행렬 출력
print(distance_matrix)

이 코드는 50개의 랜덤 경위도 좌표를 생성한 후, 각 점 쌍 간의 하버사인 거리를 계산하여 거리행렬을 생성하고 출력합니다. 필요에 따라 경위도 좌표를 직접 입력하거나 다른 방법으로 생성할 수도 있습니다.

반응형