🖥️ IT, 컴퓨터/🐍 Python

[Python] 구글맵 API를 사용해 지오코딩하기 (주소를 경위도로 변환)

김 홍시 2022. 11. 26.
반응형

오늘은 예전에 업로드한 R로 지오코딩하는 글에 이어, Python으로 지오코딩 하는 방법을 정리하려 한다.

https://kimhongsi.tistory.com/entry/R-%EC%B9%B4%EC%B9%B4%EC%98%A4%EB%A7%B5-API%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4-%EC%A7%80%EC%98%A4%EC%BD%94%EB%94%A9%ED%95%98%EA%B8%B0-%EC%A3%BC%EC%86%8C%EB%A5%BC-%EA%B2%BD%EC%9C%84%EB%8F%84%EB%A1%9C-%EB%B3%80%ED%99%98

 

[R] 카카오맵 API를 사용해 지오코딩하기 (주소를 경위도로 변환)

오늘은 R로 카카오맵 API를 사용해 지오코딩하는 방법을 기록해봅니다. 준비물 : (1) 장소명, 주소가 기록된 csv파일 (2) 카카오맵 API의 개인 KEY (3) RStudio 원하는 결과 : csv파일의 주소 정보를 카카오

kimhongsi.tistory.com

준비물 

구글 클라우드 api 키를 미리 발급받아야 한다.

API 발급 과정은 구글링하면 참고 가능

https://console.cloud.google.com/welcome?project=clear-tooling-309601 

구글클라우드 > 작대기 3개 버튼 > API 및 서비스 > 사용자 인증 정보

 

미리 복사해 둔다.

 

https://developers.google.com/maps/documentation/geocoding/start

 

시작하기  |  Geocoding API  |  Google Developers

지오코딩은 주소를 지리 좌표로 변환하여 지도에 배치합니다. 역지오코딩은 지리 좌표 또는 장소 ID를 기준으로 주소를 찾습니다.

developers.google.com

에서 간단히 설명도 되어있다.

 

 

 

사용한 코드 (1) 하나의 주소를 지오코딩하기

import pandas as pd
import numpy as np
from urllib.request import urlopen, Request 
from bs4 import BeautifulSoup
from urllib.parse import quote

from tqdm.notebook import tqdm
data = []
for ADDRESS in tqdm(df["지번주소"]):
    API_KEY = "본인의 key"
    ADDRESS = "서울특별시 관악구 관악로 1"
    API_TYPE = "xml"
    url = f"https://maps.googleapis.com/maps/api/geocode/{API_TYPE}?address={quote(ADDRESS)}&key={API_KEY}"
    req = Request(url)
    page = urlopen(req)
    page = BeautifulSoup(page, "html.parser")
    page.findAll("lat")
    lat = page.findAll("lat")[0].text
    lng = page.findAll("lng")[0].text
    result = [ADDRESS, lat, lng]
    data.append(result)

API_KEY에 본인의 API 키를 입력

 

 

코드 설명 

API_TYPE :  xml 형식인지, json 형식인지 입력

quote(ADDRESS) : 주소를 quote로 감싸주어야 아래와 같이 한글로 작성한 주소(관악로 1)가 퍼센트 인코딩 (wiki)이 됨

그럼 url이 이러한 주소로 print됨

해당 주소로 들어가면 위와 같음

beautifulsoup의 html 파서를 이용하면 이와 같이 정리된다.

여기에 보면 lat과 lng으로 경/위도가 표시되는데, 이게 3개나 존재한다.

findAll을 쓰면 lat이 들어간 부분을 모두 보여준다.

이 세 가지 경위도는 순서대로 센트로이드 좌표, 남서쪽 끝, 북동쪽 끝의 좌표를 말한다.

3개 중 첫 번째 (센트로이드 좌표)를 쓸 것이므로 [0]으로 입력

 

 

 

본 코드에서는 address에 서울대학교 위치 하나만 입력하였으나,

여러 주소를 직접 입력하든지 표를 이용하든지 해서 여러 개의 주소를 입력할 수도 있음

 

 

 

 

 

 

 

사용한 코드 (2) 여러 개의 주소를 지오코딩하기

import pandas as pd
import numpy as np
from urllib.request import urlopen, Request 
from bs4 import BeautifulSoup
from urllib.parse import quote
df = pd.read_csv("망고플레이트.csv", encoding = "CP949")
from tqdm.notebook import tqdm
data = []
for ADDRESS in tqdm(df["지번주소"]):
    try: 
        API_KEY = "자신의 KEY"
        API_TYPE = "xml"
        url = f"https://maps.googleapis.com/maps/api/geocode/{API_TYPE}?address={quote(ADDRESS)}&key={API_KEY}"
        req = Request(url)
        page = urlopen(req)
        page = BeautifulSoup(page, "html.parser")
        page.findAll("lat")
        lat = page.findAll("lat")[0].text
        lng = page.findAll("lng")[0].text
        result = [ADDRESS, lat, lng]
        data.append(result)
    except KeyboardInterrupt:
        break
    except IndexError:
        print(f"에러가 발생했습니다: {ADDRESS}")
pd.DataFrame(data, columns = ["주소", "위도", "경도"])

csv를 내보내기하고 싶다면 아래 코드를 추가로 입력

result = pd.DataFrame(data, columns = ["주소", "위도", "경도"])
result.to_csv("결과.csv", index=False, encoding="CP949")

준비물

'지번주소'라는 열 이름이 있는 csv파일

(혹은 위의 코드에서 for ADDRESS in tqdm(df["지번주소"]): 에서 지번주소가 아닌 본인 데이터의 열 이름으로 바꿔도 됨)

 

꼭 주소가 아니라 검색어가 들어있어도 구글이 잘 찾아줌

 

코드 설명

이렇게 df에 원하는 테이블 파일을 불러와주고

address에 해당 df 테이블의 '지번주소' 열에 있는 주소를 넣어주어, 

지오코딩 동작을 반복한다.

 

try와 except 구문을 활용하여, 에러가 발생해도 멈추지 않고 넘어갈 수 있게 한다.

그리고 이와 같이 어디에서 에러가 발생했는지도 보여준다.

 

결과

아래와 같이 구글 맵 API를 사용하게 되면 주소만 있어도 경도 및 위도 좌표를 알 수 있다.

 

 

반응형

댓글