Python

[Python] 카카오 API 사용해서 도로명 주소를 위도, 경도 좌표로 반환하기 (Geocoding)

teamnova 2024. 10. 14. 23:34
728x90

안녕하세요 오늘은 도로명 주소를 위도, 경도 좌표로 변환해보도록 하겠습니다 

고유 명칭(주소나 산, 호수의 이름 등) 을 가지고 위도와 경도의 좌표값을 얻는 것을 

지오코딩(Geocoding) 이라고 합니다. 

 

카카오, 구글서는 지오코딩 가능한 api 를 제공합니다. 

하나의 주소에 대해서만 위도, 경도가 필요한 것이라면, 구글 검색으로도 충분합니다. 

본 게시글에서는 카카오 지오코딩을 사용하여서 csv 파일에 저장된 대량의 도로명 주소들에 대한

위도, 경도 좌표를 한번에 가져오도록 하겠습니다. 

 

 

1. 카카오 키 발급하기

먼저 카카오 개발자 홈페이지 (Kakao Developers) 에 들어갑니다. 

'내 애플리케이션 -> 애플리케이션 추가'  버튼을 눌러줍니다. 

 

지오코딩이라는 이름으로 새로운 프로젝트를 생성해줍니다. 

 

 

 

애플리케이션 생성과 동시에 사용 가능한 키가 발급됩니다. 

이는 api 요청을 보낼 때 사용해야 하는 키입니다. 

애플리케이션 '앱 키' 메뉴에서 확인 가능합니다 

 

네 개의 키 중, RESt API 키를 복사해줍니다. 

 

 

2. 파이썬에서 지오코딩 하기 

 

본 게시글에서는 파이썬으로 지오코딩을 진행할 예정입니다. 

경찰청에서 제공하는 전국 치안 센터 주소 현황 파일을 사용해보겠습니다.

확장자는 csv 이며, 해당 파일에는 전국에 있는 약 740여 개의 치안센터 도로명 주소가

기재되어 있는 것을 확인할 수 있습니다. 하나하나 위경도로 전환하는 것은 굉장히 시간이 걸리는 작업이 될 것입니다. 

 

 

먼저 파이썬의 pandas 라이브러리에서 제공하는 메소드를 활용해 csv 파일을 불러옵니다. 

해당 파일은 프로젝트 내에 저장되어 있어야 합니다. 

# CSV 파일 불러오기
df = pd.read_csv('../data/경찰청_전국치안센터 주소현황.csv', encoding='cp949', low_memory=False) # 메모리 사용 최적화 기능 끄기 # 도로명 주소 포함한 파일.

 

 

 

발급받은 api 키를 입력해주고

카카오에서 안내하는 api 요청을 보낼 서버 주소를 입력해줍니다

KAKAO_API_KEY = '8cfba63ec3a9c908937b040f11ff0b28'  # 발급받은 API 키 입력
KAKAO_URL = "https://dapi.kakao.com/v2/local/search/address.json"

# 카카오 API를 사용하여 주소를 위경도 좌표로 변환하는 함수
def get_lat_lon(address):
    headers = {
        "Authorization": f"KakaoAK {KAKAO_API_KEY}"
    }
    params = {
        "query": address  # 검색할 도로명 주소
    }
    try:
        response = requests.get(KAKAO_URL, headers=headers, params=params)
        if response.status_code == 200:
            data = response.json()
            if data['documents']:  # 결과가 존재할 경우
                latitude = data['documents'][0]['y']  # 위도
                longitude = data['documents'][0]['x']  # 경도
                return latitude, longitude
            else:
                return None, None
        else:
            print(f"Error: {response.status_code}")
            return None, None
    except Exception as e:
        print(f"Exception occurred: {e}")
        return None, None

# '주소' 컬럼의 도로명 주소를 위경도로 변환하여 새 컬럼 추가
df['latitude'], df['longitude'] = zip(*df['주소'].apply(get_lat_lon))

 

 

'주소' 칼럼은 도로명 주소가 있는 칼럼입니다. 

기존 파일에 새로운 칼럼 위도(latitude )와 경도(longitude) 칼럼을 새로 추가해줍니다. 

 

 

칼럼을 추가한 파일을 새롭게 저장해줍니다. 

# 결과를 새로운 CSV 파일로 저장
df.to_csv("geocoded_results.csv", index=False, encoding='utf-8-sig')
print("지오코딩 완료! 결과는 'geocoded_results.csv'에 저장되었습니다.")

 

 

 

위도, 경도 좌표 칼럼이 추가된 것을 확인할 수 있습니다 

결과를 확인하고 결측값을 따로 처리해주면 됩니다 

 

 

감사합니다