2016-05-12 7 views
0

ich mehrere Dinge auf einem Faltblatt Karte zeichnen möchte (durch Shiny/R)Der beste Weg, auf Faltblatt Karte in R ziehen

initialisieren ich die Karte wie diese

map = leaflet() %>% addProviderTiles("Stamen.TonerLite") %>% setView(-1.5, 53.4, 9) 
output$myMap = renderLeaflet(map) 

Dann, je nachdem, was geklickt wird in der App I Äther wollen Markers oder ein Polygon

sp <- reactiveValues() 
ep <- reactiveValues() 
area <- reactiveValues() 
area$mp <- matrix(...) # empty matrix with 2 cols named lat/lng 

observeEvent(input$map_click, { 
    coords <- input$map_click 
    if ((!is.null(as.integer(input$button)) && (!is.null(coords)))) { 
     if (as.integer(input$button) == 1) { 
      sp[["lat"]] <- coords$lat 
      sp[["lng"]] <- coords$lng 
     } else if (as.integer(input$button) == 2) { 
      ep[["lat"]] <- coords$lat 
      ep[["lng"]] <- coords$lng 
     } else if (as.integer(input$button) == 3) { 
      cm <- matrix(data = c(coords$lat, coords$lng), nrow = 1, ncol = 2) 
      area$mp <- rbind(area$mp, cm) 
     } else { 
      print("Kawum!") 
     } 
}) 

Was zeichnen bekommen kann ich nicht in meinen Kopf ist, wie auf der Broschüre Karte jetzt etwas zu zeichnen. Was ist group ID, was ist layer ID. Wo kommt leafletProxy ins Spiel? Wie würde ich, je nachdem, welche if else Aussage eintritt, die Daten an leaflet senden und eine oder eine polygon hinzufügen?

Jede Hilfe oder Ausrichtung in die richtige Richtung wird sehr geschätzt!

Antwort

1

Vielleicht kann dies verdeutlichen Dinge:

library(shiny) 
library(leaflet) 

ui <- shinyUI(fluidPage(
    actionButton("button", "Change style!"), 
    leafletOutput("myMap") 
)) 

server <- function(input, output){ 

map = leaflet() %>% addProviderTiles("Stamen.TonerLite") %>% setView(-1.5, 53.4, 9) 
output$myMap = renderLeaflet(map) 

sp <- reactiveValues() 
ep <- reactiveValues() 
area <- reactiveValues() 

observeEvent(sp$lat, { 
    leafletProxy("myMap") %>% addMarkers(lat = sp$lat, lng = sp$lng) 
}) 

observeEvent(ep$lat, { 
    leafletProxy("myMap") %>% addCircles(lat = ep$lat, lng = ep$lng) 
}) 

observeEvent(area$mp, { 
    leafletProxy("myMap") %>% addPolygons(lat = area$mp[ , 1], lng = area$mp[ , 2]) 
}) 

observeEvent(input$myMap_click, { 
    coords <- input$myMap_click 
    if ((!is.null(input$button) && (!is.null(coords)))) { 
     if (input$button %% 4 == 1) { 
      sp[["lat"]] <- coords$lat 
      sp[["lng"]] <- coords$lng 
     } else if (input$button %% 4 == 2) { 
      ep[["lat"]] <- coords$lat 
      ep[["lng"]] <- coords$lng 
     } else if (input$button %% 4 == 3) { 
      cm <- matrix(data = c(coords$lat, coords$lng), nrow = 1, ncol = 2) 
      area$mp <- if(!is.null(area$mp)){rbind(area$mp, cm)}else{cm} 
     } else { 
      print("Kawum!") 
     } 
    } 
}) 

} 

shinyApp(ui, server) 

Das erste, was muss das Click-Ereignis nach dem Ausgabeelement benannt werden. So input$myMap_click gibt Ihnen die Koordinaten. Zweitens ist der Flugblatt-Proxy so konzipiert, dass er Punkte, Dinge usw. in bestehende Karten einträgt. Stellen Sie sich vor, Sie würden die Karte immer neu rendern, um leaflet() %>% addMarkers(...) zu tun. leafletProxy benötigt nur den Namen des Ausgabeelements und zeichnet die Markierungen darüber.

Der obige Code zeigt einige Dinge, die Sie damit tun können. Z.B. Verwenden der Polygone.

Versuchen Sie es und kommentieren Sie, wenn etwas unklar ist.

+0

Danke, aber das funktioniert nicht. 'Warnung: Unbehandelter Fehler im Beobachter: Ungültiger Kartenparameter observeEvent (sp $ lat)'. Ich überprüfte, innerhalb des 'observeEvent (sp $ lat, {...' die Koordinaten für lat und lng: Sie kommen richtig heraus ... Ich habe versucht, es in einen 'Null-Check' umzuwandeln, so ... ' ! is.null (sp $ lat)) { leafletProxy ("myMap"%>% addMarker (lat ... '), immer noch derselbe Fehler ... – Stophface

+0

@Stophface Ich benutze R-3.2.5 unter Windows mit allen Paketen auf dem neuesten Stand. Was verwenden Sie? –

+0

sheetlet_1.0.0, shiny_0.12.2, R-Version 3.2.3 (2015-12-10), Plattform: x86_64-apple-darwin13.4.0 (64-bit) läuft unter: OS X 10.10.5 (Yosemite) – Stophface