[Python] 以folium製作臺灣百岳資訊地圖

Folium可以將Python資料利用Leaflet.js呈現,主要用於視覺化地理資訊,而Leaflet.js是開源的JS數據庫,提供大多數常用的地圖繪製功能,簡單又好用。


首先要來個前置作業,先使用爬蟲從中華民國山岳協會取得了臺灣百岳的座標與標高。

import urllib
from bs4 import BeautifulSoup

request = urllib.request.urlopen('http://www.mountaineering.org.tw/tw/index.php/2015-09-13-14-48-49/2015-09-13-15-07-13').read()
soup = BeautifulSoup(request, "html.parser")


但山岳協會提供的是二分帶T67的座標 ,所以還需pyproj這個轉換座標系統的interface將它轉換成經緯度。

from pyproj import Proj

myProj = Proj("+proj=tmerc +ellps=aust_SA +lon_0=121 +x_0=250000 +k=0.9999 +units=m +no_defs")
longt, lat = myProj(x, y, inverse=True)

將預先有的資料以pandas讀入。

import pandas

data = pandas.read_csv("mount-data.txt", encoding="utf-8")

(這裡指定讀取編碼使用utf-8,其實是try出來的,一開始遇上亂碼,還沒找到發生原因。)

建立一個map物件,將中心訂在經度23.770876、緯度120.934757的地方,zoom_start則是起始的地圖大小,tiles是地圖的樣式。 有10種樣式可以選擇,default為Open street map,我只是挑一個我喜歡的使用。
import folium

mount_map = folium.Map([23.770876, 120.934757], zoom_start=8, tiles='Cartodb Positron')

為剛讀入資料檔,一筆一筆的標記在map上,每一個標記就是一個marker,marker也提供了不同樣式。 我想要做成三角型的樣子,所以用了RegularPolygonMarker,再設定邊數為3就行了。
folium.RegularPolygonMarker([lat, lon],
                             popup=popup,
                             number_of_sides=3,
                             rotation=30,
                             radius=15 ,
                             color='#deebf7',
                             fill_color=color[colorPick],
                             fill_opacity=0.5).add_to(mount_map)

fill_color是該標記的顏色,我直接笨笨的給了一列顏色,再由高度所算出來的index去取得它應該要填入的顏色。 在標記最後面加上.add_to(mount_map),把標記加到map上。
若想要讓popup資訊好看一點,可以用folium.IFrame加入html碼。
iframe = folium.IFrame(html=html, width=90, height=80)
popup = folium.Popup(iframe, max_width=200)

最後,將map存至html。
mount_map.save('mount-map-TW.html')


References:

Taiwan Datums
Folium Docs
大地座標系統漫談-上河文化
proj4 Docs

留言

這個網誌中的熱門文章

Django - admin 的設定筆記

交個筆友吧!老派的浪漫與科技之結合 - SLOWLY