본문 바로가기

공부방/Upstage AI Lab 4기

위도와 경도를 기준으로 주변에 있는 공원 개수 구해주기

아파트 주소를 기준으로 한 위도와 경도 x, y 좌표값과 공원 주소를 기준으로 한 위도와 경도 x, y 좌표값이 존재한다.

이때, 경도와 위도를 가지고 거리를 계산해서 1km 이내에 공원이 몇 개 있는지를 새로운 컬럼으로 넣어준다.

 

HOW

1) 아파트와 공원 좌표값을 넣어주면, 거리를 계산해주는 함수를 만든다. 

2) 1km 이내 거리에 있는 공원의 합계를 리턴하는 함수를 만든다.

3) 데이터셋에 새로운 컬럼으로 붙여 넣는다. 

 

from scipy.spatial.distance import cdist
import numpy as np
from math import radians, sin, cos, sqrt, atan2

#모든 아파트와 모든 공원 사이의 거리를 계산. 결과는 2차원 배열로, 각 행은 공원, 각 열은 아파트. 
def haversine_distances(apt_coords, park_coords):
    # 지구의 반경 (km)
    R = 6371.0

    apt_coords = np.radians(apt_coords)
    park_coords = np.radians(park_coords)

    diff = park_coords[:, np.newaxis] - apt_coords
    
    a = np.sin(diff[:,:,0]/2)**2 + \
        np.cos(park_coords[:,0])[:, np.newaxis] * np.cos(apt_coords[:,0]) * \
        np.sin(diff[:,:,1]/2)**2

    c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))
    return R * c

def count_parks_within_radius(apt_coords, park_coords, radius_km=1):
    distances = haversine_distances(apt_coords, park_coords)
    return np.sum(distances <= radius_km, axis=0)

#모든 아파트의 좌표(경도, 위도)를 numpy 배열로 변환
apt_coords = merge[['x', 'y']].values
#모든 공원의 좌표(경도, 위도)를 numpy 배열로 변환 
park_coords = park[['X좌표(WGS84)', 'Y좌표(WGS84)']].values 

# 각 아파트 주변 1km 내의 공원 수 계산
merge['주변공원개수'] = count_parks_within_radius(apt_coords, park_coords)

# 결과 확인
print(merge['주변공원개수'].value_counts())

 

0    478152
1    413030
2    183969
3     57722
4      7262
5       968
6        17
Name: 주변공원개수, dtype: int64