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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
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?