動機

世界越來越發達,工業化以及汽機車或者焚燒垃圾等等都會使空氣品質下降,而影響人們的呼吸,因而產生許多呼吸道疾病。此主題將所收集到的空氣質量信息更簡單明瞭的在地圖上顯現,在出門前看一下,可以做好防護

資料來源與說明

Column Name Description
sitename 測站名稱
county 縣市
aqi 空氣品質指標
pollutant 空氣污染指標物
status 狀態
so2 二氧化硫(ppb)
co 一氧化碳(ppm)
o3 臭氧(ppb)
o3_8hr 臭氧8小時移動平均(ppb)
pm10 懸浮微粒(μg/m3)
pm2.5 細懸浮微粒(μg/m3)
no2 二氧化氮(ppb)
nox 氮氧化物(ppb)
no 一氧化氮(ppb)
wind_speed 風速(m/sec)
wind_direc 風向(degrees)
datacreationdate 資料發布時間
co_8hr 一氧化碳8小時移動平均(ppm)
pm2.5_avg 細懸浮微粒移動平均值(μg/m3)
pm10_avg 懸浮微粒移動平均值(μg/m3)
so2_avg 二氧化硫移動平均值(ppb)
longitude 經度
latitude 緯度
siteid 測站編號

程式說明

library(readr)
library(leaflet)
  • 下載並讀取CSV檔案,命名為data,並將格式改成dataframe格式
data = read_csv("https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=CSV")
data = as.data.frame(data)
  • 先將colname改成中文或容易使用的,之後只取我們需要的資料的colname
colnames(data)=c('測站名稱','縣市','空氣品質指標','空氣污染指標物','狀態','二氧化硫(ppb)',
                 '一氧化碳(ppm)','臭氧(ppb)','臭氧8小時移動平均(ppb)','pm10','pm2.5','二氧化氮(ppb)',
                 '氮氧化物(ppb)','一氧化氮(ppb)','風速(m/sec)',
                 '風向','資料發布時間','一氧化碳8小時移動平均(ppm)',
                 'pm2.5_avg','pm10_avg','二氧化硫移動平均值(ppb)',
                 '經度','緯度','測站編號')
cols=c('測站名稱','縣市','空氣品質指標','空氣污染指標物','狀態','二氧化硫(ppb)',
       '一氧化碳(ppm)','臭氧(ppb)','pm10','pm2.5','二氧化氮(ppb)',
       '氮氧化物(ppb)','一氧化氮(ppb)','風速(m/sec)',
       '風向','資料發布時間','經度','緯度','測站編號')
data=data[cols]
  • 此段程式將各個字串使用paste0連接再一起,變成一個新的字串,裡面包含每個測站的詳細訊息,並賦予popup這個colname

  • 是換行的意思
  • 創建一個Leaflet地圖,並使用addTiles()添加底圖,addCircles()則是根據提供的經緯度,在地圖上添加標記,並將popup的內容家在彈出窗口
data$popup = paste0("測站名稱:", data$測站名稱, "<br>",
                    "縣市:", data$縣市, "<br>",
                    "空氣品質指標:", data$空氣品質指標, "<br>",
                    "空氣汙染指標物:", data$空氣汙染指標物, "<br>",
                    "狀態:", data$狀態, "<br>",
                    "二氧化硫(ppb):", data$"二氧化硫(ppb)", "<br>",
                    "一氧化碳(ppm):", data$"一氧化碳(ppm)", "<br>",
                    "臭氧:", data$"臭氧(ppb)", "<br>",
                    "pm10:", data$pm10, "<br>",
                    "pm2.5:", data$"pm2.5", "<br>",
                    "二氧化氮(ppb):", data$"二氧化氮(ppb)", "<br>",
                    "氮氧化物(ppb):", data$"氮氧化物(ppb)", "<br>",
                    "一氧化氮(ppb):", data$"一氧化氮(ppb)", "<br>",
                    "風速(m/sec):", data$"風速(m/sec)", "<br>",
                    "風向:", data$"風向", "<br>",
                    "資料發布時間:", data$資料發布時間, "<br>",
                    "測站編號:", data$測站編號)

