GIS

카카오 API를 활용한 지오코딩: 주소를 GeoPackage로 변환하기

유병혁 2023. 8. 15. 12:37

안녕하세요? 이번 글은 카카오 API를 활용하여 주소를 GeoPackage로 변환하는 방법을 정리해 보겠습니다. 주소 정보를 포함한 데이터프레임이 주어졌을 때, 해당 주소로부터 좌표 정보(경도, 위도)를 알아내어 데이터프레임에 추가하고, 이것을 다시 GeoPackage로 변환하는 일련의 과정입니다.

 

먼저 필요한 라이브러리를 가져옵니다. requests는 웹페이지에 요청을 보내고 해당 페이지의 내용을 가져오기 위해 필요한 라이브러리입니다. pandas는 데이터를, geopandas는 지리공간 데이터를 다루기 위한 라이브러리입니다.

import requests
import pandas as pd
import geopandas as gpd

카카오 API KEY Kakao Developvers(https://developers.kakao.com/)에서 회원가입 후 신청하시면 됩니다. API_KEY는 API를 호출할 때 인증을 위해 사용됩니다.

# 카카오 API KEY
API_KEY = "YOUR_API_KEY"

카카오 지도 API를 사용하여 입력된 주소를 좌표로 반환하는 함수를 정의합니다. 

# 주소를 좌표로 변환
def convert_address_to_coordinates(address):
    api_url = "https://dapi.kakao.com/v2/local/search/address.json"
    headers = {"Authorization": f"KakaoAK {API_KEY}"}

    params = {"query": address}
    
    try:
        response = requests.get(api_url, headers=headers, params=params)
        response.raise_for_status()
        result = response.json()

        if "documents" in result and len(result["documents"]) > 0:
            coordinates = result["documents"][0]["y"], result["documents"][0]["x"]
            return coordinates
        else:
            return None
    except requests.exceptions.RequestException as e:
        print(f"An error occurred: {e}")
        return None

데이터프레임에 주소에 해당하는 좌표 정보를 새로운 열(decimalLatitude, decimalLongitude)로 추가하는 함수를 정의합니다. 앞서 정의한 convert_address_to_coordinates 함수는 주소를 좌표 정보로 변환할 때 사용합니다.

# 데이터프레임에 좌표 추가
def add_coordinates_to_dataframe(df, address_column):
    latitudes = []
    longitudes = []

    for address in df[address_column]:
        coordinates = convert_address_to_coordinates(address)
        if coordinates:
            latitudes.append(coordinates[0])
            longitudes.append(coordinates[1])
        else:
            latitudes.append(None)
            longitudes.append(None)

    df["decimalLatitude"] = latitudes
    df["decimalLongitude"] = longitudes

자, 이제 정의한 함수를 활용해볼까요?! 샘플 데이터로 데이터프레임을 생성해 봅니다. 데이터프레임의 "Address" 열은 주소 정보를 포함하고 있습니다.

# 데이터프레임
data = {'Name': ['국립공원공단 본사', '국립공원연구원 본원', '치악산국립공원사무소'],
        'Address': ['강원특별자치도 원주시 혁신로 22', '강원특별자치도 원주시 단구로 171', '강원특별자치도 원주시 소초면 무쇠점2길 26']}
df = pd.DataFrame(data)
df.head()

주소를 좌표로 변환하여 데이터프레임에 추가하고, 이를 CSV로 저장하는 작업을 수행해 봅니다. 결과는 다음과 같습니다.

# 주소를 좌표로 변환하여 데이터프레임에 추가
add_coordinates_to_dataframe(df, 'Address')
df.to_csv('korea_np.csv', index=False, encoding='utf-8')
df.head()

CSV 파일을 GeoPackage(GPKG) 파일로 변환하는 csv_to_gpkg 함수를 정의합니다.

# CSV를 GeoPackage로 변환
def csv_to_gpkg(input_csv, output_gpkg):
    df = pd.read_csv(input_csv)
    gdf = gpd.GeoDataFrame(
        df,
        geometry=gpd.points_from_xy(df.decimalLongitude, df.decimalLatitude),
        crs="EPSG:4326",
    )
    gdf.to_file(output_gpkg, driver="GPKG")
    print("데이터 변환 및 저장 완료:", output_gpkg)

이제 CSV파일이 GPKG로 변환 및 저장되었습니다. GeoPackage 내에 저장된 지오메트리 데이터를 사용하여 QGIS와 같은 프로그램에서 다양한 지리공간 분석이 가능합니다.

 

input_csv = "korea_np.csv"
output_gpkg = "korea_np.gpkg"

csv_to_gpkg(input_csv, output_gpkg)

1924_카카오 API를 활용한 지오코딩_주소에서 GeoPackage로 변환하기.ipynb
0.01MB