오늘은 예전에 업로드한 R로 지오코딩하는 글에 이어, Python으로 지오코딩 하는 방법을 정리하려 한다.
준비물
구글 클라우드 api 키를 미리 발급받아야 한다.
API 발급 과정은 구글링하면 참고 가능
https://console.cloud.google.com/welcome?project=clear-tooling-309601
구글클라우드 > 작대기 3개 버튼 > API 및 서비스 > 사용자 인증 정보
미리 복사해 둔다.
https://developers.google.com/maps/documentation/geocoding/start
에서 간단히 설명도 되어있다.
사용한 코드 (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를 사용하게 되면 주소만 있어도 경도 및 위도 좌표를 알 수 있다.
'🖥️ IT, 컴퓨터 > 🐍 Python' 카테고리의 다른 글
[Python] 부동산 지수 데이터 시각화하기 (feat. matplotlib) (0) | 2023.01.03 |
---|---|
[Python] 'utf-8' codec can't decode byte 0xbb in position 1: invalid start byte 오류 해결 (0) | 2022.12.02 |
[Python] 파이썬 테이블 열 이름이 밀려나는 오류 (0) | 2022.11.27 |
[Python] 파이썬으로 GIS하기 : GeoPandas로 간단한 지오프로세싱 수행하기 (좌표계 설정, join, spatial join, intersect, 지도 그리기) (0) | 2022.11.26 |
[Python] 카카오맵 API를 사용해 지오코딩하기 (주소를 경위도로 변환) ★★★★ (0) | 2022.11.26 |
댓글