map1 = leaflet() %>%
  addTiles() %>%
  # 使用 addTiles() 函數添加 tiles,
  # 並使用默認參數默認即是 OpenStreetMap,
  # 即街區 Tiles。
  addCircles(data=data, 
             lng=~經度, 
             lat=~緯度, 
             popup=~popup)
  • 將狀態良好、普通、對敏感族群不健康換成數值1,2,3
  • 使用狀態變數來建立顏色區間
  • colorBin函數來定義一個顏色對應的物件,palette是用於指定對應顏色的調色盤,bin是用於指定調色盤的分段數
data$狀態_n <- factor(data$狀態, levels=c("良好", "普通", "對敏感族群不健康"), labels=c(1, 2, 3))
data$狀態_n <- as.numeric(data$狀態_n)

pal_狀態 = leaflet::colorBin(palette=c("yellow", "red", "darkgreen"), 
                             domain=data$狀態_n, 
                             bins=3)
  • 此段程式與上面相同,創建一個新的地圖map2,根據狀態_n的值使用調色盤來設置標記的顏色
map2 = leaflet() %>%
  addTiles() %>%
  addCircles(data=data, 
             lng=~經度, 
             lat=~緯度,
             radius=2,
             color=~pal_狀態(狀態_n),
             fillOpacity=1,
             popup=~popup)
  • 此段程式是根據縣市的不同有不同的顏色
  • alpha為設置顏色透明度
  • 創建一個towns_color利用縣市的唯一值對應顏色,topo.colors()根據縣市數量生成一系列的顏色
  • leaflet::colorFactor是創建顏色因子
  • addLegend()是添加圖例說明縣市與顏色的對應關係
alpha = 0.9
towns_color = data.frame("town"=unique(data$縣市),
                         "color"=topo.colors(length(unique(data$縣市)), alpha=alpha))
pal_地區 = leaflet::colorFactor(palette=towns_color$color, 
                              domain=towns_color$town)
map3 = leaflet() %>% 
  addTiles() %>%
  addCircles(data=data,
             lng=~經度,
             lat=~緯度,
             color=~pal_地區(縣市),
             radius=2,
             fillOpacity=alpha, 
             popup=~popup) %>%
  addLegend(position="topright", pal=pal_地區, values=data$縣市)
  • png套件是可以讀入和寫入png圖像的函數
  • 將儲存在電腦中的logo路徑寫入
  • leaflet::makeIcon()創建圖標用於地圖上顯示
  • iconWidth和iconHeight指定了圖的寬度和長度
library(png)
logo="C:/Users/may/Desktop/r/1.png"
icon = leaflet::makeIcon(logo,
                         iconWidth=12,
                         iconHeight=12)
map4 = leaflet() %>% 
  addTiles() %>%
  addMarkers(data=data, 
             lng=~經度,
             lat=~緯度,
             icon=icon,
             popup=~popup)

logo = "C:/Users/may/Desktop/r/1.png"
icon = leaflet::makeIcon(logo,
                         iconWidth=12,
                         iconHeight=12)
  • clusterOptions=markerClusterOptions()標記點的聚類功能,將相鄰的標記點組合成聚類群組
map5 = leaflet() %>% 
  addTiles() %>%
  addMarkers(data=data, 
             lng=~經度, 
             lat=~緯度, 
             icon=icon,
             popup=~popup,
             clusterOptions=markerClusterOptions())

結果

map1

map1

map2

map2

map3

map3

map4

map4

map5

map5

結論

  • map1上的藍色點點是臺灣的所有空氣觀測站,而點任何一個點會顯示關於那個測站的資料以及觀測站測出那個位置的空氣品質,資料及時更新的,因此可以每天查詢
  • map2是根據資料中的狀態去分類,代表著空氣的品質,黃色是良好,暗綠色是普通,而紅色則是對敏感族群不健康,出門建議戴口罩
  • map3是將測站依照所在位置的縣市分類,從地圖上點的顏色可以知道那個測站在地縣市
  • map4將測站所在地圖上用圖標標示讓人更知道主題是甚麼
  • map5是聚類功能的地圖,如果一個地方有很多標記的話可能會重疊在一起,導致地圖上的可讀性的可視化下降,透過聚類減少標記點,改善大量標記點在地圖上的顯示效果。
  • 綜合上述幾個地圖,可以實現更好的數據可視化、空間分析和交互性用戶體驗,為用戶提供豐富的地圖功能和信息。