【问题标题】:Best way to draw on leaflet map in R在 R 中绘制传单地图的最佳方法
【发布时间】:2016-05-12 05:25:11
【问题描述】:

我想在传单地图上画几件事(通过 Shiny/R)

我这样初始化地图

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

然后,根据在应用程序中单击的内容,我想绘制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

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

【问题讨论】:

    标签: r geolocation shiny leaflet polygon


    【解决方案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)
    

    首先,点击事件需要以输出元素命名。所以input$myMap_click 给你坐标。其次,传单代理旨在将点、事物等绘制到现有地图中。想象一下,您总是会重新渲染地图以执行leaflet() %&gt;% addMarkers(...)leafletProxy 只需要输出元素的名称并在其上绘制标记。

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

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

    【讨论】:

    • 谢谢,但这不起作用。 Warning: Unhandled error in observer: Invalid map parameter observeEvent(sp$lat)。我在 observeEvent(sp$lat, {... 中检查了 lat 和 lng 的坐标:它们正确地出来了......我试图将它包装成 null check 就像这样 ... if (!is.null(sp$lat)) { leafletProxy("myMap" %&gt;% addMarkers(lat... ,仍然是同样的错误......
    • @Stophface 我在 Windows 上使用 R-3.2.5,所有软件包都是最新的。你用什么?
    • leaflet_1.0.0,shiny_0.12.2,R 版本 3.2.3 (2015-12-10),平台:x86_64-apple-darwin13.4.0(64 位)运行:OS X 10.10。 5(优胜美地)
    • 我也使用了update.packages("leaflet"),也用于shiny。还是一样的错误信息。
    • 我有版本 Leaflet:1.0.1 和 Shiny 0.13.2。您能否更新 R 并查看问题是否仍然存在?我不知道还有什么问题... R 版本 3.3.0 已经发布。
    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多