在 R 中繪製地圖視覺化 leaflet:臺灣地區液化潛能製圖
今年春節前夕,發生了台南的大地震也讓人正視到台灣位於斷層帶的現實;
以下介紹,如何繪製 臺灣地區液化潛能製圖
首先你要有資料!
資料可以由網路上取得論文
本資料採用的是謝昇航 (2011)的論文 臺灣地區液化潛能製圖
下載位址: http://ir.lib.ncu.edu.tw:88/thesis/view_etd.asp?URN=976204004)
在附錄部份,作者提供了完整的資料表格;
一開始我使用的方式是:複製資料到 excel 後,錄製一段簡單的 VBA 將資料整理成一般資料表型式的 csv。後續有人提供可以用另外一套解決方案:tabula,可以直接捉取 pdf 資料輸出成 csv 格式,亦可以達成相同目的。
因為預設座標系統格式是 TWD97 格式,所以請專人協助後轉換為一般經緯度格式(即 EPSG 4326)。
對於資料有興趣的人,請直接整理好後的原始資料 https://drive.google.com/file/d/0B4523k7TnHsoRXYtNUcxUGh0T2s/view?usp=sharing
接下來就是正題了,若要繪製地圖 首先你要安裝 leaflet 套件,另外建議可以搭搭 dplyr 可以讓語法更為簡潔精練 然後試試以下的語法
leaflet( ) %>% addTiles( )
此時若你是使用 Rstudio 做為 IDE 工具,應該發現已經出現世界地圖了; 接下來我們要做的事情就是將我們的資料置入於地圖中
此時我們可以把我們的資料讀進來 例如:(實際路徑請自己依情況調整) dfmap <- read.delim("SheetR_MAP.csv",stringsAsFactors=FALSE)
然後把剛剛的語法調整如下: leaflet(df_map ) %>% addTiles( )
此時什麼事情都沒有發生
,因為我們還是沒有告訴 leaflet 要如何繪製圖形
好歹,我們要告訴 leaflet 各點位的經緯度吧?
m <- leaflet(df_map ) %>% addTiles( )
最基本的語法如下: m %>% addCircleMarkers( lat = ~ Lat , lng = ~ Lon ) 此時就可以將所有探測點給標示出來:
當然,我們感興趣的重點不會是探測點的位置,而是實際液化狀況為何? 因為資料量高達3000多點,若直接標示數值會顯得非常沒有意義; 此時可以依據論文作者所提示的數值間距,進行群組分類:
PL範圍: PL > 15 高度液化潛能
5<PL ≦15 中度液化潛能
0<PL ≦5輕度液化潛能
PL=0液化潛能極低
定義資料(顏色)群組:
pal <- colorBin(palette=c(green
,pink
,red
,purple
),domain=df_map$Pl,bins=c(0,5,10,15,70),pretty=TRUE,na.color=#808080
,alpha=F)
備註:於資料整理階段時已知最高值不會高於70
所以再將程式碼修改為:
m %>%
addCircleMarkers( lat = ~ Lat , lng = ~ Lon ,color=~pal(Pl) )
地圖上就會變成花花綠綠
最後,因為想要透過網路與網友們分享,我再加入了一些互動的功能 例如:游標指向的點會出現資料數值、可以針對區域做選擇
程式碼提供如下:
library(shiny) | |
library(leaflet) | |
library(dplyr) | |
# read data | |
df_map <- read.delim("Sheet_R_MAP.csv",stringsAsFactors=FALSE) | |
# define colorBin | |
pal <- colorBin(palette=c("green","pink","red","purple"),domain=df_map$Pl,bins=c(0,5,10,15,70),pretty=TRUE,na.color="#808080",alpha=F) | |
# define location group | |
local_map <- df_map$Location %>% unique() | |
ui <- fluidPage( | |
h1("臺灣地區液化潛能製圖 SHINY R VERSION"), | |
leafletOutput("mymap"), | |
p("Email: excel2power@live.com"), | |
p("Special thanks : David Chiu 協助轉換座標軸格式 "), | |
p("原始資料來源: David Chiu 協助轉換座標軸格式 "), | |
p("參考論文資料:謝昇航 (2011), 臺灣地區液化潛能製圖 ( http://ir.lib.ncu.edu.tw:88/thesis/view_etd.asp?URN=976204004) "), | |
p(""), | |
h3("PL範圍:液化情形") , | |
p("PL > 15 高度液化潛能;") , | |
p("5<PL ≦15 中度液化潛能;"), | |
p("0<PL ≦5輕度液化潛能;PL=0液化潛能極低") | |
) | |
server <- function(input,output,session){ | |
m <- leaflet(df_map) %>% addTiles( ) | |
output$mymap <- renderLeaflet({ | |
m %>% | |
addCircleMarkers( lat = ~ Lat , lng = ~ Lon , stroke=FALSE,color=~pal(Pl),label=~paste0(Pl),group=~Location) %>% | |
addLayersControl( overlayGroups=local_map)%>% | |
addLegend(position='topright' , pal=pal, values=~Pl) | |
}) | |
} | |
shinyApp(ui,server) |
可以發現若扣掉說明文字,整個具備基礎互動功能的地圖視覺化用了不到30行的程式碼… leaflet 的確在地圖視覺化解決方案上有蠻高的競爭優勢!