如何在R中访问由leaflet生成的地图

9

假设我有这样一段代码

# Install devtools if needed
if(!require(devtools)) install.packages("devtools")
# view rawif-devtools.R hosted with ❤ by GitHub
# Install leaflet package
if(!require(leaflet)) install_github("rstudio/leaflet")
library("leaflet")
mymap <- leaflet()
mymap <- addTiles(mymap)
mymap

这将在Chrome中打开一个文件路径,形式如下:
file:///var/folders/8x/v2tk5zy51x51jx9jbp0m29qr0000gn/T/RtmpQaeu1E/viewhtmlf74547061f7d/index.html. 

假设我想将这个文件发布到我的博客上。我该如何访问这个html文件?有没有办法设置它的保存位置?我原以为它会保存在工作目录中,但事实并非如此。我想也许可以通过终端访问它,但我希望有更简单的方法。

4个回答

17

我开发了几个函数,可以让您将一个leaflet地图保存在临时文件夹以外的其他地方。

请查看此处的代码:https://gist.github.com/barryrowlingson/d066a7ace15cf119681a获取完整信息,简而言之,这两个函数如下:

saveas <- function(map, file){
    class(map) <- c("saveas",class(map))
    attr(map,"filesave")=file
    map
}

print.saveas <- function(x, ...){
    class(x) = class(x)[class(x)!="saveas"]
    htmltools::save_html(x, file=attr(x,"filesave"))
}

那么你要做的就是:

leaflet() %>% etc etc %>% saveas("/wherever/you/want/index.html")

或者按照你的工作方式:

mymap <- leaflet()
mymap <- addwhatever(mymap)
saveas(mymap, "/wherever/you/want/index.html")

在这一步中,文件夹/wherever/you/want应该有一个自包含的地图文件集合。我认为它应该是可移植的,即可以在任何网络服务器上运行,但我不能保证...


13
一个晚回复:
library(leaflet)
mymap <- leaflet() %>%
  addTiles()
library(htmlwidgets)
saveWidget(widget = mymap, file = "/wherever/you/want/mymap.html")

einar

->

einar


3
一旦您在Chrome(或任何其他浏览器)中打开地图,您可以轻松地转到“文件->另存为”,然后将.html页面以用户定义的名称保存到目标目录下。(或者在Mac上按下cmd+s,在Windows上按下ctrl+s。) 这通常是我使用R或Rmarkdown创建Web地图时所做的。
当然,您也可以通过单击“发布”按钮将文件上传到Rpubs.com,当您使用Rmarkdown创建地图时。从那里,您可以通过提供的链接轻松访问它。

我尝试了这个,结果完全搞乱了地图。例如,在原始地图中,我可以缩放等操作,但在新地图中,我无法进行这些操作。而且,由于某种奇怪的原因,它变得非常混乱。右上角的部分出现在中心位置,中心部分出现在左下角,所有东西都以看似随机的方式移动,与原始地图完全不同。你有什么想法为什么会发生这种情况吗? - ytk
1
我真的想不出为什么你会遇到这些问题。我尝试将您的代码上传到 rpubs 上,它可以正常工作:http://rpubs.com/SmaRtin/so-question - maRtin
1
这听起来像是瓦片的CSS尚未加载。浏览器的“另存为”功能有时会出现此问题。 - Spacedman
@maRtin 我指的是将它保存为 .html 页面。如果我上传到 rpubs 上,它就可以正常工作! - ytk

1
当我尝试安装名为“leaflet”的软件包时,CRAN对话框只显示一个名为leafletR的软件包。安装并加载该软件包会在控制台上显示一条消息,表示安装成功:
 Your leaflet map has been saved under /Users/myuser_name/map/map.html

那张地图具有所需的功能。考虑到我可以从Web浏览器访问的信息量,我猜测我实际上是通过Chrome与OpenStreetMap服务器进行接口交互,而不是与磁盘文件数据服务交互。
从CRAN下载的版本中没有addTiles函数。使用sos::findFn在任何其他软件包中都找不到它。这可能是仅在github版本中才有的新功能:https://github.com/chgrl/leafletR 进一步搜索显示,这仅托管在RStudio上,而不是在CRAN上:http://robinlovelace.net/r/2015/02/01/leaflet-r-package.html 我需要一个新的会话,因为我怀疑leafle和leafletR同时加载导致错误。在浏览器中,我左键单击以打开ViewSource窗口,然后选择并复制以下内容。Chrome和Firefox都能够显示底层代码,并支持选择和复制到编辑器。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script src="lib/htmlwidgets-0.3.2/htmlwidgets.js"></script>
<script src="lib/jquery-1.11.1/jquery.min.js"></script>
<link href="lib/leaflet-0.7.3/leaflet.css" rel="stylesheet" />
<script src="lib/leaflet-0.7.3/leaflet.js"></script>
<link href="lib/leafletfix-1.0.0/leafletfix.css" rel="stylesheet" />
<script src="lib/leaflet-binding-0.0.16/leaflet.js"></script>

</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
  <div id="htmlwidget-3689" style="width:100%;height:400px;" class="leaflet"></div>
</div>
<script type="application/json" data-for="htmlwidget-3689">{ "x": {
 "calls": [
 {
 "method": "addTiles",
"args": [
 "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
null,
{
 "minZoom":                 0,
"maxZoom":                18,
"maxNativeZoom": null,
"tileSize":               256,
"subdomains": "abc",
"errorTileUrl": "",
"tms": false,
"continuousWorld": false,
"noWrap": false,
"zoomOffset":                 0,
"zoomReverse": false,
"opacity":                 1,
"zIndex": null,
"unloadInvisibleTiles": null,
"updateWhenIdle": null,
"detectRetina": false,
"reuseTiles": false,
"attribution": "&copy; <a href=\"http://openstreetmap.org\">OpenStreetMap</a> contributors, <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">CC-BY-SA</a>" 
} 
] 
} 
] 
},"evals": [  ] }</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-3689">{ "viewer": {
 "width": "100%",
"height":               400,
"padding":                 0,
"fill": true 
},"browser": {
 "width": "100%",
"height":               400,
"padding":                 0,
"fill": true 
} }</script>
</body>
</html>

代码本身并不足够。其余所需的支持文件将保存在与HTML文件同名的目录中,最好使用浏览器的“另存为...”功能。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接