9. 네이버 지도 API(주소, 좌표변환) 활용




지도 API는 네이버에서 활용도를 극대화 하기 위하여 오픈 소스로 비중 있게 공개하고 있는 부분이다. 자바 스크립트등을 이용하면 네이버 지도 서비스를 그대로 사용할 수 있고, 위성 지도, 파노라마, 교통 상화, 레이어 지도 등 다양한 서비스를 활용할 수 있어 지도와 관련된 어플리케이션 구성에 편의성을 제공해준다. 이번 절에서는 우리가 수신한 데이터를 지오(Geo)데이터(위경도 데이터)와 활용하기 위하여 주소, 좌표변환 서비스를 활용해 보도록 하겠다.

먼저 네이버 개발자 페이지로 이동한 후에 상단 메뉴의 [Application] » [내 어플리케이션]으로 이동한 후 개발자 ID를 받은 애플리케이션으로 이동하면 [그림 1]과 같이 상세 정보가 나타난다.

[그림 1] 사용 API의 추가


[그림 1]의 적색 상자로 표시한 부분의 “선택하세요”를 누른 후 [지도]를 선택한 후 하단의 [수정]버튼을 누르면 지도 API가 추가된다. 이제 아래와 같이 코드를 작성한다.

import os
import sys
import urllib.request
import datetime
import time
import json
from config import *

def get_request_url(url):
    
    req = urllib.request.Request(url)
    req.add_header("X-Naver-Client-Id", client_id)
    req.add_header("X-Naver-Client-Secret", client_secret)
    try: 
        response = urllib.request.urlopen(req)
        if response.getcode() == 200:
            print ("[%s] Url Request Success" % datetime.datetime.now())
            return response.read().decode('utf-8')
    except Exception as e:
        print(e)
        print("[%s] Error for URL : %s" % (datetime.datetime.now(), url))
        return None

#[CODE 1]
def getGeoData(address):
    
    base = "https://openapi.naver.com/v1/map/geocode"
    node = ""
    parameters = "?query=%s" % urllib.parse.quote(address)
    url = base + node + parameters
    
    retData = get_request_url(url)
    
    if (retData == None):
        return None
    else:
        return json.loads(retData)

def main():

    jsonResult = getGeoData('서울특별시 종로구 사직로 161 경복궁') 

    if 'result' in jsonResult.keys():
        print('총 검색 결과: ', jsonResult['result']['total'])
        print('검색어: ', jsonResult['result']['userquery'])
        
        for item in jsonResult['result']['items']:
            print('=======================')
            print('주소: ', item['address'])
            print('위도: ', str(item['point']['y']))
            print('경도: ', str(item['point']['x']))

if __name__ == '__main__':
    main()


코드를 실행하면 [그림 2]와 같이 주소를 위도와 경도로 변환한 값을 가지고 올 수 있다.

[그림 2] 주소 » 위경도 좌표 변환 결과


지오 데이터를 얻기 위하여 네이버는 https://openapi.naver.com/v1/map/geocode (json 형식)과 https://openapi.naver.com/v1/map/geocode.xml (xml 형식)의 End Point를 제공한다.

#[CODE 1]
def getGeoData(address):
    
    base = "https://openapi.naver.com/v1/map/geocode"
    node = ""
    parameters = "?query=%s" % urllib.parse.quote(address)
    url = base + node + parameters
    
    #이하 생략


전달하는 매개 변수의 형식은 다음과 같다.

query 검색어 파라미터(UTF-8 인코딩 형식)
encoding 출력 결과 인코딩값 (UTF-8 기본값 / EUC-KR)
coordType 출력 좌표 체계 (latlng(위경도) 기본값 / tm 128(카텍))


전달한 매개변수를 통해 수신하는 JSON 데이터의 형식은 [그림 3]과 같다.

[그림 3] 저장된 JSON 형식의 주소 검색 결과


이번 절에서 우리는 네이버 비로그인 API를 이용하여 뉴스 나 블로그등을 검색하는 방법과 주어진 주소를 가지고 위경도 좌표계로 변경하는 방법을 알아보았다. 주소 » 위경도 변경은 추후 알아보게 될 공공정보 데이터와 연계를 위하여 필요한 부분이므로 미리 숙지하고 가는 것이 좋을 것이다.