Folium
Folium
은 Leaflet.js
를 이용하여 위치 좌표계 값을 지도 위에 시각화할 수 있다.
Map
먼저 Map 클래스를 로드해서 범위를 지정해준다. location
속성으로 주시하고자 하는 지도의 정중앙 좌표를 설정하고, zoom_start
속성으로 배율을 설정한다.
보고자 하는 위치의 좌표계 값을 얻어내는 가장 단순한 방법은 Google 지도를 이용하는 방법이다. 아래와 같이 구글 지도에서 검색을 하면 상단 주소창에 해당 위치의 대략적인 좌표계 값과 몇 배율로 지도가 보여지고 있는지 확인할 수 있다.
37.5838699,127.0565831,17z
값은 정확히는 해당 위치의 좌표값이 아니라 구글 지도 화면이 보여주고 있는 화면의 정중앙 값의 좌표와 배율이다.
구글 지도에서 알아낸 값을 바탕으로 아래와 같이 지도를 초기화할 수 있고, folium.Map.save()
를 이용해서 html 파일로 저장할 수 있다.
import folium
m = folium.Map(
location=[37.5838699,127.0565831],
zoom_start=15
)
m.save('map.html')
저장된 지도를 웹브라우저로 열어보면 다음과 같다.
Marker
Marker 클래스를 이용하면 특정 위치를 아이콘으로 강조할 수 있다.
Icon
기본적으로 Glyphicons
에서 제공하는 이미지를 이용해 지도 위에 표시할 수 있다.
import folium
m = folium.Map(
location=[37.5838699,127.0565831],
zoom_start=15
)
folium.Marker(
location=[37.5838699,127.0565831],
popup='University of Seoul',
icon=folium.Icon(color='red',icon='star')
).add_to(m)
m.save('map.html')
popup
속성에 문자열을 지정하여 클릭 시 팝업되는 메시지를 설정할 수 있다.
Circle
CircleMarker 를 이용해서 원형으로 표시할 수도 있다.
import folium
m = folium.Map(
location=[37.5838699,127.0565831],
zoom_start=15
)
folium.CircleMarker(
[37.5838699,127.0565831],
radius=100,
color='#ffffgg',
fill_color='#fffggg',
popup='University of Seoul'
).add_to(m)
m.save('map.html')
MarkerCluster
MarkerCluster 를 이용하면 가까운 거리의 Marker들을 군집시켜서 해당 건수를 표현해준다. 특정 클러스터를 클릭하면 해당 위치를 확대시켜 자세히 들여다볼 수 있다.
아래와 같이 로또 777회차 1등 당첨 정보를 바탕으로 MarkerCluster 를 생성할 수 있다.
import folium
m = folium.Map(
location=[36.5053542,127.7043419],
zoom_start=8
)
lotto = [
{"store":"담배","loc":[37.62585944357624,127.01847823823798]}, {"store":"화곡본마트","loc":[37.54248103738589,126.84414659211494]}, {"store":"용꿈돼지꿈","loc":[37.5447438346992,126.95223862043447]}, {"store":"일이오마켓","loc":[37.47943673430032,126.98346178441342]}, {"store":"여명슈퍼마켓","loc":[37.61432815661055,127.0415039221072]}, {"store":"5가로또레드탑","loc":[37.570756251987575,127.00235901546226]}, {"store":"복권세상","loc":[35.91885025656432,128.55034430109828]}, {"store":"복권전문점","loc":[37.50384327747725,126.71513104367074]}, {"store":"인현동지하가판","loc":[37.47627910055104,126.63147671205866]}, {"store":"CU(광주서동점)","loc":[35.14814807640179,126.90555219336346]}, {"store":"지산로또방","loc":[35.148338888178,126.93203920504686]}, {"store":"천사로또방","loc":[37.63618838692431,127.21107884503209]}, {"store":"오렌지통신","loc":[37.42889361993242,127.10232604117991]}, {"store":"여수복권방","loc":[37.418353650942116,127.12640523182601]}, {"store":"둘리복권방","loc":[37.34532813934063,126.73627994929885]}, {"store":"금성24시편의점","loc":[37.84401249737699,127.06236893072152]}, {"store":"GS25(청주주은점)","loc":[36.60987111587086,127.49134026856717]}, {"store":"장미슈퍼","loc":[36.276304155315685,126.90940713047799]}, {"store":"장미슈퍼","loc":[36.276304155315685,126.90940713047799]}, {"store":"아이24(수송점)","loc":[35.970108052787594,126.7189421934312]}, {"store":"탑로또","loc":[34.87844231008963,128.62803523643754]}
]
from folium.plugins import MarkerCluster
marker_cluster = MarkerCluster().add_to(m)
for i in range(len(lotto)):
folium.Marker(
location=lotto[i]['loc'],
popup=lotto[i]['store'],
icon=folium.Icon(color='red',icon='ok'),
).add_to(marker_cluster)
m.save('map.html')
아래와 같이 가까이 있는 마커들끼리 묶음으로 표현되고
서울 주변의 클러스터를 클릭하면 아래와 같이 확대된다.
GeoJson
geoJson을 활용하여 다각형을 표현할 수 있다. 행정구역같은 경계선이나 경로를 표현하는데 효율적이다.
서울시 행정구역 데이터(seoul_muncipalities_geo.json)를 이용해서 아래와 같이 시각화할 수 있다.
import folium
m = folium.Map(
location=[37.5838699,127.0565831],
zoom_start=10
)
import json
with open('./seoul_municipalities_geo.json',mode='rt',encoding='utf-8') as f:
geo = json.loads(f.read())
f.close()
folium.GeoJson(
geo,
name='seoul_municipalities'
).add_to(m)
m.save('map.html')
기타
folium.Map().get_root().render()
를 이용하면 html 파일을 저장하는거 말고 html 소스를 리턴할 수 있다.