목차

제가 운영중인 네이버 블로그에서 가장 질문이 많은 글이라 다시 정리해서 올려보았습니다. 해당 글을 작성하게 된 배경은 아파트 실거래가 예측 프로젝트 진행 중 아파트의 가격과 각종 편의시설 및 주요 시설들의 관계(예 : 역세권)를 거리 기반으로 엮기 위해서 위도, 경도 좌표가 필요했습니다.



0. Geocoding이란?

지오코딩(geocoding)은 주소를 위도, 경도로 바꾸는 작업입니다.

이 글에서는 도로명주소를 순서대로 입력하면 해당 주소의 정보를 json형태로 받아서 정보 내에서 위도와 경도 데이터만 뽑아서 저장하는 코드를 다루고 있습니다.

https://blog.kakaocdn.net/dn/l8qX0/btqNpGnfzXF/6S4YD65MAZTecQb4GNFWK1/img.png

지오코딩 진행과정


각종 지오코딩 프로그램, 구글 API, KAKAO MAP API도 있지만 속도 문제 및 비용 문제로 인해 네이버의 지도 API를 사용하게 되었습니다. KAKAO MAP API에 대해 일 30만회 무료기 때문에 횟수 측면에서 더 낫다는 질문 댓글이 있었는데 실제 프로젝트 진행중에 카카오쪽을 이용했을 때 지오코딩 횟수가 1만회가 넘어가는 순간 이유를 모른채 끊기는 경우가 발생하여 포기하게 되었습니다.

네이버 지도 API는 네이버 클라우드 플랫폼에서 사용권한을 얻을 수 있습니다.



https://blog.kakaocdn.net/dn/FXGKS/btqNqdLRPmW/wXBeGi4csaudH6KieY7z4k/img.png

네이버 클라우드 플랫폼은 네이버에서 제공하는 서비스로 저장소, 데이터 분석, 데이터베이스 등 다양한 IT 서비스들이 있습니다. 서비스들 중 지도 API를 사용할건데 월 300만건 무료 사용이 가능하기 때문에 개인 프로젝트시에 활용하기 좋습니다. 공공데이터를 받을 때 인증키를 발급받아야 했던것처럼 네이버에서도 인증키를 발급받아야하기 때문에 홈페이지로 들어가보도록 하겠습니다.


인증키 발급

https://blog.kakaocdn.net/dn/phKa7/btqNpfQSsaZ/SP7mLYGJjEESihKcXX8mcK/img.png

네이버 클라우드 플랫폼 메인 화면입니다. 여기서 맨 오른쪽 Console 버튼을 눌러서 이동합니다.

https://blog.kakaocdn.net/dn/cWYCKD/btqNthsX9l4/ax9kFySTJSf4piY2tBkDEk/img.png

현재 본인이 이용중인 서비스들을 등록하고 확인할 수 있는 콘솔 페이지입니다. 좌측 배너에 있는 Product & Services를 누르면 뜨는 창에서 AI·NAVER API를 누릅시다. AWS에서는 원하는 서비스를 검색창에서 검색해서 찾아볼 수 있어 직관적이었는데 이 부분이 아쉽네요.

https://blog.kakaocdn.net/dn/SywgZ/btqNqeqt1Qz/De5kLY5G8ckfwAkQKxn3wk/img.png

키 발급을 받기 위해 Application 등록 버튼을 눌러줍시다.

https://blog.kakaocdn.net/dn/c1IQ7B/btqNpHmaayF/LRHWVSmtUKiYUqNhJHJv5K/img.png

실제 애플리케이션에 사용할 것은 아니기 때문에 임의의 값을 입력해주고 Service 선택에서 Geocoding을 선택해주시고 등록을 하시면 됩니다. 등록 후 인증 정보 버튼을 누르면 아래와 같은 창을 볼 수 있는데 ID와 Secret에 있는 텍스트를 저장해둡시다. 이 값들을 이용해 네이버 API에 접속하여 정보를 얻어올 수 있습니다.

https://blog.kakaocdn.net/dn/qoMiP/btqNqdykymP/PLvgpq2UlzMYyNqURk1aR1/img.png



2. Geocoding 실행

Python으로 위도 경도를 받는 코드는 다른 분의 블로그에서 참고를 하였습니다. 도움을 많이 받은 글이기 때문에 글씨를 클릭하면 바로 보실 수 있습니다.

이 블로그에 있는 코드를 그대로 실행했을 때 주소를 못 찾는 경우 에러 처리가 제대로 되지 않아서 문제가 되는 부분만 수정하여 python 스크립트를 올립니다.

예제 파일을 따로 첨부하지 않았으며 코드를 각자 사용환경에 맞춰 바꿀 필요가 있기 때문에 python에 익숙하지 않으신 분들은 사용하기 어려울 수 있습니다.

#사용 라이브러리
import numpy as np
import pandas as pd
from urllib.request import urlopen
from urllib import parse
from urllib.request import Request
from urllib.error import HTTPError
from bs4 import BeautifulSoup
import json

#naver map api key
client_id = '아이디';    # 본인이 할당받은 ID 입력
client_pw = '비밀번호';    # 본인이 할당받은 Secret 입력

api_url = 'https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode?query='

# 주소 목록 파일 (.csv)
data = pd.read_csv('파일명.csv')
# 주소 목록 파일 (.xlsx)
data = pd.read_excel('파일명.xlsx')

# 네이버 지도 API 이용해서 위경도 찾기
geo_coordi = []     
for add in data['도로명주소']:
    add_urlenc = parse.quote(add)  
    url = api_url + add_urlenc
    request = Request(url)
    request.add_header('X-NCP-APIGW-API-KEY-ID', client_id)
    request.add_header('X-NCP-APIGW-API-KEY', client_pw)
    try:
        response = urlopen(request)
    except HTTPError as e:
        print('HTTP Error!')
        latitude = None
        longitude = None
    else:
        rescode = response.getcode()
        if rescode == 200:
            response_body = response.read().decode('utf-8')
            response_body = json.loads(response_body)   # json
            if response_body['addresses'] == [] :
                print("'result' not exist!")
                latitude = None
                longitude = None
            else:
                latitude = response_body['addresses'][0]['y']
                longitude = response_body['addresses'][0]['x']
                print("Success!")
        else:
            print('Response error code : %d' % rescode)
            latitude = None
            longitude = None

    geo_coordi.append([latitude, longitude])


np_geo_coordi = np.array(geo_coordi)
pd_geo_coordi = pd.DataFrame({"도로명": data['도로명주소'].values,
                              "위도": np_geo_coordi[:, 0],
                              "경도": np_geo_coordi[:, 1]})

pd_geo_coordi.to_csv('파일명.csv')