Błyszcząca ulotka - usuń określone znaczniki lub kształty bez znajomości ich identyfikatora

Nov 25 2020

Mam aplikację Shiny z mapą Leaflet wypełnioną różnymi elementami: wielokątami, poliliniami, znacznikami ... Ramka danych zawierająca elementy do wyświetlenia na mapie jest uzyskiwana przez zapytanie bazy danych. Za każdym razem, gdy użytkownik porusza się po mapie (w lewo, w prawo, w górę, w dół, powiększanie, cofanie powiększenia), ramka danych jest zmieniana.

Pytanie brzmi: jak wyświetlić tylko te elementy, które są w ramce danych bez:

  • usunięcie wszystkich wcześniej wyświetlonych elementów (więc nie używaj clearGroup()lub podobnych funkcji)
  • utrzymywanie w pamięci poprzedniej ramki danych

Nie mogę użyć, removeShape()ponieważ nie mogę wiedzieć, jakie elementy znajdowały się w ramce danych i nie są już po przeniesieniu użytkownika.

Pomysł, który muszę rozwiązać, polega na znalezieniu sposobu na uzyskanie wartości identyfikatorów (layerId) wszystkich elementów wyświetlanych na mapie, a następnie usunięcie ich wszystkich, których nie ma w bieżącym zbiorze danych. Ale czy można gdzieś uzyskać informacje o wszystkich identyfikatorach aktualnie wyświetlanych elementów na mapie?

Innym pomysłem byłoby użycie funkcji, która robi odwrotność removeShape()(= usuwa wszystkie kształty z wyjątkiem tego, którego identyfikatory są przekazywane w argumencie), ale nie wiem, czy taka funkcja istnieje?

Oto mały przykład reprex. Mam błyszczącą aplikację z markerami. Jeśli kliknę przycisk, usuwam 3 znaczniki z mojego zbioru danych. Chcę, aby zostały usunięte z mapy, ale bez usuwania wszystkich innych znaczników.

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)

Odpowiedzi

1 Aurèle Nov 26 2020 at 01:59

Adresowanie

czy można gdzieś uzyskać informacje o wszystkich identyfikatorach aktualnie wyświetlanych elementów na mapie?

Możemy pobrać granice za pomocą input$map_boundsi odpowiednio wywnioskować identyfikatory.