본문 바로가기
Python

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

by teamnova 2024. 10. 14.
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'에 저장되었습니다.")

 

 

 

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

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

 

 

감사합니다