學會以 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 行左右程式碼就搞定, 站上巨人的肩膀果然不一樣.
參考 :
沒有留言 :
張貼留言