파이썬/GeoData

Python Geocoding (Googlemaps API) 주소-좌표 변환

hanshow113 2021. 10. 14. 11:03

 

지오코딩: 주소를 좌표로 변환

역지오코딩: 좌표를 주소로 변환

 

 

구글 클라우드 플랫폼에 가입한 후 api key를 먼저 받아야 함.

- 가입 시 구글에서 자동 가입을 방지하기 위해서 카드 등록을 요청하는데, 자동 연장이 되지 않으니 우선 등록하고 api key를 받으면 됨

 

https://cloud.google.com/

 

클라우드 컴퓨팅 서비스  |  Google Cloud

데이터 관리, 하이브리드 및 멀티 클라우드, AI와 머신러닝 등 Google의 클라우드 컴퓨팅 서비스로 비즈니스 당면 과제를 해결하세요.

cloud.google.com

 

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

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

 

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')