今天介紹我平常沒啥用到的cap格式檔案。
Common Alerting Protocol (CAP),中文為共通示警協議。主要給各類災害緊急警報與大眾示警在各式的網絡中交換傳播(詳請可見這)
這邊會使用capparselib套件處理CAP資料。
安裝方式如下
pip3 install capparselib
目前未提供conda下載方式。
安裝完套件後,就來看看CAP資料吧。
先至氣象局開放資料下載天氣特報-豪大雨特報,下載完成會得到W-C0033-003.cap檔案。
用筆記本或code writer打開檔案,會呈現XML方式的資料內容。
所以基本上能夠預期處理CAP資料會類似處理XML資料。
以下提供處理方式囉
from capparselib.parsers import CAPParser
#讀取檔案
with open('day27/W-C0033-003.cap', 'r', encoding="utf-8") as fn:
src = fn.read()
#利用CAPParser方法轉成字典物件
alert_list = CAPParser(src).as_dict()
print(alert_list)
上述的print(alert_list)會得到如下圖,全部的資料都在截圖內。
因為這一份資料是解除大雨特報,看不出來如果有發布豪雨特報縣市時會有的樣態,有機會再來看看。
這邊使用可以得到的資訊做成一個dataframe。
另外有個小提醒,運用字典鍵值取出來的值,會是看起來像字串的lxml物件(我是覺得很怪啦),
如果要真的變成字串,要取其text屬性。看下面示範囉。
import pandas as pd
states = alert_list[0]['cap_info'][0]["cap_headline"].text
citylist = []
status = []
for cities in alert_list[0]['cap_info'][0]["cap_area"]:
cityname = cities["area_description"].text
citylist.append(cityname)
status.append(states)
df_city = pd.DataFrame(citylist,columns=["city"])
df_status = pd.DataFrame(status,columns=["status"])
df = pd.concat([df_city,df_status ],axis=1)
"""
上述的df會如下囉。
city status
0 基隆市 解除大雨特報
1 臺北市 解除大雨特報
2 新北市 解除大雨特報
3 桃園市 解除大雨特報
4 新竹市 解除大雨特報
5 新竹縣 解除大雨特報
6 苗栗縣 解除大雨特報
7 臺中市 解除大雨特報
8 彰化縣 解除大雨特報
9 雲林縣 解除大雨特報
10 南投縣 解除大雨特報
11 嘉義縣 解除大雨特報
12 嘉義市 解除大雨特報
13 臺南市 解除大雨特報
14 高雄市 解除大雨特報
15 屏東縣 解除大雨特報
16 宜蘭縣 解除大雨特報
17 花蓮縣 解除大雨特報
18 臺東縣 解除大雨特報
19 澎湖縣 解除大雨特報
20 金門縣 解除大雨特報
21 連江縣 解除大雨特報
"""
那CAP檔案裡面其實還有很多資訊,譬如geocodes之類的,這是提供使用GIS時,處理縣市shapefile或多邊形等物件方便使用。這邊就不多做視覺化了,畢竟警特報的意義在於文字簡易傳達重要訊息。當然要視覺化也是可以,但我覺得可以跟其他資訊疊在一起,譬如雷達回波、車流狀況等。
今天分享到這啦。