Shiny - punkty z mapki
Jak pobrać współrzędne punktu wskazanego na mapie? Czasem istnieje potrzeba, aby w aplikacji (napisanej w Shiny) użytkownik wskazał jakąś lokalizację na mapie. Jak to zrobić? Bardzo szybki wpis, który rozwiązuje konkretny problem. Ot - takie StackOverflow ;). Trzeba narysować mapę - do map interaktywnych bardzo wygodny jest pakiet leaflet, który opakowuje nam bibliotekę Leaflet napisaną w Java Script. Przy okazji: podobnie robi plotly - obie ta biblioteki są proste w użyciu, a dają bardzo atrakcyjne efekty w postaci interaktywnych map czy wykresów. Po narysowaniu mapy ustawiamy marker na jej środku i dostosowujemy widoczny obszar. Pozostaje tylko czekać na event (zdarzenie) z Shiny. Nasza aplikacja zareaguje na zdarzenie w obiekcie mapy. Odpowiednie zmienne zawierają współrzędne klikniętego punktu. Teraz wystarczy usunąć wszystkie dodane markery i na nowo dodać jednej w klikniętym miejscu. Dodatkowo w poniższym kodzie wypisujemy współrzędne klikniętego punktu.
library(shiny)
library(leaflet)
# wygląd aplikacji (najprostszy)
ui <- fluidPage(
# mapa
leafletOutput("mymap", height = 400),
# pole na tekst - tu pokażemy klikane współrzędne
verbatimTextOutput("coordinates")
)
# mechanika aplikacji
server <- function(input, output) {
# początkowe ustawienie mapy
output$mymap <- renderLeaflet(
leaflet() %>%
addTiles() %>%
# środek mapki to domyślny marker
addMarkers(lng = 19.15, lat = 52.19) %>%
# mapa pokazuje całą Polskę na początek
setView(lng = 19.15, lat = 52.19, zoom = 6)
)
# czekamy na kliknięcie w mapę
observeEvent(input$mymap_click, {
# współrzędne kliknięcia
click_lat <- input$mymap_click$lat
click_long <- input$mymap_click$lng
# na mapie...
leafletProxy("mymap") %>%
# czyścimy markery
clearMarkers() %>%
# ustawiamy marker w miejscu gdzie kliknięto
addMarkers(lng = click_long, lat = click_lat)
# wyświetlamy współrzędne
output$coordinates <- renderPrint({
cat(paste0("Long: ", click_long, "\nLat: ", click_lat))
})
})
}
shinyApp(ui = ui, server = server)
Jak działa powyższy kod możecie sprawdzić poniżej (oczywiście klikając po mapie, przesuwając ją i zoomując): Prawda, że proste?