[Reverse Geocoding] 카카오 API 사용해서 역지오코딩 (위·경도로 주소 추출)
Problem
Goal
: 교통사고 데이터의 위경도를 통해 행정동 주소를 반환
1. 카카오 API
- 카카오 계정으로 로그인 한 뒤, 개발자 계정 등록 (https://developers.kakao.com/)
-
앱 만들기
-
key 발급
2. 역지오코딩
-
Request, Response 형태 https://developers.kakao.com/docs/restapi/local#%ED%96%89%EC%A0%95%EA%B5%AC%EC%97%AD%EC%A0%95%EB%B3%B4-%EB%B3%80%ED%99%98
-
라이브러리, 전역 변수
import json
import sys
import pandas as pd
import requests
from datetime import *
# 전역 변수
accident_data = 'accident.csv'
location_data = 'location.csv'
APP_KEY = '' # 발급받은 키 입력
URL = 'https://dapi.kakao.com/v2/local/geo/coord2regioncode.json'
- json 데이터 요청
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
- json 데이터 파싱해서 행정동 주소 반환 (region_3depth_name)
def reverse_geocode(longitude, latitude):
# 파라미터 최적화하여 url 생성
url = '%s?x=%s&y=%s' %(URL, longitude, latitude)
# json request
try:
json_req = json_request(url=url)
json_data = json.loads(json_req)
json_doc = json_data.get('documents')[1]
json_name = json_doc.get('region_3depth_name')
except:
json_name = 'NaN'
return json_name
- 교통사고 파일에서 경위도 추출해서 동 주소 반환
def get_address(data):
address = []
# 경도, 위도 추출해서 동 주소 반환
for i in range(len(data)):
longitude = data['경도'][i]
latitude = data['위도'][i]
address.append(reverse_geocode(longitude, latitude))
return address # 전처리 함수에서 주소 리스트 받아서 데이터프레임에 추가
- main 함수
def main():
# 파일 읽기
data = pd.read_csv(accident_data, encoding='euc-kr')
location = pd.read_csv(location_data, encoding='euc-kr')
address = get_address(data)
data = preprocess(data, address, location) # 전처리 함수(생략했음)
# 최종 파일 저장
data.to_csv('%s_final.csv' % (accident_data[:-4]), sep=',', encoding='euc-kr')
if __name__ == '__main__':
main()
Subscribe via RSS