Python Folium을 이용하여 지도상에 버스 정류소 위치 나타내기

쏘올솔

·

2019. 12. 11. 00:01

Python의 Folium을 활용하여 지도상에 버스정류소 위치를 나타내 보았습니다.

 

 

Folium에 대한 설명 및 예시는 공식 document에 비교적 자세히 깔끔하게 정리되어 있습니다.

 

https://python-visualization.github.io/folium/

 

Folium — Folium 0.10.1 documentation

folium builds on the data wrangling strengths of the Python ecosystem and the mapping strengths of the leaflet.js library. Manipulate your data in Python, then visualize it in on a Leaflet map via folium. Concepts folium makes it easy to visualize data tha

python-visualization.github.io

 

import pandas as pd
import folium
from folium.plugins import MarkerCluster, MiniMap

 

시작하기 전에 우선 화성시청의 경도, 위도 값을 입력하여 지도상에 출력해 보았습니다.

 

map_hs = folium.Map((37.1995439, 126.8311358), zoom_start = 13)
mc = MarkerCluster()

mc.add_child(folium.Marker(location = [37.1995439, 126.8311358],
                           popup = '화성시청',
                           icon = folium.Icon(color = 'red', icon = 'info-sign')))

minimap = MiniMap()
map_hs.add_child(minimap)

map_hs.add_child(mc)

아이콘을 클릭하면 다음과 같이 popup에 입력된 텍스트가 출력됩니다.

 

 

이제 본격적으로 지도상에 버스 정류소 위치를 출력하기 위해 17~18년 기준, 경기도 버스 정류장에 대한 정보를 담고 있는 'PJT001_stations_table.csv' 파일을 불러옵니다.

 

bus_stops = pd.read_csv('PJT001_stations_table.csv', encoding = 'utf-8')
bus_stops.head(3)

지도 시각화에 필요한 위도, 경도, 정류소 이름 데이터를 추출하는 과정입니다. 정류소 위치만을 보여주기 위해 groupby를 실행합니다.

loc_data = bus_stops[['WGS84위도','WGS84경도','정류소명']].drop_duplicates(keep = 'first')
loc_data = bus_stops.groupby(['정류소명'])['WGS84위도','WGS84경도'].mean()

편의를 위해 column name을 변환합니다.

loc_data.columns = ['stop_name', 'latitude', 'longitude']
loc_data.head(3)

df.itertuples()을 사용하여 행 단위의 반복문을 실행합니다. 각 버스 정류소의 위도, 경도 값을 받아 해당 위치에 marker를 표시합니다.

for row in loc_data.itertuples():
    mc.add_child(folium.Marker(location = [row.latitude, row.longitude], popup = row.stop_name))
    map_hs.add_child(mc)

정류장이 한 곳만 있는 곳은 파란색 마커로 표시가 됩니다.

 

 

Folium을 사용할 때 쥬피터 상에 종종 하얗게 출력이 되어 아무것도 보이지 않을 수 있는데, 이는 볼륨이 크기 때문입니다.

map_hs.save('./bus_stops.html')

html형식으로 저장해서 보면 확인할 수 있습니다.