最易上手地圖教程(一)(上)


R_leaflet包_最易上手地圖教程(一)(上)

歡迎關注天善智能,我們是專注於商業智能BI,人工智能AI,大數據分析與挖掘領域的垂直社區,學習,問答、求職一站式搞定!

對商業智能BI、大數據分析挖掘、機器學習,python,R等數據領域感興趣的同學加微信:tstoutiao,邀請你進入數據愛好者交流群,數據愛好者們都在這兒。

四川大學在讀研究生

最近一直在尋找方便上手的地圖包,實驗了google地圖包,百度地圖包,發現還是有很多限制。

百度地圖包搭配的REmap總是崩潰,

google地圖包ggmap現在需要國際信用卡註冊,總之,都不甚滿意。

雖然ggplot2地圖功能非常豐富,但是還是不夠簡單快捷。

尤其是當我們僅僅需要繪製一些簡單的地圖時。

經過圈子大佬的推薦,開始嘗試leaflet包,確實給我很多驚喜。

leaflet包相對其它地圖包,有很多優點和缺點,

首先,繪製地圖簡單快捷,因為都是基於供應商的tiles,一行代碼就可以render出基本widget地圖。

支持管道傳參,一個圖層一個圖層進行添加,代碼結構更加清晰。

其次,有很多tiles供應商可以選擇,包括高德、google、Stamen, Esri, OpenWeatherMap,NASA,

等好幾十個tiles供應商。當然其中一些需要註冊。其中的google可以繞過註冊,已經很難得了。

對於在地圖上添加markers圖標,shapes形狀,線條等,異常方便快捷,這在ggplot2中很難做到的。

支持柵格數據,rasters柵格數據是基於像素點的地圖。可以看出,leaflet具有很強的包容性。

支持多種投影座標系,甚至可以自定義座標系,這在某些特殊場景非常重要。

當然還有更重要的是,其具有一定交互能力,可以縮放拖拽,

簡單的圖層切換也不需要使用Shiny。使得更容易上手。

其它特點,首先tiles是基於供應商的,必須聯網,

其次對顏色支持不一樣,只支持HEX顏色空間和colors()中的顏色名稱。 當然內置的幾個palette函數,非常特別。

總之,筆者認為leaflet包與ggplot2包的互補性非常好,剛好彌補了ggplot2中畫地圖的不足。

