GIS 알아내는 방법 (python)

관련 문서

https://geopy.readthedocs.io/en/stable/

  1. 관련 라이브러리 설치
pip install pandas
pip install geopy
  1. 카카오 지도 검색 api 통해 들어온 주소를 넘겨 받아 csv 파일(서버에서는 아마 DB) 돌면서 해당 좌표내 반경 1km 이내에 해당하는 곳 저장. 그리고 이를 거리순으로 정렬.
  2. 그후 가까운 순서대로 출력 시작.
import pandas as pd
from geopy.distance import geodesic

def load_building_data(filepath):
    """
    CSV 파일에서 건물 데이터를 로드합니다.
    
    Parameters:
    - filepath (str): 파일 경로
    
    Returns:
    - DataFrame: 건물 데이터가 포함된 DataFrame
    - utf-8 혹은 cp949 파일이므로 try,except를 이용해서 진행할 예정.
    """
    try:
        return pd.read_csv(filepath, encoding='utf-8')
    except UnicodeDecodeError:
        return pd.read_csv(filepath, encoding='cp949')

def filter_and_sort_buildings(center_coord, buildings_df, radius_km):
    """
    주어진 반경 내의 건물들을 필터링하고 거리 순으로 정렬합니다.
    
    Parameters:
    - center_coord (tuple): 중심 좌표 (위도, 경도)
    - buildings_df (DataFrame): 건물 데이터를 포함하는 DataFrame
    - radius_km (float): 검색 반경 (킬로미터)
    
    Returns:
    - DataFrame: 필터링 및 정렬된 건물 데이터
    """
    # 거리 계산
    buildings_df['distance'] = buildings_df.apply(
        lambda row: geodesic(center_coord, (row['latitude'], row['longitude'])).km, axis=1)

    # 반경 내의 건물 필터링
    filtered_df = buildings_df[buildings_df['distance'] <= radius_km]

    # 거리 순으로 정렬
    sorted_df = filtered_df.sort_values('distance')

    return sorted_df

def print_buildings(buildings_df):
    """
    건물 데이터를 출력합니다.
    
    Parameters:
    - buildings_df (DataFrame): 건물 데이터를 포함하는 DataFrame
    """
    for index, row in buildings_df.iterrows():
        print(f"{row['name']} - Distance: {row['distance']:.2f} km")
    print(f"{len(buildings_df)}곳")
# 사용 예시
filepaths = ['school.csv', 'subway1.csv']  # CSV 파일 경로
center_coord = (37.536454060035, 126.89711732555)  # 중심 좌표 서울양평동우체국
radius_km = 1  # 검색 반경 (킬로미터)

for filepath in filepaths:
    buildings_df = load_building_data(filepath)
    filtered_sorted_buildings = filter_and_sort_buildings(center_coord, buildings_df, radius_km)
    print_buildings(filtered_sorted_buildings)
    print('--------------------------')

2024-05-03

해당 데이터를 돌리면서 문제 발생 . 대용량의 데이터를 돌릴 경우. 한좌표당 6초가량이 걸리는 문제가 발생됐으며, 더빠른 처리 속도를 필요로 했으며 유지 보수성이 떨어져 해당 파일을 따로 모듈화 진행했다.