Reference: Leaflet Github
1 Leaflet功能介紹
- Tiles: 選擇想要的世界地圖當底圖
- Marker: 在地圖標上記號
- 設定經緯度
- popup: 點擊Marker()觸發彈出視窗
- 以html格式呈現
- label: 感應游標後顯示標籤
- icon:
leaflet() %>% # 製作繪圖面板
setView(lng, lat, zoom) %>% # 設定視窗範圍 # 以該點放大多少倍
addTiles() %>% # 加上底圖
addMarkers(~lng, ~lat, ~popup, ~label, # 在哪個點上標記號 # 如果不設定經緯度會自己找變數
icon, clusterOptions = markerClusterOptions()) %>% # 把Marker做Clusters
#### Optional ####
# 選擇地圖樣式
addProviderTiles(providers$Stamen.Toner, group = "Toner") %>%
# 用範圍圓圈標示
addCircleMarkers(lng, lat, weight, radius, popup) %>% # 邊框粗細 # 半徑
# 使用套件的icon # 替代addMarkers()
addAwesomeMarkers(lng, lat, icon = awesomeIcons(icon = 'ios-close',
iconColor = 'black',
library = 'ion',
markerColor = getColor(df.20)
)) %>%
# 替代addMarkers(popup)
addPopups(lng, lat, content, options = popupOptions(closeButton = FALSE)) %>%
# 製作Legend
addLegend("bottomright", pal = colorNumeric(), values, title, opacity = 1) %>% # 調色盤 # 不透明度
# 製作控制面板
addLayersControl(
baseGroups = c("A地圖樣式", "B地圖樣式", "C地圖樣式"), # 前面要設定addTiles(group)和addProviderTiles才可用
overlayGroups = c("a族群的點", "b族群的點"),
options = layersControlOptions(collapsed = FALSE)) # 要不要展開layer control # 設F會展開2 範例
2.1 讀取資料
options(digits=4, scipen=40)
library(dplyr)
library(leaflet)
load("Biz.rdata") # Yelp店家資料 # 188,593 obs. # 80 variables
str(B[,c(1:10)]) # 查看前10個變數## 'data.frame': 188593 obs. of 10 variables:
## $ bid : int 1 2 3 4 5 6 7 8 9 10 ...
## $ name : chr "SpinalWorks Chiropractic" "Montallegro Barber Shop" "Custom Kings" "Instant Muffler and Autorepair" ...
## $ is_open : num 1 1 1 1 1 1 0 1 0 1 ...
## $ review_count: num 36 16 17 3 4 81 75 14 20 5 ...
## $ stars : num 5 5 1.5 1 4 3 3 3 3 4 ...
## $ state : chr "AZ" "QC" "NV" "ON" ...
## $ postal_code : chr "85022" "H3N 1Z1" "88901" "M6M 4R2" ...
## $ latitude : num 33.6 45.5 36.1 43.7 33.4 ...
## $ longitude : num -112.1 -73.6 -115.2 -79.5 -111.9 ...
## $ city : chr "Phoenix" "Montreal" "Las Vegas" "York" ...
2.2 設定地圖範圍及經緯度
2.2.1 探索資料
##
## Mesa Pittsburgh Calgary Scottsdale Charlotte Toronto Phoenix
## 6239 6804 7384 8822 9204 18233 18633
## Las Vegas
## 28865
## [,1] [,2]
## [1,] -71.75 85.05
## [2,] -180.00 115.09
2.3 製作popup
url = "'http://cm.nsysu.edu.tw/~msrc/wp/'"
B$popup = paste(
sep="<br/>", # 以<br/>換行符號作為分隔
sprintf("<b><a href=%s>%s</a></b>",url,B$name), # %s: string # 等於:paste0("b><a href=",url,">",B$name,"</a></b>")
sprintf("Stars:%.1f, Reviews:%d",B$stars,B$review_count), # %.1f: 指定浮點數輸出至小數點以下第一位 # %d: 印整數
# sprintf("lat:%.2f, lon:%.2f",B$latitude,B$longitude),
B$address)
B$popup[23677]## [1] "<b><a href='http://cm.nsysu.edu.tw/~msrc/wp/'>The Resort On Mt Charleston</a></b><br/>Stars:2.5, Reviews:250<br/>2275 Kyle Canyon Rd"
呈現效果
2.4 依據評論數切割資料集
## .
## (0,5] (5,10] (10,50] (50,100] (100,200] (200,400]
## 7481 5287 9837 2637 1658 1018
## (400,1e+04]
## 863
2.5 對每個分割製作地圖物件
l <- leaflet() %>% addTiles()
# 原始寫法 # 避免使用for loop
names(bx) %>% purrr::walk( function(df) { # 有7個,執行7次
l <<- l %>% addMarkers(
data = bx[[df]], lng = ~longitude, lat = ~latitude,
label = ~name, popup = ~popup, group = df,
clusterOptions = markerClusterOptions(removeOutsideVisibleBounds=F),
labelOptions = labelOptions(noHide=F, direction='auto'))
})
# for loop寫法(易懂版)
for(i in 1:length(bx)){
l = l %>% addMarkers(
data = bx[[i]], lng = ~longitude, lat = ~latitude,
label = ~name, popup = ~popup, group = names(bx)[i],
clusterOptions = markerClusterOptions(removeOutsideVisibleBounds=F),
labelOptions = labelOptions(noHide=F, direction='auto'))
}
# lapply寫法
z = lapply(1:length(bx), function(i){
l = l %>% addMarkers(
data = bx[[i]], lng = ~longitude, lat = ~latitude,
label = ~name, popup = ~popup, group = names(bx)[i],
clusterOptions = markerClusterOptions(removeOutsideVisibleBounds=F),
labelOptions = labelOptions(noHide=F, direction='auto'))
})