我有一个传单地图,其中包含可拖动的标记和形状,用户绘制的特征(使用leaflet.draw插件)。现在我想从传单地图中可编程地检索图层/组中的所有要素。
我应该如何实现这个功能?谢谢你的任何建议。
在这里我提供了一个简单的例子,随机的一组标记被添加到带有组markers
的传单地图中(代码直接从https://rstudio.github.io/leaflet/shiny.html复制并进行了一些更改)。我的目标是检索所有新标记的位置。
我真正的问题是多边形,可能比这更复杂,但方法应该类似。
library(shiny)
library(leaflet)
r_colors <- rgb(t(col2rgb(colors()) / 255))
names(r_colors) <- colors()
ui <- fluidPage(
leafletOutput("mymap"),
p(),
actionButton("recalc", "New points"),
verbatimTextOutput('summary')
)
server <- function(input, output, session) {
points <- eventReactive(input$recalc, {
cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
}, ignoreNULL = FALSE)
output$mymap <- renderLeaflet({
leaflet() %>%
addProviderTiles("Stamen.TonerLite",
options = providerTileOptions(noWrap = TRUE)
) %>%
addMarkers(data = points(), group = 'markers')
})
output$summary <- renderPrint({
# Add some codes here
# .....
})
}
shinyApp(ui, server)
答案 0 :(得分:1)
要从地图对象获取点数,您仍然可以使用reactiveValues()
存储地图对象,并通过observe()
按下按钮进行更新。然后,您可以访问其所有属性。
library(shiny)
library(leaflet)
r_colors <- rgb(t(col2rgb(colors()) / 255))
names(r_colors) <- colors()
ui <- fluidPage(
leafletOutput("mymap"),
p(),
actionButton("recalc", "New points"),
verbatimTextOutput('summary')
)
server <- function(input, output, session) {
rv <- reactiveValues()
rv$m <- NULL
rv$p <- NULL
points <- eventReactive(input$recalc, {
cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
}, ignoreNULL = FALSE)
output$mymap <- renderLeaflet({
m <- leaflet() %>%
addProviderTiles("Stamen.TonerLite",
options = providerTileOptions(noWrap = TRUE)) %>%
addMarkers(data = points(), group = 'markers')
rv$m <- m
return(m)
})
observe({
input$recalc
## I'm 90% confident these are the arguments you want...
rv$p <- data.frame(x = rv$m$x$calls[[2]]$args[[1]],
y = rv$m$x$calls[[2]]$args[[2]])
})
output$summary <- renderPrint({
# print points
rv$p
})
}
shinyApp(ui, server)
旧解决方案
我要离开这里,因为它可能对其他人有用
您可以使用reactiveValues()
将point
数据存储在其中,然后在print
server <- function(input, output, session) {
rv <- reactiveValues()
rv$points <- cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
observe({
if(input$recalc){
p <- cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
rv$points <- p
}
})
output$mymap <- renderLeaflet({
leaflet() %>%
addProviderTiles("Stamen.TonerLite",
options = providerTileOptions(noWrap = TRUE)
) %>%
addMarkers(data = rv$points, group = 'markers')
})
output$summary <- renderPrint({
# Add some codes here
# .....
rv$points
})
}
shinyApp(ui, server)