2022年8月31日 星期三

Python 學習筆記 : 用 Folium 套件繪製地圖 (三)

Folium 這套件看似簡單易用, 但其 API 文件內容非常豐富, 還有非常多功能有待探究. 本篇主要是我閱讀日本人小久保奈都彌寫的 "Python 資料可視化攻略 (碁峰 2021)" 第六章關於 Folium 用法之測試筆記 :


Source : 博客來


本系列之前的文章參考 :

# Python 學習筆記 : 用 Folium 套件繪製地圖 (一)
Python 學習筆記 : 用 Folium 套件繪製地圖 (二)

由於 Folium 繪製的是網頁地圖, 故以下測試需在 Colab 或 JupyterLab 上進行. 


1. 用 folium.PolyLine() 畫直線 : 

在地圖中繪製直線通常是用來標示地圖中兩地的直線距離, 或顯示兩地之間的資訊流動 (人, 事, 物等). Folium 套件中用來繪製直線是使用 PolyLine 物件, 其類別之 API 如下 : 

class folium.vector_layers.PolyLine(locations, popup=None, tooltip=None, **kwargs)

參考 : 


只要呼叫其建構函式 folium.PolyLine() 並傳入如下參數會建立 PolyLine 物件 : 
  • locations : 直線兩端座標經緯度之兩層串列或元組
  • popup : 點擊直線會跳出的文字
  • color : 線條顏色, 可用顏色名稱字串如 'red' 或色碼如 '#1e227d'
然後呼叫其 add_to() 方法將自己添加到 Map 物件上即可 :

folium.PolyLine(locations=[latlng1, latlng2], popup=popup).add_to(map)

以繪製連接台北 101 與高雄 85 大樓的直線為例 : 

import folium   
import geocoder 

loc1="高雄85大樓"   
loc2="台北101"   
latlng1=geocoder.osm(loc1).latlng   
latlng2=geocoder.osm(loc2).latlng   
print(latlng1)   
print(latlng2)   
map=folium.Map(location=geocoder.osm('台灣').latlng, zoom_start=7.5)   
folium.Marker(location=latlng1, popup=loc1).add_to(map)   
folium.Marker(location=latlng2, popup=loc2).add_to(map)   
popup=f"{loc1}-{loc2}直線距離"   
folium.PolyLine(locations=[latlng1, latlng2], popup=popup).add_to(map)   
map   

此例先用 geocoder 查詢台北 101 與高雄 85 大樓之座標經緯度, 用 folium.Marker() 在此兩座標上打標記, 然後用 folium.PolyLine() 在此兩座標間畫一條直線, 結果如下 :




點擊此直線會彈出說明文字, 但可惜是直的. 


2. 用 folium.Circle() 畫圓 : 

呼叫 folium.Circle() 可以在地圖上畫圓, 這是 Circle 類別的建構函式 : 

class folium.vector_layers.Circle(location=None, radius=50, popup=None, tooltip=None, **kwargs)

參考 : 


主要參數如下 : 
  • location : 圓心座標經緯度
  • radius : 半徑 (單位為公尺, 預設為 50m)
  • color : 圓線顏色, 可用顏色名稱字串如 'red' 或色碼如 '#1e227d'
  • fill_color :  圓內填充顏色, 可用顏色名稱字串如 'red' 或色碼如 '#1e227d'
  • popup : 點擊圓會跳出的文字
呼叫 folium.Circle() 建立 Circle 物件後呼叫其 add_to() 方法將自己添加到 Map 物件上即可 :

folium.Circle(location=latlng, color='blue', file_color='ivory', popup=popup).add_to(map)

以繪製核三廠萬一發生核災的 80 公里避難圈為例, 程式碼如下 :

import folium  
import geocoder   
place="核三廠"     
latlng=geocoder.osm(place).latlng   
map=folium.Map(location=geocoder.osm(place).latlng, zoom_start=8)   
folium.Marker(location=latlng).add_to(map)    
folium.Circle(location=latlng, radius=80000, color='red', file_color='yellow').add_to(map)   
map   

結果如下 : 





可見 80 公里的避難圈幾乎包括整個屏東縣, 且已經到達小港機場了. 其實就日本福島核災經驗, 在 100 公里外還偵測到危險的輻射物. 


沒有留言 :