Как вернуть положение карты Leaflet в блестящем, как только она была перемещена пользователем? - PullRequest
1 голос
/ 09 марта 2020

История вопроса такова:

У меня есть блестящее приложение, которое представляет данные на листовой карте. Эти данные могут быть отфильтрованы и представлены по-разному. Однако, когда пользователь увеличивает и / или перемещает карту, а затем фильтрует данные, карта возвращается к исходному виду карты:

output$mymap <- renderLeaflet({
 leaflet() %>%
      setView(lng = 0, lat = 30, zoom = 4)  %>% #setting the view over ~ center of North America
      addTiles(options = providerTileOptions(noWrap = TRUE)) 
})

То, что я ищу, это какой-то способ возврата положение карты такое, что при обновлении данных в функции листовки прокси я также могу установить представление. Вот то, чего я пытаюсь достичь (я составил эквивалент хода input$mymap_click).

observeEvent(input$mymap_move, {

move <- input$mymap_move
mlat <- move$lat
mlon <- move$lon
mzoom <- move$zoom

leafletProxy('mymap') %>% 
      setView(lng = mlng, lat = mlat, zoom = mzoom) %>%
      addMarkers(data = data.join,
                 lat = data.join$a.lat,
                 lng = data.join$a.lon,
                 icon = icon.func[data.join$SYMBOL_CODE],
                 popup = data.join$ANCHOR)

})

1 Ответ

0 голосов
/ 20 марта 2020

Как только ваша карта инициализирована, вы можете получить доступ к текущему состоянию вашей карты через input$mymap_center и input$mymap_zoom (а если у вас есть sh, вы можете получить доступ input$mymap_bounds)

Есть только 2 вещи, на которые нужно обратить внимание:

  • Вы должны проверить, завершена ли инициализация, и если не указать ручные параметры (или Shiny не будет знать, какую исходную позицию использовать)
  • Если вы не isolate поиск, ваша карта будет отображаться заново каждый раз, когда вы меняете представление, что, вероятно, не то, что вам нужно (это делает ваше приложение очень медленным и неработоспособным для пользователя)

Итак, все это вместе, я думаю, этот код должен делать то, что вы sh:

output$mymap <- renderLeaflet({
  isolate({
    if ("mymap_center" %in% names(input)) {
      mapparams <- list(center = input$mymap_center,
                        zoom = input$mymap_zoom)
    } else {
      mapparams <- list(center = list(lng=0, lat=30),
                      zoom = 4) #setting the view over ~ center of North America
    }
  })
  leaflet() %>%
      setView(lng = mapparams$center$lng, lat = mapparams$center$lat, zoom = mapparams$zoom)  %>% 
      addTiles(options = providerTileOptions(noWrap = TRUE)) 
})
...