r - 如何保存在 R Leaflet Shiny map 中绘制的 addDrawToolbar 形状,以便我可以重新导入它们?

标签 r shiny leaflet

我需要采用 中绘制的形状R 传单 Shiny 应用 使用 addDrawToolbarleaflet.extras并将它们保存到可以由 重新导入的文件中R 传单 Shiny 应用 晚些时候。
我专注于leaflet.extras信息在GitHub由 Bhaskar Karambelkar 编写,其中列出了为绘制的形状提取数据的命令。如何在 R 中解析出这些数据?
以下代码是我目前可以做的:绘制形状并将它们打印为 .csv.txt文件。我已经包括了这两个例子。所以在这段代码中,你 从绘图工具栏中绘制您想要的任何形状,然后点击 Generate Shape List按钮。
它适用于捕获所有形状坐标,但在这些格式中,数据并不像我需要的那样可用。有没有办法解析这些数据,以便在需要时可以重新导入、显示和编辑它?对此的任何见解都非常感谢!

library(shiny)
library(leaflet)
library(leaflet.extras)
library(utils)

sh <- data.frame()

ui <- bootstrapPage(
    tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
    leafletOutput("mymap", width = "100%", height = "100%"),
    absolutePanel(top = 10, right = 10, width = 300,
                  style = "padding: 8px",
                  actionButton("printShapes", h5(strong("Generate Shape List")))
    )
)

