Как сохранить листовку с нарисованными на ней фигурами / точками в Shiny? - PullRequest
0 голосов
/ 06 декабря 2018

Этот вопрос является продолжением вопросов Как сохранить карту листовки в Shiny и Сохранить карту листовки в Shiny .

Я добавляю панель инструментов для рисования фигур / точек на карте, которая addDrawToolbar в пакете leaflet.extras.Это позволяет пользователям рисовать линии, фигуры, ... в интерактивном режиме.В конце я хочу сохранить карту с нарисованными фигурами в формате PDF или PNG.

Я кодировал следующее, используя ответ на вопрос: Как сохранить карту листовки в Shiny .Но это не помогает достичь моей цели.

Кто-нибудь может мне помочь?

library(shiny)
library(leaflet)
library(leaflet.extras)
library(mapview)


ui <- fluidPage(

    leafletOutput("map"),
    br(),
    downloadButton("download_pdf", "Download .pdf")
)

server <- function(input, output, session) {


     foundational_map <- reactive({

        leaflet() %>% 

          addTiles()%>%

          addMeasure(
              primaryLengthUnit = "kilometers",
              secondaryAreaUnit = FALSE
           )%>%

          addDrawToolbar(
               targetGroup='draw',

               editOptions = editToolbarOptions(selectedPathOptions = 
                                       selectedPathOptions()),

                polylineOptions = filterNULL(list(shapeOptions = 
                                        drawShapeOptions(lineJoin = "round", 
                                        weight = 3))),

                circleOptions = filterNULL(list(shapeOptions = 
                                      drawShapeOptions(),
                                      repeatMode = F,
                                      showRadius = T,
                                      metric = T,
                                      feet = F,
                                      nautic = F))) %>%
           setView(lat = 45, lng = 9, zoom = 3) %>%
           addStyleEditor(position = "bottomleft", 
                 openOnLeafletDraw = TRUE)
 })


 output$map <- renderLeaflet({

         foundational_map()
                    })


 user_created_map <- reactive({

           foundational_map() %>%

            setView(lng = input$map_center$lng, lat = input$map_center$lat, 
                           zoom = input$map_zoom)
             })


 output$download_pdf <- downloadHandler(

         filename = paste0("map_", Sys.time(), ".pdf"),

         content = function(file) {
                 mapshot(user_created_map(), file = file)
  }
 )



 }

 shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 13 декабря 2018

Очевидно, что функция mapshot не знает о нарисованных полигонах и просто хранит чистую листовую карту, поскольку она запускает изолированный фоновый процесс, который захватывает веб-снимок.

Я бы предложил этот обходной путь, который захватывает весь экран (используя этот пакет -файл) и сохраняет его как png .( только для Windows )

Это не очень красиво, поскольку оно также захватывает окна и строки меню браузера, хотя это может быть адаптировано в пакетном файле.

Пакетный файл должен находиться в том же каталоге и должен называться screenCapture.bat .

library(shiny)
library(leaflet)
library(leaflet.extras)
library(mapview)

ui <- fluidPage(
  leafletOutput("map"),
  actionButton("download_pdf", "Download .pdf")
)

server <- function(input, output, session) {
  foundational_map <- reactive({
    leaflet() %>%
      addTiles()%>%
      addMeasure(
        primaryLengthUnit = "kilometers",
        secondaryAreaUnit = FALSE
      )%>%
      addDrawToolbar(
        targetGroup='draw',
        editOptions = editToolbarOptions(selectedPathOptions = 
                                           selectedPathOptions()),
        polylineOptions = filterNULL(list(shapeOptions = 
                                            drawShapeOptions(lineJoin = "round", 
                                                             weight = 3))),
        circleOptions = filterNULL(list(shapeOptions = 
                                          drawShapeOptions(),
                                        repeatMode = F,
                                        showRadius = T,
                                        metric = T,
                                        feet = F,
                                        nautic = F))) %>%
      setView(lat = 45, lng = 9, zoom = 3) %>%
      addStyleEditor(position = "bottomleft", 
                     openOnLeafletDraw = TRUE)
  })
  output$map <- renderLeaflet({
    foundational_map()
  })
  user_created_map <- reactive({
    foundational_map()
  })

  ## observeEvent which makes a call to the Batch-file and saves the image as .png
  observeEvent(input$download_pdf, {
    img = paste0("screen", runif(1,0,1000), ".png")
    str = paste('call screenCapture ', img)
    shell(str)
  })

}

shinyApp(ui = ui, server = server)

Чтобы удалить браузер и панель инструментов Windows , я манипулировал.bat-файл выглядит так:

Строка 66:

int height = windowRect.bottom - windowRect.top - 37;

Строка 75:

GDI32.BitBlt(hdcDest, 0, -80, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);

Это работает на моей машине, но вам придется адаптироватьзначения или даже придумать лучшее решение, так как я должен признать, что я не слишком хорош в пакетных сценариях.Это скроет панели инструментов, но внизу будет черная полоса.

...