2022年8月31日 星期三

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

學會以 Folium 繪製地圖的基本用法後, 本篇繼續來測試課堂中一個較實用的範例, 即結合網頁爬蟲從政府資料開放平台擷取 Ubike 的 JSON 檔, 然後在地圖上標示其位置. 以下是課後重看時所做的測試紀錄. 本系列之前的文章參考 :


首先來看一下資料源: 政府資料開放平台, 其網址如下 :


Ubike 的資料集放在 "交通及通訊" 類別下 : 




進去後點選左方 "地方機關" 下的 "台北市" : 




第一個就是 Ubike 的即時資訊 :




進去會發現一個 JSON 按鈕, 按此按鈕會顯示資料集內容 : 





將上方的網址複製起來, 這在爬蟲程式要用來擷取裡面的 json 格式資料集 :


先在命令列擷取與檢視此資料集 :

>>> import requests 
>>> url="https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json"   
>>> data=requests.get(url).json()   
>>> type(data)   
<class 'list'>   
>>> data[0]    
{'sno': '500101001', 'sna': 'YouBike2.0_捷運科技大樓站', 'tot': 28, 'sbi': 16, 'sarea': '大安區', 'mday': '2022-08-31 15:17:38', 'lat': 25.02605, 'lng': 121.5436, 'ar': '復興南路二段235號前', 'sareaen': 'Daan Dist.', 'snaen': 'YouBike2.0_MRT Technology Bldg. Sta.', 'aren': 'No.235, Sec. 2, Fuxing S. Rd.', 'bemp': 12, 'act': '1', 'srcUpdateTime': '2022-08-31 15:19:13', 'updateTime': '2022-08-31 15:19:07', 'infoTime': '2022-08-31 15:17:38', 'infoDate': '2022-08-31'}
>>> len(data)   
1146

此處使用 requests.get() 取得此 json 格式資料集, 並直接串用 Response 物件的 json() 方法轉成 list 型態, 可見整個資料集目前有 1146 筆, 每筆都是字典型態的站點訊息, 但其中只有 sna (站點名稱), lat (緯度), 與 lng (經度) 這三個是在網頁地圖上標示 Ubike 站點位置時所需的資料. 

可以用迴圈列出各站點的這三個資訊 (很長, 有 1146 筆) :

>>> for i in data:
    print(f"{i['sna']} : [{i['lat']}, {i['lng']}]")       

要在地圖上標示標示 Ubike 站點標記只要在迴圈中呼叫 folium.Marker().add_to() 即可 :

for i in data:
    folium.Marker(location=(i['lat'], i['lng']) , popup=i['sna']).add_to(map)

接下來要將上面的程式碼移到 JupyterLab 或 Colab 上執行 :

import requests  
import folium    
import geocoder   
place='台北市'    
latlng=geocoder.osm(place).latlng   
map=folium.Map(location=latlng, zoom_start=16)   
url="https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json"   
data=requests.get(url).json()   
for i in data:   
    folium.Marker(location=(i['lat'], i['lng']) , popup=i['sna']).add_to(map)   
map   

結果如下 : 




這在以前是很複雜的功能, 但 Python 只要 10 行左右程式碼就搞定, 站上巨人的肩膀果然不一樣. 


沒有留言 :