server <- function(input, output, session) {
    
    output$mymap <- renderLeaflet({
        leaflet() %>%
            addTiles(group = "Default", attribution = 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors') %>%
            setView(lng = -98, lat = 38, zoom = 4) %>%
            addDrawToolbar(targetGroup = "draw", position = "topleft", editOptions = editToolbarOptions(edit=TRUE))
    })
    
    # Generate Shape List Action Button
    observeEvent(input$printShapes, {
        shapedf <- data.frame()
        reactive(shapedf)                       
        shapedf <-input$mymap_draw_all_features  
        sh <<- as.data.frame(shapedf)           
        sh <- t(sh)                             
        shpwrite <- write.csv(sh, paste0("OUTPUTdrawings",".csv"))
        shpwrite1 <- dput(sh, file = "OUTPUTdrawings1.txt")
    })
}

shinyApp(ui = ui, server = server)

最佳答案

经过多次思考、焦虑、反复试验,我终于想出了如何做到这一点。不确定这是否是最好的方法,但它有效。

library(shiny)
library(leaflet)
library(leaflet.extras)
library(utils)

sh <- data.frame()

ui <- bootstrapPage(
    tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
    leafletOutput("mymap", width = "100%", height = "100%"),
    absolutePanel(top = 10, right = 10, width = 300,
                  style = "padding: 8px",
                  fileInput("drawingFile",h4(strong("Input Drawing CSV")), accept = ".csv"),
                  actionButton("printShapes", h5(strong("Generate Drawing File")))
    )
)

server <- function(input, output, session) {
    
    output$mymap <- renderLeaflet({
        leaflet() %>%
            addTiles(group = "Default", attribution = 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors') %>%
            setView(lng = -98, lat = 30, zoom = 4) %>%
            addDrawToolbar(targetGroup = "draw", position = "topleft", editOptions = editToolbarOptions(edit=TRUE))
    })
    
    # Generate Shape List Action Button
    observeEvent(input$printShapes, {
        shapedf <- data.frame()
        reactive(shapedf)
        shapedf <-input$mymap_draw_all_features
        sh <<- as.data.frame(shapedf)
        
        # sh <- t(sh) # This is easier to read manually, but not for reading into R.
        shpwrite <- write.csv(sh,paste0("Drawings", ".csv"))
    })
    
    # Intake Shape CSV
    observeEvent(input$drawingFile, {
        drawFile <- input$drawingFile
        ext <- file_ext(drawFile$datapath)
        req(drawFile)
        validate(need(ext == "csv", "Please upload a csv file."))
        
        ddf <- read.csv(drawFile$datapath, header = TRUE) # The drawing dataframe
        ind <- which(ddf == "Feature") # Index for drawing df to break up the df to redraw the shapes.
        ind <- as.array(ind)
        
        for (i in 1:nrow(ind)) {
            if(i != nrow(ind)) thisShape <- ddf[ind[i]:ind[i+1]]
            else thisShape <- ddf[ind[i]:ncol(ddf)]
            
            #####
            if(thisShape[3] == "polyline") {
                tf <- array(startsWith(names(thisShape),"features.geometry.coordinates"))
                w <- 1
                pnts <- array()
                for (i in 1:nrow(tf)) {
                    if(tf[i] == TRUE) {
                        pnts[w] <- thisShape[i]
                        w <- w+1
                    }
                }
                n <- 1
                m <- 1
                plng <- array()
                plat <- array()
                pnts <- as.array(pnts)
                for (j in 1:nrow(pnts)) {
                    if(j %% 2 == 1) {
                        plng[n] <- pnts[j]
                        n <- n+1
                    }
                    else if(j %% 2 == 0) {
                        plat[m] <- pnts[j]
                        m <- m+1
                    }
                }
                as.vector(plng, mode = "any")
                as.vector(plat, mode = "any")
                PL <- data.frame(matrix(unlist(plng)))
                PLsub <- data.frame(matrix(unlist(plat)))
                PL <- cbind(PL, PLsub)
                colnames(PL) <- c("lng","lat")
                PL1 <- reactiveVal(PL)
                
                proxy <- leafletProxy("mymap", data = PL1())
                proxy %>% addPolylines(lng = ~lng, lat = ~lat, group = "draw")
            }
            #####
            else if(thisShape[3] == "polygon") {
                tf <- array(startsWith(names(thisShape),"features.geometry.coordinates"))
                w <- 1
                pnts <- array()
                for (i in 1:nrow(tf)) {
                    if(tf[i] == TRUE) {
                        pnts[w] <- thisShape[i]
                        w <- w+1
                    }
                }
                n <- 1
                m <- 1
                plng <- array()
                plat <- array()
                pnts <- as.array(pnts)
                for (j in 1:nrow(pnts)) {
                    if(j %% 2 == 1) {
                        plng[n] <- pnts[j]
                        n <- n+1
                    }
                    else if(j %% 2 == 0) {
                        plat[m] <- pnts[j]
                        m <- m+1
                    }
                }
                as.vector(plng, mode = "any")
                as.vector(plat, mode = "any")
                PG <- data.frame(matrix(unlist(plng)))
                PGsub <- data.frame(matrix(unlist(plat)))
                PG <- cbind(PG, PGsub)
                colnames(PG) <- c("lng","lat")
                PG1 <- reactiveVal(PG)
                
                proxy <- leafletProxy("mymap", data = PG1())
                proxy %>% addPolygons(lng = ~lng, lat = ~lat, group = "draw")
            }
            #####
            else if(thisShape[3] == "rectangle"){
                rlng1 <- as.numeric(thisShape[5])
                rlat1 <- as.numeric(thisShape[6])
                rlng2 <- as.numeric(thisShape[9])
                rlat2 <- as.numeric(thisShape[10])
                
                proxy <- leafletProxy("mymap")
                proxy %>% addRectangles(lng1 = rlng1, lat1 = rlat1, lng2 = rlng2, lat2 = rlat2,
                                        group = "draw")
            }
            #####
            else if(thisShape[3] == "circle"){
                crad <- as.numeric(thisShape[4])
                clng <- as.numeric(thisShape[6])
                clat <- as.numeric(thisShape[7])
                
                proxy <- leafletProxy("mymap")
                proxy %>% addCircles(lng = clng, lat = clat, radius = crad, group = "draw")
            }
            #####
            else if(thisShape[3] == "marker") {
                mlng <- as.numeric(thisShape[5])
                mlat <- as.numeric(thisShape[6])
                
                proxy <- leafletProxy("mymap")
                proxy %>% addMarkers(lng = mlng, lat = mlat, group = "draw")
            }
            #####
            else if(thisShape[3] == "circlemarker") {
                cmlng <- as.numeric(thisShape[6])
                cmlat <- as.numeric(thisShape[7])
                
                proxy <- leafletProxy("mymap")
                proxy %>% addCircleMarkers(lng = cmlng, lat = cmlat, group = "draw")
            }
        }
    })
}

shinyApp(ui = ui, server = server)

关于r - 如何保存在 R Leaflet Shiny map 中绘制的 addDrawToolbar 形状,以便我可以重新导入它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65347690/

相关文章:

r - 投资决策 : NPV, IRR,R中的PB计算

r - 在 tryCatch 中处理多个可能的错误

将输入返回为响应式(Reactive) Shiny - 插入 UI 中的动态 UI 中的列表

r - 在 rCharts 中调整轴标签 NVD3 图形

javascript - 多个 choropleth 图层应用不同的样式

r - 从受限制的帕累托分布中抽取随机数

r - 将字符串拆分为单词并分配给新列

r - ggplot2 在 Shiny 的错误 : ggplot2 doesn't know how to deal with data of class packageIQR

javascript - 如何更改传单中的标记颜色?

javascript - 单击 map 外部时传单缩放 map