光沢のあるリーフレット-IDを知らなくても特定のマーカーや形状を削除します

Nov 25 2020

ポリゴン、ポリライン、マーカーなど、さまざまな要素で満たされたリーフレットマップを備えたShinyアプリがあります。マップに表示する要素を含むデータフレームは、データベースにクエリを実行することで取得されます。ユーザーが地図上を移動するたびに(左、右、上、下、ズーム、ズーム解除)、データフレームが変更されます。

ここでの問題は、データフレーム内にある要素のみを表示する方法です。

  • 以前に表示されたすべての要素を削除します(したがって、clearGroup()または同様の機能を使用しないでください)
  • 前のデータフレームをメモリに保持する

removeShape()データフレームにどの要素が含まれていたかがわからず、ユーザーが移動した後はもう存在しないため、を使用できません。

この問題を解決する必要があるのは、マップに表示されているすべての要素のID(layerId)の値を取得し、現在のデータセットにないすべての要素を削除する方法を見つけることです。しかし、これは、マップ上に現在表示されている要素のすべてのIDの情報をどこかで取得することは可能ですか?

または、removeShape()(= IDが引数で渡されたものを除くすべての形状を削除する)の反対を行う関数を使用することもできますが、そのような関数が存在するかどうかはわかりませんか?

これは少しreprexの例です。マーカー付きの光沢のあるアプリがあります。ボタンをクリックすると、データセットから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)

回答

1 Aurèle Nov 26 2020 at 01:59

アドレッシング

これは、マップ上に現在表示されている要素のすべてのIDの情報をどこかで取得することは可能ですか?

で境界を取得し、input$map_boundsそれに応じてIDを推測する場合があります。