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

Best way to draw on leaflet map in R

我想在传单地图上画几样东西(通过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

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

也许这可以澄清事情:

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() %>% addMarkers(...)leafletProxy 只需要输出元素的名称并在其上绘制标记。

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

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