[英]Drawing multiple polygons with leaflet in Shiny
我正在努力在Shiny應用程序中繪制多個多邊形 - 基於傳單包。
這是我希望的非app輸出:
data <- list(
beam1 = data.frame(lat = c(-115,-125, -125, -115),
lon = c(32, 32, 45,45)),
beam2 = data.frame(lat = c(-100, -111, -111, -100),
lon = c(42, 42, 50,50))
)
dataTemp <- do.call(rbind, lapply(data, function(x) rbind(x, NA)))
library(leaflet)
m = leaflet() %>% addTiles()
m %>%
addPolygons(
dataTemp[,"lat"],
dataTemp[,"lon"],
color = c('red', 'green'), weight = 3
)
然而,從中創建一個Shiny應用程序被證明是困難的 - 多邊形被繪制然后在繪制新多邊形后逐個消失。 這是我正在使用的代碼。 你需要點擊'繪圖'來繪制多邊形注意:1 - 紅色多邊形在繪制綠色時消失(3秒后)2 - 多邊形在這里是三角形,而在上面的代碼中它們是矩形。 3 - 如果你看下面的server.R中的代碼,我實際上不得不翻轉'lat'和'lon'列以獲得遠程正確的圖片。
ui.R:
library(shiny)
library(leaflet)
shinyUI(navbarPage("Beams", id="nav",
tabPanel("Interactive map",
div(class="outer",
leafletMap("map", "100%", 650,
options = list(center = c(37.45, -93.85), zoom = 4)),
actionButton("drawPoints", "Draw")
)
)
))
server.R:
library(shiny)
library(leaflet)
data <- list(
beam1 = data.frame(lat = c(-115,-125, -125, -115),
lon = c(32, 32, 45,45)),
beam2 = data.frame(lat = c(-100, -111, -111, -100),
lon = c(42, 42, 50,50))
)
# server activity
shinyServer(function(input, output, session) {
map <- createLeafletMap(session, "map")
observe({
if(input$drawPoints == 0) {
return(NULL)
} else {
map$clearShapes()
for (i in seq_along(data)) {
map$addPolygon(
data[[i]][,"lon"], # - notice, i had to change lat and lon
data[[i]][,"lat"],
layerId=c("1"),
list( fillOpacity=0.4),
list(color = c('red','green')[i])
)
Sys.sleep(3) # - this is to see first (red) polygon
}
}
})
})
任何想法,將不勝感激!
我已經更新了你的代碼以使用傳單代理,這是更新現有地圖的一種更簡潔的方法,並且是當前維護的方法,用於在對leaflet
包的持續更新中這樣做(據我所知)。 我在data.frame中切換了“lat”和“lon”以使它們正確。 我還在坐標的末尾再次添加了原點以完成形狀 - 這就是為什么你有三角形而不是矩形的原因。 最后,我將多邊形的layerId
更改為i
以使它們不同 - 這就是為什么它們相互擦除的原因。
我假設您希望對形狀進行硬編碼,但是有一些方法可以向用戶打開多邊形圖選擇(甚至繪圖)。 值得注意的一點是:在解決這個,了解了deferUntilFlush
在參數leafletProxy
-如果沒有這個設置為FALSE
,兩個形狀后,才情節Sys.sleep
完成計數。
ui.R
library(shiny)
library(leaflet)
shinyUI(navbarPage("Beams", id="nav",
tabPanel("Interactive map",
div(class="outer",
leafletOutput("map", "100%", 650),
actionButton("drawPoints", "Draw")
)
)
))
server.R
library(shiny)
library(leaflet)
data <- list(
beam1 = data.frame(lon = c(-115,-125, -125, -115, -115),
lat = c(32, 32, 45, 45, 32)),
beam2 = data.frame(lon = c(-100, -111, -111, -100, -100),
lat = c(42, 42, 50, 50, 42))
)
shinyServer(function(input, output, session) {
map <- leaflet() %>% addTiles() %>% setView(-93.85, 37.45, zoom = 4)
output$map <- renderLeaflet(map)
proxy <- leafletProxy("map", deferUntilFlush = FALSE)
observeEvent(input$drawPoints, {
proxy %>% clearShapes()
for (i in seq_along(data)) {
proxy %>% addPolygons(
data[[i]][,"lon"],
data[[i]][,"lat"],
layerId=i,
opacity=0.4,
color = c('red','green')[i]
)
Sys.sleep(2) # - this is to see first (red) polygon
}
})
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.