對於大量數據需要呈現在地圖上的場景,還是`ggplot2, leaflet中插入其它plots不便也沒有必要。

下面是筆者總結的中文教程,使得新人能更快上手。

說明:以下圖片皆為截圖,限於技術問題,不能完全展現它的交互式功能。

1.Widget設置

Widget地圖框的設置,就是確定Widget的基本參數,

包括CRS座標系,widget的中心座標,zoom level(縮放)的範圍, widget邊界座標,data數據等。

1.1

leafletOptions()

leaflet()中有個options參數,用leafletOptions()函數來指定,可以控制widget縮放範圍。

語法:

1leafletOptions(minZoom = NULL, maxZoom = NULL, crs = leafletCRS(),
2 worldCopyJump = NULL, preferCanvas = NULL, ...)

關鍵參數:

  • minZoom,表示最低縮小倍數,作用於所有地圖層。
  • maxZoom,表示最高放大倍數,作用於所有地圖層。
  • crs, 表示指定座標系統,
  • preferCanvas, 表示是否將leaflet.js路徑呈現在地圖上。
1library(leaflet)
2
3leaflet(options = leafletOptions(minZoom = 0, maxZoom = 18))

1.2

中心、縮放、邊界

關鍵函數:

  • setView() ,設定地圖的view(包括center位置和zoom level)
  • flyTo() ,切換到一個指定的location或zoom-level,使用光滑的pan-zoom
  • fitBounds() ,設定地圖矩形區域邊界。view將限制在[lng1, lat1] - [lng2, lat2]
  • flyToBounds() ,切換到一個指定的地圖矩形區域邊界,使用光滑的pan/zoom
  • setMaxBounds() ,限定地圖矩形區域最大邊界
  • clearBounds() ,清除地圖矩形區域邊界, 然後view將只會受地圖層的經度和緯度數據限制。

語法:

  • setView(map, lng, lat, zoom, options = list())
  • flyTo(map, lng, lat, zoom, options = list())
  • fitBounds(map, lng1, lat1, lng2, lat2, options = list())
  • flyToBounds(map, lng1, lat1, lng2, lat2, options = list())
  • setMaxBounds(map, lng1, lat1, lng2, lat2)
  • clearBounds(map)

參數解釋:

  • map,表示leaflet()創建的map widget
  • lng, 表示map center的經度,
    東經為正
  • lat, 表示map center的緯度,北緯為正
  • zoom, 表示zoom level
  • options, 列表傳參,傳遞zoom或pan參數。
  • lngl, latl, lng2, lat2, 表示widget邊界的座標。
 1library(leaflet)
2
3# 設定中心座標和zoom level
4m % addTiles() %>% setView(-71.0382679, 42.3489054, zoom = 18)
5
6# 顯示第一個view
7m %>% fitBounds(-72, 40, -70, 43) # 設定view邊界
8
9# 顯示第二個view
10m %>% clearBounds() # 清除邊界限制, leaflet()默認為世界地圖


R_leaflet包_最易上手地圖教程(一)(上)


R_leaflet包_最易上手地圖教程(一)(上)


1.3

Data數據

這裡的Data不僅僅是畫地圖上行政區域的數據,而且包括要在地圖上呈現的數據。

大多數圖層添加函數都有data參數,通常使用%>%管道符逐漸傳遞data參數。

leaflet()通常支持下列幾種形式的數據。

  • 矩陣數據(由經度和緯度構成)。
  • 數據框(由經度和緯度構成)。
  • 從sp包傳遞的數據,包括:
  • SpatialPoints(數據框類型)
  • Line()/Lines()
  • SpatialLines()(數據框類型)
  • Polygon()/Polygons()
  • SpatialPolygons()(數據框類型)
  • 從maps包傳遞的數據,主要是map()函數傳遞的數據框。

對於經度和緯度組成矩陣或數據框類型數據,在調動data添加圖層時,會根據變量名進行猜測匹配:

  • 若變量名稱為lat,或latitude等,則猜測為緯度,猜測時,不區分大小寫
  • 若變量名稱為lng, long或 longitude等,則猜測為經度,猜測時,不區分大小寫。

也可以手動指定經度和緯度變量,使用~語法。

在參數傳遞過程中,默認後面的data參數覆蓋前面data參數。

1.3.1 data中經緯度的指定/猜測/覆蓋

 1library(leaflet)
2
3# 自動猜測匹配
4set.seed(123)
5df 6leaflet(df) %>% addCircles()
7
8# 手動指定經度和緯度變量,結果一樣 leaflet(df) %>% addCircles(lng = ~Long,
9# lat = ~Lat)
10
11# 在add_xxx()函數中重新指定參數進行覆蓋,結果一樣 leaflet() %>%
12# addCircles(data = df) leaflet() %>% addCircles(data = df, lat = ~Lat, lng
13# = ~Long)


R_leaflet包_最易上手地圖教程(一)(上)


1.3.2 sp對象的data

 1library(leaflet)
2library(sp)
3library(RColorBrewer)
4
5Sr1 6Sr2 7Sr3 8Sr4 9
10
11Srs1 12Srs2 13Srs3 14
15# 列表傳參,傳遞多個多邊形參數
16SpP 17
18leaflet(height = "300px") %>% addPolygons(data = SpP, fillColor = brewer.pal(3,
19 name = "Set1"))


R_leaflet包_最易上手地圖教程(一)(上)


1.3.3 從maps包中獲取data

1library(leaflet)
2library(maps)
3library(RColorBrewer)
4
5mapStates 6leaflet(data = mapStates) %>% addTiles() %>% addPolygons(fillColor = brewer.pal(10,
7 name = "Paired"), stroke = FALSE)


R_leaflet包_最易上手地圖教程(一)(上)


1.3.4 其它參數

其它繪圖參數支持R自帶的數據類型,如:向量,顏色向量,數據框,同樣支持用~指定。

 1library(leaflet)
2
3# 隨便編一個數據
4m % addTiles()
5df 6 color = sample(colors(), 100))
7
8m % addTiles()
9# circle圖標的半徑不隨zoom變化:
10m %>% addCircleMarkers(radius = ~size, color = ~color, fill = FALSE)
11# circle圖標的半徑不隨zoom變化:
12m %>% addCircleMarkers(radius = runif(100, 4, 10), color = c("red"))


R_leaflet包_最易上手地圖教程(一)(上)


R_leaflet包_最易上手地圖教程(一)(上)


2.Basemaps底圖

leaflet支持Tilemap類型的底圖,

leaflet支持多種免費第三方providers的tiles, 包括Stamen, Esri, OpenWeatherMap等,

用names(providers)可以查看所有的providers。

2.1

默認Tiles(OpenStreetMap)

使用addTiles()函數添加tiles並使用默認參數,默認即是OpenStreetMap,即街區Tiles。

1library(leaflet)
2
3m % setView(lng = -71.0589, lat = 42.3601, zoom = 12)
4m %>% addTiles() # 顯示街區圖


R_leaflet包_最易上手地圖教程(一)(上)


2.2

第三方 Tiles

調用addProviderTiles()函數,在參數providers$後面加tiles供應商的名字就行了。 需要注意:部分第三方tiles需要註冊。

通過options參數調用providerTileOptions()函數可以規避部分tiles的註冊。

如果有定製的tiles模板的URL鏈接,可以在addTiles()函數中調用。

1library(leaflet)
2
3m % setView(lng = -71.0589, lat = 42.3601, zoom = 12)
4
5# 使用Stamen.Toner 的 tiles
6m %>% addProviderTiles(providers$Stamen.Toner)


R_leaflet包_最易上手地圖教程(一)(上)


2.3

巧妙的數據轉換

通過調用函數addWMSTiles()可以添加WMS(Web Map Service)的tiles。

Web地圖服務(WMS)是一種標準協議,描述如何通過Internet提供任何地理配準的地圖圖像,

這通常由使用來自地理信息系統數據庫的數據的地圖服務器生成。

協議標準由Open Geospatial Consortium(OGC)開發,

並於1999年首次發佈.WMS提供了一種使用HTTP接口請求地理註冊地圖圖像的簡單方法。

WMS供應商(https://en.wikipedia.org/wiki/Web_Map_Service)

下圖是調用WMS的tiles,顯示降雨量的圖數據來源(http://mesonet.agron.iastate.edu/)。

1library(leaflet)
2
3leaflet() %>% addTiles() %>% setView(-93.65, 42.0285, zoom = 4) %>% # 疊加一個WMS的tiles圖層
4addWMSTiles("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", layers = "nexrad-n0r-900913",
5 options = WMSTileOptions(format = "image/png", transparent = TRUE), attribution = "Weather data 2012 IEM Nexrad")


R_leaflet包_最易上手地圖教程(一)(上)


2.4

Tiles圖層疊加

多個Tiles圖層也可以疊加, 但是這種情況通常僅用於表層tiles是半透明的情況下,

或在options參數中手動指定不透明度opacity。

opacity從0(完全透明)到1(完全不透明)。

1library(leaflet)
2
3m % setView(lng = -71.0589, lat = 42.3601, zoom = 12)
4
5m %>% addProviderTiles(providers$MtbMap) %>% # 底層tiles
6 addProviderTiles(providers$Stamen.TonerLines, # 疊加一層tiles,顯示公路和街道
7 options = providerTileOptions(opacity = 0.35)) %>% # opacity設定非透明度
8 addProviderTiles(providers$Stamen.TonerLabels) # 疊加tiles,顯示公路名,街道名,機場圖標。


R_leaflet包_最易上手地圖教程(一)(上)


3.Markers(圖標)

使用圖標用於標記地圖上特殊的點。圖標的位置通過經緯度指定。

leaflet中,圖標可以分為:icon,circle圖標,clusters(簇),共3類。

Markers座標獲取途徑:

  • SpatialPoints()/SpatialPointsDataFrame() (sf包)
  • POINT, sfc_POINT或sf對象(sf包), 只有x,y維度的數據才能被使用。
  • 只有2列的矩陣(第1列為經度,第2列為緯度)
  • 含經度列和緯度列的數據框,
  • 同樣默認猜測匹配,也可以手動指定,如: addMarkers(lng = ~Longitude, lat = ~Latitude)。
  • 用1個數字向量指定lng或lat參數。

注意:不支持sf包中的 MULTIPOINT對象。

3.1

icon圖標

icon圖標的添加分為幾類:

  • addMarkers()函數,添加leaflet中內置一種icon。
  • makeIcon()指定addMarkers()函數內的icon參數,
  • 添加URL鏈接(包括file path)中的一種icon。
  • icons()指定addMarkers()內的icon參數,同時添加幾種icon。
  • iconList()與addMarkers()函數聯用,同時添加很多種icon。
  • addAwesomeMarkers()函數,添加awesome icons。

3.1.1 內置icon(addMarkers())

默認Icon為雨滴狀圖標(dropped pin)。

與大多數圖層繪製函數一樣,popup參數可以用來指定一個message,當點擊該Icon則顯示該message;

label參數可以用來指定一個文本標籤,可以是浮動的或靜止的。

1library(leaflet)
2data(quakes)
3
4# 索引quakes前20行數據進行顯示。
5leaflet(data = quakes[1:20, ]) %>% addTiles() %>%
6# 增加圖標圖層,標籤顯示為quakes中的mag變量

7addMarkers(~long, ~lat, popup = ~as.character(mag), label = ~as.character(mag))


R_leaflet包_最易上手地圖教程(一)(上)


3.1.2 自定義icon(makeIcon())

自定義Icon圖標,可以通過URL鏈接或文件路徑來指定。

對於單獨一個Icon,若要映射到多個數據點,則可以使用makeIcon()函數製作一組Icon圖標,

然後再調用addMarkers()函數增加Marker圖層。

免費Icon下載(https://icons8.com/icons)

 1library(leaflet)
2data(quakes)
3
4# 製作一組Icon
5greenLeafIcon 6 iconUrl = "E:/R_input_output/images_input/leaf-green.png", # 使用文件路徑指定
7 iconWidth = 38, iconHeight = 95, # 設定當個Icon的相對長寬。
8 iconAnchorX = 22, iconAnchorY = 94, # 定位點相對位置(在IconWidth和IconHeight內)
9 shadowUrl = "E:/R_input_output/images_input/leaf-shadow.png", # 陰影Icon
10 shadowWidth = 50, shadowHeight = 64,
11 shadowAnchorX = 4, shadowAnchorY = 62
12)
13
14leaflet(data = quakes[1:4,]) %>% addTiles() %>%
15 addMarkers(~long, ~lat, icon = greenLeafIcon) # 增加Icon圖層


R_leaflet包_最易上手地圖教程(一)(上)


3.1.3 icons()(多種icons)

若多個Icons圖標尺寸等參數一致,僅僅URLs不一樣,使用icons()製作Icon圖標組合非常方便,

icons()語法與data.frame()類似,參數都可以用向量指定,短的參數將會循環補齊

 1library(leaflet)
2data(quakes)
3
4quakes1 5
6leafIcons 7 iconUrl = ifelse(quakes1$mag < 4.6, # 若mag < 4.6為真
8 "E:/R_input_output/images_input/leaf-green.png", # test = TRUE
9 "E:/R_input_output/images_input/leaf-red.png" # test = FALSE
10 ),
11 iconWidth = 38, iconHeight = 95, # length = 1, 循環補齊
12 iconAnchorX = 22, iconAnchorY = 94, # length = 1, 循環補齊
13 shadowUrl = "E:/R_input_output/images_input/leaf-shadow.png", # length = 1, 循環補齊
14 shadowWidth = 50, shadowHeight = 64, # length = 1, 循環補齊
15 shadowAnchorX = 4, shadowAnchorY = 62 # length = 1, 循環補齊
16)
17
18leaflet(data = quakes1) %>% addTiles() %>%
19 addMarkers(~long, ~lat, icon = leafIcons) # 傳遞製作的Icons參數
20


R_leaflet包_最易上手地圖教程(一)(上)


3.1.4 icon列表(iconList())

若一些Icons的參數相差很大,此時使用iconList()函數更加方便,

相當於創建一個列表將makeIcon()創建icons包裹起來。然後整體傳遞給addMarkers()。

 1library(leaflet)
2
3# iconList()製作icons組成的列表
4oceanIcons 5 ship = makeIcon(iconUrl = "E:/R_input_output/images_input/cargo-ship.png", # 使用文件路徑指定
6 iconWidth = 30, iconHeight = 20), # 設定當個Icon的相對長寬。
7 pirate = makeIcon(iconUrl = "E:/R_input_output/images_input/pirates-caribbean.png", # 使用文件路徑指定
8 iconWidth = 30, iconHeight = 30) # 設定當個Icon的相對長寬。
9)
10
11# 編造一個數據
12df 13 cbind( # 列合併後為一個4列20行的數據框
14 (runif(20) - .5) * 10 - 90.620130, # 經度
15 (runif(20) - .5) * 3.8 + 25.638077 # 緯度
16 ),
17 data.frame(type = factor(
18 ifelse(runif(20) > 0.75, "pirate", "ship"), # test > 7.5為真,則type = "pirate"
19 c("ship", "pirate") # length = 2 < 20, 循環補齊
20 ))
21)
22
23leaflet(df) %>% addTiles() %>%
24 addMarkers(icon = ~oceanIcons[type]) # 使用type中的元素匹配oceanIcons中的列名。


R_leaflet包_最易上手地圖教程(一)(上)


3.1.5 Awesome icons(addAwesomeMarkers())

leaflet中可以使用定製Icons的顏色,

使用addAwesomeMarkers()添加awesome icons, 用法與addMarkers()類似。

awesome icons庫:fontawesome,glyphicon,ionicons。

在addAwesomeMarkers()中可以用library參數指定awesome icons庫。

默認為library = "glyphico", library = "fa"表示fontawesome庫, library = "ion"表示ioncons庫,

與icons()和iconList()函數可以用於addMarkers()類似,

awesomeIcons()和 awesomeIconList()函數可以用於 addAwesomeMarkers()以添加多個icons。

 1library(leaflet)
2data(quakes)
3
4df.20 5
6# 創建顏色向量函數,mag <= 4 為綠色,mag = 5為橙色, mag > 5為紅色
7getColor 8 sapply(quakes$mag, function(mag) {
9 if(mag <= 4) {
10 "green"
11 } else if(mag <= 5) {
12 "orange"
13 } else {
14 "red"
15 } })
16}
17
18icons 19 icon = 'flash', # icon名字為"flash"(閃電),名字可以從前面庫的網站上查看
20 iconColor = 'black', # 指定icon顏色
21 library = 'ion', # 指定icons庫為ionicons
22 markerColor = getColor(df.20) # 指定markers顏色
23)
24
25leaflet(df.20) %>% addTiles() %>%
26 addAwesomeMarkers(~long, ~lat, icon=icons, label=~as.character(mag))


R_leaflet包_最易上手地圖教程(一)(上)


3.2

Marker clusters(圖標簇)

當地圖上存在大量的圖標,可以通過設置clusterOptions參數以簇的形式插入。

好處是,縮小地圖後,圖標聚集成簇,放大地圖後,簇散開為多個圖標。 簇上可以顯示該簇包含圖標的數目。

3.2.1 添加簇(clusterOptions參數)

使用markerOptions()設定單個簇的參數。

對於多個簇,同樣可以用列表傳遞多個簇參數,使用markerClusterOptions()函數。

1library(leaflet)
2
3# cache = TRUE使用上個代碼塊的數據
4leaflet(quakes) %>% addTiles() %>% addAwesomeMarkers(~long, ~lat, icon = icons,
5 label = ~as.character(mag), clusterOptions = markerClusterOptions() # 設置簇
6)


R_leaflet包_最易上手地圖教程(一)(上)


3.2.2 簇凍結(freezeAtZoom參數)

使用markerClusterOptions()中的freezeAtZoom參數可以設定簇凍結在一個zoom level。

這樣縮放地圖時,簇是否散開取決於凍結時的zoom level高低。

例如下圖中,設置freezeAtZoom = 5

1library(leaflet)
2
3leaflet(quakes) %>% addTiles() %>% addAwesomeMarkers(~long, ~lat, icon = icons,
4 label = ~as.character(mag), clusterOptions = markerClusterOptions(freezeAtZoom = 5) # 凍結簇在zoom level = 5
5)


R_leaflet包_最易上手地圖教程(一)(上)


3.3

circle圖標

circle圖標與circle形狀不一樣:

  • circle Markers 屬於圖標,其尺寸是像素尺寸,不隨zoom level變化而變化。
  • 而circles 屬於形狀,與多邊形是一類,其尺寸是以“米”為單位,隨zoom level 變化而變化。

使用addCircleMarkers()函數添加圓圈圖標。 語法:

1addCircleMarkers(map, lng = NULL, lat = NULL, radius = 10,
2 layerId = NULL, group = NULL, stroke = TRUE, color = "#03F",
3 weight = 5, opacity = 0.5, fill = TRUE, fillColor = color,
4 fillOpacity = 0.2, dashArray = NULL, popup = NULL,
5 popupOptions = NULL, label = NULL, labelOptions = NULL,
6 options = pathOptions(), clusterOptions = NULL, clusterId = NULL,
7 data = getMapData(map))

關鍵參數:

  • radius, 表示指定circles的半徑,為數字向量或~引導的表達式。
  • stroke, 表示是否顯示路徑陰影, 默認stroke = TRUE顯示路徑陰影,這樣圓環就出現了陰影邊框。
  • color, 表示指定stroke的顏色。
  • weight, 表示指定stroke像素寬度。
  • opacity, 表示指定stroke透明度,opacity從0(完全透明)到1(完全不透明)。
  • fill, 表示是否填充路徑顏色(如填充多邊形和園環)
  • fillColor, 表示指定fill顏色。
  • fillOpacity, 表示指定fill頭透明度,opacity從0(完全透明)到1(完全不透明)。
  • dashArray, 表示指定stroke線型,為數字類型字符串。原理與ggplot2中自定義線型類似。
  • 如dasharray = "4 1 2"表示:先閉合4個像素長度,然後缺口1,再閉合2,再缺口4,閉合1,缺口2。
 1library(leaflet)
2
3# 默認circles參數
4leaflet(df) %>% addTiles() %>% addCircleMarkers()
5
6# stroke = FALSE去掉路徑陰影
7leaflet(df) %>% addTiles() %>% addCircleMarkers(radius = 15, stroke = FALSE) %>%
8
9# fill = FALSE空心圓環
10addCircleMarkers(radius = 15, color = "magenta", weight = 8, opacity = 0.2,
11 fill = FALSE) %>%
12# 分別指定stroke和fill不同的顏色。並調整透明度
13addCircleMarkers(radius = 60, color = "lime", weight = 8, opacity = 0.8, fillColor = "cyan",
14 fillOpacity = 0.3, dashArray = "5 2")


R_leaflet包_最易上手地圖教程(一)(上)


R_leaflet包_最易上手地圖教程(一)(上)


不同半徑的circles:

addCircleMarkers()中的參數同樣可以用向量指定,如下圖:

 1library(leaflet)
2
3# 定義一個色板函數
4pal 5
6leaflet(df) %>% addTiles() %>%
7 addCircleMarkers(
8 radius = ~ifelse(type == "ship", 6, 10), # 分別設置半徑,ship半徑為6,pirate半徑為10
9 color = ~pal(type), # 色板函數匹配
10 stroke = FALSE, fillOpacity = 0.5
11 )


R_leaflet包_最易上手地圖教程(一)(上)


4.信息提示框

給標記點增加信息提示框有4種方式:

  • 使用addPopups()在地圖中添加單個popup。
  • 在圖標或形狀添加函數中,指定popup參數。
  • 在圖標或形狀添加函數中,指定labelOptions參數。
  • 使用addLabelOnlyMarkers()函數創建無圖標labels

4.1

addPopups

popups是包含HTML鏈接的提示框,用於顯示標記點的文本信息。

popup最常見的用法是,當點擊圖標時才出現在地圖上。

 1library(leaflet)
2
3# 生成popup框內信息
4content ", # 分隔符為html語法的換行符

5 # 單引號內為HTML鏈接,單引號後為HTML顯示標籤
6 "",
7 "606 5th Ave. S",
8 "Seattle, WA 98138"
9)
10
11leaflet() %>% addTiles() %>%
12 addPopups(-122.327298, 47.597131, popup = content, # 將HTML語法支持的文本內容傳遞給popup
13 options = popupOptions(closeButton = FALSE) # popupOptions()中設定popups的尺寸和樣式
14 )


R_leaflet包_最易上手地圖教程(一)(上)



4.2

popup參數


圖標和形狀的添加函數中都有一個popup參數。

當存在大量不含HTML鏈接的popups時,可以使用htmltools::htmlEscape()函數,

以避免將字符串作為html語言進行轉義,直接輸出字符串到popup框。

 1library(leaflet)
2library(htmltools) # 為了調用htmlEscape()函數,
3
4# 創建一個數據框
5df 6Samurai Noodle,47.597131,-122.327298
7Kukai Ramen,47.6154,-122.327157
8Tsukushinbo,47.59987,-122.326726"))
9df
10
11leaflet(df) %>% addTiles() %>% addMarkers(~Long, ~Lat, popup = ~htmlEscape(Name)) # 默認點擊Marker才出現popup



R_leaflet包_最易上手地圖教程(一)(上)




R_leaflet包_最易上手地圖教程(一)(上)



4.3

labelOptions()


labels內容包括文本和HTML鏈接內容。 用labelOptions()函數指定labelOptions參數。

關鍵參數:

  • noHide, 為邏輯值,FALSE表示僅當鼠標指針懸浮到marker上,才顯示label;
  • TRUE,則一直顯示label。
  • textOnly,為邏輯值, TRUE表示只顯示文本,不顯示提示框。
  • style,表示設定信息框的樣式,列表傳參
  • 可以設定label的顏色,字體,字型,字體大小,邊框線顏色,邊框陰影等。
 1library(leaflet) 

2
3leaflet() %>% addTiles() %>% setView(-118.456554, 34.09, 13) %>%
4
5 addMarkers(
6 lng = -118.456554, lat = 34.105,
7 label = "Default Label",
8 labelOptions = labelOptions(noHide = T)) %>% # 不隱藏的popups
9
10 addMarkers(
11 lng = -118.456554, lat = 34.095,
12 label = "Label w/o surrounding box",
13 labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>% # 只顯示文字,不顯示提示框
14
15 addMarkers(
16 lng = -118.456554, lat = 34.085,
17 label = "label w/ textsize 15px",
18 labelOptions = labelOptions(noHide = T, textsize = "15px")) %>% # 修改提示框大小,文本大小隨之變化
19
20 addMarkers(
21 lng = -118.456554, lat = 34.075,
22 label = "Label w/ custom CSS style",
23 labelOptions = labelOptions(noHide = T, direction = "bottom", # 修改提示框相對位置
24 style = list( # 修改提示框文本樣式,列表傳參
25 "color" = "red", # 設定文本顏色為紅色
26 "font-family" = "serif", # 設置字體
27 "font-style" = "italic", # 設置字型為斜體
28 "box-shadow" = "3px 3px yellow", # 設置提示框邊框線陰影尺寸和邊框陰影顏色
29 "font-size" = "12px", # 設置字體大小為12個像素點
30 "border-color" = "cyan" # 設置提示框邊框線顏色
31 ))
32 )



R_leaflet包_最易上手地圖教程(一)(上)

往期精彩:

  • 不用代碼,從搜索數據中解讀星巴克“貓爪杯”如何撓你的心
  • 是否,是否,總是富肥窮瘦?(文末上週投票公佈)
  • R語言自然語言處理:詞性標註與命名實體識別
  • R語言中文社區2018年終文章整理(作者篇)
  • R語言中文社區2018年終文章整理(類型篇)


R_leaflet包_最易上手地圖教程(一)(上)


分享到:


相關文章: