이것저것 기록

[python, GIS] 카카오 지도 API 를 사용해서 도로명주소 및 행정구역코드 추출 본문

코린이/실무를 위한 코딩 기록

[python, GIS] 카카오 지도 API 를 사용해서 도로명주소 및 행정구역코드 추출

anweh 2020. 12. 30. 15:49

근래에 카카오 지도 API를 사용해야할 일이 있었다. 사실 네이버 API든 카카오 API든 상관 없었는데, 

네이버 API는 서비스 등록 환경을 등록해야해서 url이나 앱 주소를 넣어야 했다. 

난 그냥 파이썬에서 API 기능 몇 개만 써보고 싶었는데...ㅠㅠ 

아무리 찾아도 서비스 등록 환경 없이 파이썬에서 네이버 API를 사용하는 방법에 대한 글을 찾을 수 없어서,

그냥 포기하고 카카오 API로 갈아 탔다 ㅋㅋㅋ 

그래서 오늘은 카카오 지도 API를 사용해서 주소 및 행정구역코드 정보를 받아오는 방법에 대해 기록해 두려고 한다. 

 

 

이 포스팅에 올린 코드는 깃헙에 샘플 파일과 함께 올려두었으니 참고! 

 

 

1. 필요한 라이브러리 

import pandas as pd
import requests 
import sys
import json
import datetime 

 

 

 

2. 함수 정의 

def json_request(url='', encoding='utf-8', success=None, error=lambda e: print('%s : %s' % (e, datetime.now()), file=sys.stderr)):
    headers = {'Authorization': 'KakaoAK {}'.format(APP_KEY)}
    resp = requests.get(url, headers=headers)
    # print('%s : success for request [%s]' % (datetime.now(), url))
    return resp.text


def reverse_geocode(longitude, latitude):
    # 파라미터 최적화하여 url 생성
    url = '%s?x=%s&y=%s' %(URL, longitude, latitude)
    # json request
    try:
        # print('try')
        json_req = json_request(url=url)
        json_data = json.loads(json_req)
        json_doc = json_data.get('documents')[0]
        json_name = json_doc.get('address_name')
        json_code = json_doc.get('code')
    except:
        # print('nan')
        json_name = 'NaN'
        json_code = 'NaN'
    return json_name, json_code

 
def get_address(x,y):
    address = []        
    json_name, json_code = reverse_geocode(x, y) 
    address.append(json_name)
    return address # 전처리 함수에서 주소 리스트 받아서 데이터프레임에 추가


def get_code(x,y):
    code = []        
    json_name, json_code = reverse_geocode(x, y) 
    code.append(json_code)
    return code # 전처리 함수에서 행정구역코드 리스트 받아서 데이터프레임에 추가

def get_address와 get_code는 카카오 지도 API를 사용해서 불러온 정보를 리스트 형식으로 저장해서 내보내는 코드이고, 실제로 카카오 지도 API에서 정보를 불러오는 함수는 def json_request와 def reverse_geocode 이다. 

reverse_geocode에서 요청을 보낼 url및 요청할 정보들을 정의하고, json_request에서 요청을 보내는 형식으로 짜여있다. 

만약에 내가 현재 설정한 정보 말고 다른 정보가 불러오고 싶다면 아래의 코드를 수정하면 된다. 

그리고 카카오 지도 API에서 제공하는 다양한 정보 및 요청 방법은 카카오의 개발가이드를 참고하면 된다. 

카카오 지도 API 개발 가이드

 

 

3. 코드 실행 

APP_KEY = '개인 REST APP KEY' 
URL = 'https://dapi.kakao.com/v2/local/geo/coord2regioncode.json'

df_all = pd.read_csv('서울특별시_병의원_위치_정보.csv', encoding='cp949') 
df = df_all[['기관ID', '병원경도', '병원위도']] # 기관ID, 병원경도, 병원위도 열만 추출 (도로명주소는 일부러 날림)


for i in range(len(df)): 
    x_crd = float(df.loc[i, ['병원경도']])
    y_crd = float(df.loc[i, ['병원위도']])
    address = get_address(x_crd, y_crd)
    code = get_code(x_crd, y_crd)
    df.loc[i, ['ADDRESS']] = address
    df.loc[i, ['CODE']] = code
    
    if i%100 == 0:
        print('{} 번째 경위도 좌표계에 대한 정보 불러오는 중...'.format(i))

실행 결과

Comments