파이썬/GeoData
Python Geocoding (Googlemaps API) 주소-좌표 변환
hanshow113
2021. 10. 14. 11:03
지오코딩: 주소를 좌표로 변환
역지오코딩: 좌표를 주소로 변환
구글 클라우드 플랫폼에 가입한 후 api key를 먼저 받아야 함.
- 가입 시 구글에서 자동 가입을 방지하기 위해서 카드 등록을 요청하는데, 자동 연장이 되지 않으니 우선 등록하고 api key를 받으면 됨
api key를 받고나면 파이썬에서 구글맵스 라이브러리를 import 해야 함
!pip install googlemaps
================================================================
import pandas as pd
import googlemaps
googlemaps_key = "발급 받은 API Key"
gmaps = googlemaps.Client(key=googlemaps_key)
데이터는 서울 열린데이터 광장의 서울시 중학교 데이터를 이용
https://data.seoul.go.kr/dataList/OA-20556/S/1/datasetView.do
1. 주소를 좌표로 변환
DataFrame 이름: school
행당중학교
주소: 서울특별시 성동구 왕십리로 189
gmaps.geocode(school['도로명주소'][0])
>>>
[{'address_components': [{'long_name': '189',
'short_name': '189',
'types': ['premise']},
{'long_name': 'Wangsimni-ro',
'short_name': 'Wangsimni-ro',
'types': ['political', 'sublocality', 'sublocality_level_4']},
{'long_name': 'Sageun-dong',
'short_name': 'Sageun-dong',
'types': ['political', 'sublocality', 'sublocality_level_2']},
{'long_name': 'Seongdong-gu',
'short_name': 'Seongdong-gu',
'types': ['political', 'sublocality', 'sublocality_level_1']},
{'long_name': 'Seoul',
'short_name': 'Seoul',
'types': ['administrative_area_level_1', 'political']},
{'long_name': 'South Korea',
'short_name': 'KR',
'types': ['country', 'political']},
{'long_name': '133-070',
'short_name': '133-070',
'types': ['postal_code']}],
'formatted_address': '189 Wangsimni-ro, Sageun-dong, Seongdong-gu, Seoul, South Korea',
'geometry': {'location': {'lat': 37.5544241, 'lng': 127.041886},
'location_type': 'ROOFTOP',
'viewport': {'northeast': {'lat': 37.55577308029149,
'lng': 127.0432349802915},
'southwest': {'lat': 37.5530751197085, 'lng': 127.0405370197085}}},
'place_id': 'ChIJCbGBWaCkfDURtED-muKLvBo',
'plus_code': {'compound_code': 'H23R+QQ Seoul, South Korea',
'global_code': '8Q99H23R+QQ'},
'types': ['street_address']}]
결과가 리스트의 첫 번째 원소로 전부 들어가 있기 때문에 list[0] 으로 잡아서 좌표를 찾아낼 것
geo_location = gmaps.geocode(school['도로명주소'][0])[0].get('geometry')
lat = geo_location['location']['lat']
lng = geo_location['location']['lng']
print(lat, lng)
>>>
(37.5544241, 127.041886)
데이터프레임 열 전체를 수행하려면 for문 사용
lat, lng = [], []
for i, location in enumerate(school.도로명주소):
try:
geo_location = gmaps.geocode(location)[0].get('geometry')
lat.append(geo_location['location']['lat'])
lng.append(geo_location['location']['lng'])
except:
print(f"{i}번째 {(school.iloc[i, 3])}의 좌표를 찾을 수 없음")
lat.append(i)
lng.append(i)
이후 원래의 데이터프레임에 새로운 컬럼으로 붙여주면 됨.
2. 좌표를 주소로 변환하고 싶으면
reverse_geocode_result = gmaps.reverse_geocode((37.54794204380073, 127.07460710236217), language='ko')
위 for문 try 내부에 있는 geocode를 reverse_geocode로 바꿔주면 되고, 한국어 지원됨 (language='ko')