r-闪亮传单-在不知道其ID的情况下删除特定标记或形状



我有一个Shiny应用程序,它有一个传单地图,里面填充了各种元素:多边形、多段线、标记。。。包含要在地图上显示的元素的数据帧是通过查询数据库获得的。每当用户在地图上移动(左、右、上、下、缩放、取消缩放(时,数据帧都会发生变化。

这里的问题是:如何只显示数据帧中没有的元素

  • 删除所有先前显示的元素(因此不使用clearGroup()或类似功能(
  • 在内存中保留以前的数据帧

我不能使用removeShape(),因为我不知道数据帧中有哪些元素,而在用户移动后这些元素就不再存在了。

我必须解决这个问题的一个想法是找到一种方法来获得地图上显示的所有元素的ID(layerId(的值,然后删除所有不在当前数据集中的元素。但是,这有可能在某个地方获得地图上当前显示元素的所有ID的信息吗?

或者另一个想法是使用一个与removeShape()相反的函数(=删除除ID在参数中传递的形状外的所有形状(,但我不知道是否存在这样的函数?

这里有一个代表性的小例子。我有一个带标记的闪亮应用程序。如果我点击一个按钮,我会从我的数据集中删除3个标记。我希望将它们从地图中删除,但不清除所有其他标记。

library(shiny)
library(leaflet)
data("quakes")
df <- quakes
df$id <- 1:nrow(df)
markers_to_remove <- c(159, 15, 888)
ui <- fluidPage(
leafletOutput("map"),
actionButton("btn", "Remove markers")
)
server <- function(input, output, session) {

df <- reactiveValues(markers = df)
# Init map
output$map <- renderLeaflet({
leaflet() %>%
addProviderTiles(provider = providers$CartoDB.Positron) %>%
setView(lat = -20.9, lng =  169.84, zoom = 8)
})
# Display markers data
# I need to avoid the markers "blink" produced by clearMarkers()
# But I need to not display anymore the markers that are not in 
# df$markers anymore
observe({
leafletProxy("map") %>%
# clearMarkers() %>% # 
addMarkers(
data = df$markers,
layerId = ~id,
label = ~id
)
})
# Delete clicked marker from data
observeEvent(input$btn,{
# I get my data from a query and I cannot know which markers
# were in the dataframe and are not anymore
new_markers_from_query <- df$markers[!(df$markers$id %in% markers_to_remove),]
df$markers <- new_markers_from_query
})
}
shinyApp(ui = ui, server = server)

寻址

这是否可以在某个地方获得地图上当前显示元素的所有ID的信息?

我们可以用input$map_bounds检索边界,并相应地推断ID。

相关内容

最新更新