【问题标题】:How to save a leaflet map (created with rMaps) as a html widget?如何将传单地图(使用 rMaps 创建)保存为 html 小部件?
【发布时间】:2016-06-22 14:36:12
【问题描述】:

问题 1 我尝试将使用 rMaps here 创建的传单地图保存到 html 文件中。

L2 <- Leaflet$new()
L2$setView(c(29.7632836,  -95.3632715), 10)
L2$tileLayer(provider = "MapQuestOpen.OSM")
L2
library(htmlwidgets)

saveWidget(L2,"t.html")

但我得到一个错误:

Error in envRefInferField(x, what, getClass(class(x)), selfEnv) : 
  ‘width’ is not a valid field or method name for reference class “Leaflet”

回答 1 感谢 LukeA,我们可以使用以下语法:

leaflet(width = "100%") %>% 
  addProviderTiles("MapQuestOpen.OSM") %>% 
  setView(-95.3632715, 29.7632836, zoom = 10) -> L2 

问题 2 但是接下来,如何添加 addAssets 和 setTemplate:

# Add leaflet-heat plugin. Thanks to Vladimir Agafonkin
L2$addAssets(jshead = c(
  "http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js"
))

# Add javascript to modify underlying chart
L2$setTemplate(afterScript = sprintf("
<script>
  var addressPoints = %s
  var heat = L.heatLayer(addressPoints).addTo(map)           
</script>
", rjson::toJSON(crime_dat)
))

L2

答案 2 再次感谢 LukeA,我们得到了答案:

L2$save(tf <- tempfile(fileext = ".html"),standalone=TRUE)

问题 3

其实我一开始的问题是我不能在rmarkdown中写代码,为了直接在html文档中生成地图。

现在我可以单独保存地图了。但是如何将它集成到 html 文档中呢? Rapide 的解决方案是制作一个 iframe。还有其他更优雅的解决方案吗?

【问题讨论】:

    标签: r leaflet htmlwidgets rmaps


    【解决方案1】:

    虽然不能直接回答您的问题,但我建议采用一种产生类似结果的替代方法:

    library(leaflet)
    library(htmlwidgets)
    leaflet() %>% 
      addProviderTiles("MapQuestOpen.OSM") %>% 
      setView(-95.3632715, 29.7632836, zoom = 10) -> m 
    saveWidget(m, tf <- tempfile(fileext = ".html"))
    

    或者,使用rMaps

    library(plyr)
    library(rCharts)
    library(rMaps)
    data(crime, package = 'ggmap')
    crime_dat = ddply(crime, .(lat, lon), summarise, count = length(address))
    crime_dat = toJSONArray(na.omit(unname(crime_dat)), json = F)
    
    L2 <- Leaflet$new()
    L2$setView(c(29.7632836,  -95.3632715), 10)
    L2$tileLayer(provider = "MapQuestOpen.OSM")
    # Add leaflet-heat plugin. Thanks to Vladimir Agafonkin
    L2$addAssets(jshead = c(
      "http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js"
    ))
    # Add javascript to modify underlying chart
    L2$setTemplate(afterScript = sprintf("
    <script>
      var addressPoints = %s
      var heat = L.heatLayer(addressPoints).addTo(map)           
    </script>
    ", rjson::toJSON(crime_dat)
    ))
    
    L2$save(tf <- tempfile(fileext = ".html"),standalone=TRUE)
    

    【讨论】:

    • 太棒了!谢谢你。其实我是想这样写leafet的,加上leaflet(width = "100%")。然后当我尝试 Leaflet$new(width="100%") 时它不起作用。所以我想知道参数宽度是否从那时起就留在了函数中。如果是这样,如何“重新启动”传单地图?和 rmaps 示例一样,添加了额外的功能。如何用管道做到这一点? L2$addAssets(jshead = c("leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js")) 和 L2$setTemplate()
    • 您可以在leaflet() 中设置宽度 - 例如leaflet(width="50%")。关于一些“额外功能”(?) - 请浏览rstudio.github.io/leaflet
    • “额外功能”是指 rmap 示例中的那些:addAssets 和 setTemplate。它们不在传单主页上。
    • 我不知道您如何将 Leaflet.heat 嵌入到小册子包中。也许发布一个新问题或直接询问包作者?还是使用自定义和静态预先计算的轮廓?
    • 我刚刚查看了leaflet 的github 问题:this issue 似乎可以满足您的需求。
    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 2017-10-02
    • 2021-09-26
    • 1970-01-01
    • 2022-12-23
    • 2018-06-03
    • 2015-09-28
    相关资源
    最近更新 更多