지오코딩이란?

고유명칭(주소나 산, 호수의 이름 등)을 가지고 위도, 경도의 좌표를 얻는 것

 

카카오 api를 이용하여 지오코딩 하기

1. Kakao Developers 사이트(https://developers.kakao.com/)에 회원가입 후 로그인

 

2. 내 애플리케이션 > 애플리케이션 추가(사진 필요X, 앱 이름, 사업자명은 아무거나)

이렇게 한 뒤 생성된 애플리케이션에 들어가보면 다음과 같이 키가 발급되어 있음

키는 메모장에 복사해두기

 

 

3. 내 애플리케이션 > 제품 설정 > 카카오 로그인 > 활성화 상태 On

 

 

4. 내 애플리케이션 > 제품 설정 > 카카오 로그인 > 맨 아래에 Redirect Url 추가

각자 사용환경에 맞게 등록(주피터 노트북의 경우 http://localhost:8888로 등록)

 

 

5. 코드 받기

https://kauth.kakao.com/oauth/authorize?client_id=REST API키&redirect_uri=http://localhost:8888&response_type=code&response_type=code

각자 발급받았던 REST API 키와 사용환경에 맞게 등록한 Redirect Url 주소를 알맞게 넣어 주소창에 입력

개인정보 동의를 누르면 자신의 개발환경 창으로 접속

주소창에는 http://localhost:8888/tree?code=코드값 의 형태로 코드가 함께 나타남

 

 

6. 토큰 받기

https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id=REST API키&redirect_uri=http://localhost:8888&code=드값

발급받은 REST API, 개발환경에 맞는 Redirect Url, 발급받은 코드를 각각 알맞게 붙여서 주소창에 입력

위와 같이 {"access token":"~", "token_type":"bearer", "refresh_token":"~",...}등 토큰이 발급됨

토큰은 기억할 필요X

 

 

7. 지오코딩 코드 작성

import json
import requests
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')

REST_API='발급받은 Rest Api 키'

def Geocoding(주소):
    url = 'https://dapi.kakao.com/v2/local/search/address.json?query=' + 주소
    headers = {"Authorization": "KakaoAK "+ REST_API}
    result = json.loads(str(requests.get(url, headers=headers).text))
    match_first = result['documents'][0]['address']
    return float(match_first['y']), float(match_first['x'])
    
Geocoding('지오코딩 하고 싶은 주소')

# 결과는 해당 주소의 (위도,경도)로 반환됨

 

 

8. 엑셀 파일에 입력된 주소 여러 개를 통째로 지오코딩하기(+없거나 변경된 주소에 대한 대처)

import os
import lxml.html
from lxml.html import fromstring
import pandas as pd
from bs4 import BeautifulSoup

# 주소가 입력되어 있는 엑셀파일 불러오기
df=pd.read_csv('엑셀파일명')

# 위도와 경도가 입력될 열 생성
df['latitude']=0
df['longitude']=0

# 지오코딩 함수는 위의 함수 그대로 사용

# 엑셀의 주소 변환 작업 시작
for i in range(len(df)):
    try:
        try:
            df['latitude'][i]=Geocoding(df['주소'][i])[0]     # (위도, 경도)로 반환되는 결과 중 위도 부분
            df['longitude'][i]=Geocoding(df['주소'][i])[1]    #(위도, 경도)로 반환되는 결과 중 경도 부분

        # 주소가 변경되었다면 주소정보누리집에서 주소를 검색하여 새로운 주소를 크롤링
        except:
            juso=df['주소'][i].replace(' ','+')
            url=f'https://www.juso.go.kr/support/AddressMainSearch.do?firstSort=none&ablYn=N&aotYn=N&fillterHiddenValue=&searchKeyword={juso}&dsgubuntext=&dscity1text=&dscounty1text=&dsemd1text=&dsri1text=&dssan1text=&dsrd_nm1text=&searchType=HSTRY&dssearchType1=road&dscity1=&dscounty1=&dsrd_nm_idx1=%EA%B0%80_%EB%82%98&dsrd_nm1=&dsma=&dssb=&dstown1=&dsri1=&dsbun1=&dsbun2=&dstown2=&dsbuilding1='
            res=requests.get(url)
            p=fromstring(res.text)
            li=p.xpath('//*[@id="list1"]/div[2]/span[2]')

            # 크롤링한 변경된 주소에서 불필요한 부분 삭제 후 원래 주소 자리에 대체
            df['주소'][i]=li[0].text.replace('\r','').replace('\t','').replace('\n','')
            df['latitude'][i]=getLatLng(df['LTNO_ADDR'][i])[0]
            df['longitude'][i]=getLatLng(df['LTNO_ADDR'][i])[1]
    
    # 주소가 변경된 것이 아니라 카카오맵에 없는 것이라면 위 방법으로도 오류를 해결할 수 없으므로
    # 일단 위도와 경도 모두 0으로 대체 후 따로 확인해보기
    except:
        df['latitude'][i]=0
        df['longitude'][i]=0

하루에 할 수 있는 주소 개수에 제한이 있어서 49000개~50000개 정도만 되는 것 같음

+ Recent posts