在R中的传单地图上绘制的最佳方式

时间:2016-05-12 05:25:11

标签: r geolocation shiny leaflet polygon

我想在传单地图上绘制几件东西(通过Shiny / R)

我像这样初始化地图

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

然后,根据App中点击的内容,我想绘制MarkersPolygon

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!")
        }
})

我无法理解的是如何在传单地图上绘制一些东西。 什么是group ID,什么是layer IDleafletProxy在哪里发挥作用? 我将如何根据if else语句启动,将数据发送到leaflet并添加markerpolygon

非常感谢任何帮助或指向正确的方向!

1 个答案:

答案 0 :(得分:1)

也许这可以澄清事情:

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)

首先,click事件需要在output元素之后命名。所以input$myMap_click为你提供了协调。其次,传单代理旨在将点,事物等绘制到现有地图中。想象一下,你总是重新渲染地图以做leaflet() %>% addMarkers(...)leafletProxy只需要输出元素的名称并在其上绘制标记。

上面的代码展示了一些你可以用它做的事情。例如。使用多边形。

如果有不清楚的地方,请尝试使用它并发表评论。