이것저것 기록

[python, GIS] geopy로 주소 간단하게 지오코딩 하는 방법 본문

코린이/실무를 위한 코딩 기록

[python, GIS] geopy로 주소 간단하게 지오코딩 하는 방법

anweh 2020. 12. 9. 20:58

 

나무위키 정의:

지오코딩(Geocoding)은 고유명칭(주소나 산,호수의 이름등)을 가지고 위도 경도 좌표값를 얻는 것을 말한다.

이처럼 고유명칭이나 개별이름등을 가지고 검색하는것과는 달리 반대로 위도와 경도값으로부터 고유명칭을 얻는것은 리버스 지오코딩(reverse Geocoding)이된다.

 

 

도로명 주소와 같은 일반적인 주소는 OSM에 적용해서 데이터를 얻기 상당히 까다롭다.

반면에 (x, y) 좌표로 위치를 표현하게 되면 OSM이나 구글맵과 같은 기존의 맵 서비스들에서 더욱 정확한 위치를 찾을 수 있다. 

 

어쨌든, 도로명 주소를 지오코딩하는 방법에 대해 이것저것 찾아봤는데...

주로 네이버, 카카오, 구글과 같은 지도 API의 지오코딩 기능을 빌려다(?) 쓰는 것 같았다.

원래는 네이버 지도 API를 이용해서 지오코딩을 하려고 했었는데 한 세시간을 끙끙 해도 안돼서 다른 방법을 찾다가 이 방법을 발견했다. 

 

우선 사용할 라이브러리부터 불러오도록 하자.

 

 

1. 라이브러리 불러오기 

from geopy.geocoders import Nominatim
import osmnx as ox 

 

 

2. 지오코딩 함수 생성 

geolocoder = Nominatim(user_agent = 'South Korea')

def geocoding(address): 
    geo = geolocoder.geocode(address)
    crd = (geo.latitude, geo.longitude)
    print(crd)
    return crd

user_agent를 'South Korea'로 저장해줌으로써 한글 주소를 지오코딩할 수 있게 된다. 

geocoding이라는 함수는 address에 해당하는 좌표를 tuple 형태로 반환한다.  

 

 

3. 해당 좌표 인근의 POI 정보 불러오기

사실 내가 도로명 주소를 지오코딩 하고 싶었던 이유는 해당 좌표 인근의 POI정보를 추출하고 싶어서다. 

그러기 위해선 OSMnx의 pois module에 해당 좌표를 튜플로 넣어줘야한다.

tags = {'amenity': True}

address_list = ['서울대입구역',
'도림로 264',
'현충로 213']


demo = dict()
for i in address_list: 
    print(i)
    crd = geocoding(i)
    pois = ox.pois.pois_from_point(crd, tags=tags, dist=100)
    poi_count = pois['amenity'].value_counts()    
    demo[i] = poi_count

tags에 amenity를 True라고 한 이유는 모든 종류의 amenity를 가져오기 위함이다.

OSM에는 다양한 종류의 amenity가 있는데, 그 중에서 모든 값을 다 가져올 것이다. 

wiki.openstreetmap.org/wiki/Key:amenity

 

Key:amenity - OpenStreetMap Wiki

Usage For describing useful and important facilities for visitors and residents. Facilities include for example toilets, telephones, banks, pharmacies, prisons and schools. Values Key Value Element Comment carto-Rendering Photo Sustenance amenity bar Bar i

wiki.openstreetmap.org

address_list에는 내가 궁금한 위치의 주소를 넣어줬다. 

지하철역은 역이름으로 넣어도 잘 진행됨을 확인했고, 웬만한 도로명 주소를 넣어도 잘 된다. 

해당 좌표의 100m 안에 있는 POI 정보들을 불러오는 것이다. (dist = 100)

실행결과

Comments