【问题标题】:Is it possible to change leaflet map screenshot size in R Shiny?是否可以在 R Shiny 中更改传单地图屏幕截图大小?
【发布时间】:2018-08-31 20:33:00
【问题描述】:

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

  1. How to save a leaflet map in Shiny

  2. How to save Leaflet in R map as png or jpg file?

他们的核心思想是使用mapshot()而不是webshot()。在这种情况下,使用cliprect 参数设置屏幕截图大小。它定义了一个剪裁矩形,它与查看端口的高度和宽度相匹配。所以,如果cliprect = 'viewport'我想,截图上的地图会和我屏幕上的一样。但事实并非如此。

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

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

My screen in browser with map looks likes this

I hope to get screenshot like this

But I got this

【问题讨论】:

    标签: r shiny leaflet


    【解决方案1】:

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

    1. 使用js获取地图的当前大小div(基于thisthis
    2. 根据current zoom and map center更新地图
    3. 使用vwidthvheight更改屏幕截图的大小

    基于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)
    

    【讨论】:

    • 谢谢,它有助于解决我的问题。但是现在截图没有考虑地图比例。我该如何解决?
    • @ЯрославХромов 好收获!我已经更新了答案来解决这个问题。让我知道它是否适合您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2018-04-21
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多