1 minute read

python을 이용해서 지도를 표현할때 위도와 경도가 필요한데 주소지 만을 가지고 표현하려면
해당 주소기를 위도와 경도로 바꿔줘야 한다. 해당 솔루션이 아래에 이번에 언급하는 geopy이다.

주소를 지도로 바꾸는 방법

geopy doc

To geolocate a query to an address and coordinates:

>>> from geopy.geocoders import Nominatim
>>> geolocator = Nominatim(user_agent="specify_your_app_name_here")
>>> location = geolocator.geocode("175 5th Avenue NYC")
>>> print(location.address)
Flatiron Building, 175, 5th Avenue, Flatiron, New York, NYC, New York, ...
>>> print((location.latitude, location.longitude))
(40.7410861, -73.9896297241625)
>>> print(location.raw)
{'place_id': '9167009604', 'type': 'attraction', ...}

To find the address corresponding to a set of coordinates:

>>> from geopy.geocoders import Nominatim
>>> geolocator = Nominatim(user_agent="specify_your_app_name_here")
>>> location = geolocator.reverse("52.509669, 13.376294")
>>> print(location.address)
Potsdamer Platz, Mitte, Berlin, 10117, Deutschland, European Union
>>> print((location.latitude, location.longitude))
(52.5094982, 13.3765983)
>>> print(location.raw)
{'place_id': '654513', 'osm_type': 'node', ...}

직접 만든 위치데이터 가져와서 저장하는 코드

하다보면 데이터가 없어서 멈추거나 타임아웃나거나 하는 경우가 있는데 이 경우 예외 처리도 해서 처리하고 두개의 series로 선언해서 위도와 경도를 저장하는 코드를 만들었다.

import pandas as pd
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="myGeocoder")

latitude = pd.Series()
longitude = pd.Series()

for i in range(df_i.shape[0]):
    postal_code = df_i["Shipping Zip/Postal Code"][i]
    try:
        location = geolocator.geocode(postal_code)
        if location:
            print(f"{postal_code}: {location.latitude}, {location.longitude}")
            latitude.at[i] = location.latitude
            longitude.at[i] = location.longitude
        else:
            print(f"{postal_code}: Location not found")
    except:
        print(f"{postal_code}: GeocoderTimedOut")