R Shiny 中可以更改传单地图截图大小吗?

问题描述 投票:0回答:1

我找到了两个关于将传单地图保存为闪亮的答案:

  1. 如何在Shiny中保存传单地图

  2. 如何将R地图中的Leaflet保存为png或jpg文件?

他们的核心思想是用

mapshot()
代替
webshot()
。在本例中,使用
cliprect
参数设置屏幕截图大小。它定义了一个与观察口的高度和宽度相匹配的剪切矩形。所以,如果
cliprect = 'viewport'
我想,屏幕截图上的地图将看起来像在我的屏幕上。但事实并非如此。

我尝试使用上面示例中的代码,他们给出了相同的结果。

这就是为什么我的问题是:是否可以在 R Shiny 中更改传单地图屏幕截图大小,如果可以,如何做到?

浏览器中带有地图的屏幕看起来像这样

我希望能得到这样的截图

但是我明白了

r shiny r-leaflet
1个回答
4
投票

编辑: 原始答案下载了最初渲染的地图,没有考虑用户与地图的交互。我使用 this answer 更新了我的答案,因此下载反映了用户看到的地图。

  1. 使用js获取地图当前大小
    div
    (基于thisthis
  2. 根据当前缩放和地图中心
  3. 更新地图
  4. 使用
    vwidth
    vheight
  5. 更改屏幕截图的大小

基于 thisthis 的示例:

library(leaflet)
library(mapview)
library(shiny)

ui <- fluidPage(
  # 1. js to get width/height of map div
  tags$head(tags$script('
                        var dimension = [0, 0];
                        $(document).on("shiny:connected", function(e) {
                        dimension[0] = document.getElementById("map").clientWidth;
                        dimension[1] = document.getElementById("map").clientHeight;
                        Shiny.onInputChange("dimension", dimension);
                        });
                        $(window).resize(function(e) {
                        dimension[0] = document.getElementById("map").clientWidth;
                        dimension[1] = document.getElementById("map").clientHeight;
                        Shiny.onInputChange("dimension", dimension);
                        });
                        ')),
  leafletOutput("map"),
  downloadButton("dl", "Download Map")
  )

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

  # reactive values to store map
  vals <- reactiveValues()

  # create base map  
  output$map <- renderLeaflet({
    vals$base <- leaflet() %>%
      addProviderTiles(providers$OpenStreetMap) %>%
      addTiles()
  })

  # create map as viewed by user
  observeEvent({
    input$map_zoom
    input$map_center
    }, {
      vals$current <- vals$base %>% 
        setView(lng = input$map_center$lng,
                lat = input$map_center$lat,
                zoom = input$map_zoom)
    }
  )

  # create download
  output$dl <- downloadHandler(
    filename = "map.png",

    content = function(file) {
      mapshot(vals$current, file = file,
              # 2. specify size of map based on div size
              vwidth = input$dimension[1], vheight = input$dimension[2])
    }
  )

}
shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.