分類: R

R Leaflet 地圖套件:繪製網頁互動式地圖,呈現經緯度座標資料

這裡介紹如何在 R 中使用 Leaflet 繪製互動式的地圖,並將資料呈現在地圖上。

Leaflet 是一套相當熱門的網頁互動式地圖繪製工具,在 R 中我們也可以利用這套工具來繪製地圖,並將各種資料標示在地圖上,讓使用者以互動式的方式瀏覽資料。

R 的 leaflet 套件讓使用者在 R 的環境中(標準 R 執行環境或 RStudio)直接畫出網頁互動式的地圖,使用者可以使用滑鼠操作地圖(放大、移動等),另外 Leaflet 的地圖也可以內坎在 R Markdown 文件或 Shiny 應用程式中,與既有的文件或應用程式整合在一起。

基本用法

R 的 leaflet 套件已經被收錄在官方的 CRAN 網站上,在 R 中使用 install.packages 即可安裝:

install.packages("leaflet")

接著載入 leaflet 套件,即可開始使用:

library(leaflet)

leaflet 可以配合 magrittr%>% 管線運算子使用:

map <- leaflet() %>%
  addTiles() %>%  # 加上預設的地圖資料
  addMarkers(lng=120.239, lat=22.992, popup="訊息方塊的文字說明")
map  # 繪製地圖

RStudio 使用 Leftlet 繪製地圖

若不熟悉 magrittr%>% 管線運算子語法,也可以使用傳統的 R 語法,兩種寫法功能都一樣:

map <- leaflet()
map <- addTiles(map)
map <- addMarkers(map, lng=120.239, lat=22.992, popup="訊息方塊的文字說明")
map

Leaflet 地圖物件

leaflet 函數會傳回一個 Leaflet 的地圖物件(map widget object),此物件中儲存了許多地圖繪製的相關資訊,可於後續持續修改與更新,而大部分的 leaflet 套件中的函數,第一個參數都是指定地圖物件,因此可以非常容易與 magrittr 的管線運算子配合使用。

地圖屬性

在建立 Leaflet 地圖物件之後,可以利用以下幾個函數來修改地圖物件的屬性:

函數名稱 說明
setView 設定地圖的中心座標位置以及縮放比例。
fitBounds 設定地圖的位置與縮放比例,讓畫面剛好可呈現指定的方形區域。
clearBounds 清除指定的方形區域,顯示最大的區域(全球地圖)。

以下示範這幾個函數的使用方式,通常在建立地圖時都會使用 setView 設定地圖的位置與縮放比例:

m <- leaflet() %>%
  addTiles() %>%
  setView(-71.0382679, 42.3489054, zoom = 18)
m

setView 設定地圖顯示區域

若要顯示特定的矩形區域,則可使用 fitBounds 來變更地圖的顯示區域:

m %>% fitBounds(-72, 40, -70, 43)

fitBounds 變更地圖的顯示區域

清除了指定的方形區域之後,就會顯示最大的區域,亦即全球地圖:

m %>% clearBounds()

全球地圖

資料來源

leaflet 與各種地圖圖層函數都有一個 data 參數,可用來指定空間資料(spatial data)的來源,其可接受的資料格式有很多種:

類型 資料格式
基本類型 包含經緯度的 R 矩陣
包含經緯度的 data frame
sp 套件 SpatialPoints[DataFrame]
Line/Lines
SpatialLines[DataFrame]
Polygon/Polygons
SpatialPolygons[DataFrame]
maps 套件 map 函數所產生的 data frame

當資料來源為一般的 data frame 時,leaflet 會自動尋找 data frame 中名稱類似 lnglongitudelatlatitude 作為經緯度座標,以下是一個以圓圈標示資料的範例:

set.seed(3)
point.df <- data.frame(
  Lat = 22.992 + rnorm(10)/800,
  Long = 120.239 + rnorm(10)/800
)
m <- leaflet(point.df) %>%
  addTiles() %>%
  setView(lng = 120.239, lat = 22.992, zoom = 17)
m %>% addCircles()

以圓圈標示資料

亦可使用公式的方式明確指定經緯度座標的變數名稱:

m %>% addCircles(lng = ~Long, lat = ~Lat)

也可以針對特定的圖層個別指定不同的資料來源:

m <- leaflet() %>%
  addTiles() %>%
  setView(lng = 120.239, lat = 22.992, zoom = 17)
m %>% addCircles(data = point.df, lng = ~Long, lat = ~Lat)

關於 spmaps 套件的資料來源範例,可參考 R Leaflet 套件官方網站的範例

公式介面

leaflet 套件中所有圖層函數的參數都可以接受一般的 R 向量(例如以數值向量指定經緯度等),也可以使用單邊的公式指定 data 資料來源中的變數,例如 ~ x 就是指 data 中的 x 變數,另外也可以結合各種的數學轉換,例如 ~ sqrt(x + 1)

以下是一個使用公式的範例:

set.seed(3)
point.df <- data.frame(
  lat = 22.97 + rnorm(100)/800,
  long = 120.23 + rnorm(100)/800,
  size = runif(100, 5, 20),
  color = sample(colors(), 100)
)
m <- leaflet(point.df) %>%
  addTiles() %>%
  setView(lng = 120.23, lat = 22.97, zoom = 17)
m %>% addCircleMarkers(radius = ~size, color = ~color, fill = FALSE)

以圓圈標示資料

這是使用一般 R 向量的例子:

m %>% addCircleMarkers(radius = runif(100, 4, 10), color = c('red'))

以圓圈標示資料

Page: 1 2 3

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang

Recent Posts

光陽 KYMCO GP 125 機車接電發動、更換電瓶記錄

本篇記錄我的光陽 KYMCO ...

2 年 ago

[開箱] YubiKey 5C NFC 實體金鑰

本篇是 YubiKey 5C ...

2 年 ago

[DIY] 自製竹火把

本篇記錄我拿竹子加上過期的苦茶...

3 年 ago