R Leaflet标记弹出窗口中的图像

jeb*_*nes 8 r rstudio leaflet

我试图通过动态方式在弹出窗口中为R包含图像生成我的传单地图 - 例如,

library(leaflet)


pts <- data.frame(Latitude = 30, Longitude = 30, file = "thing")

leaflet() %>%
  addTiles %>%
  addCircleMarkers(data = pts, lng =~Longitude, lat = ~Latitude,
                   popup =~ paste0("<img src = './", file, ".jpg'>"))
Run Code Online (Sandbox Code Playgroud)

然而,上面会产生一个糟糕的图像(图像中的图像).查看源使它看起来应该工作....不知道这里有什么问题.

{"lineCap":null,"lineJoin":null,"clickable":true,"pointerEvents":null,
"className":"","stroke":true,"color":"#03F","weight":5,"opacity":0.5,"fill":true,"
fillColor":"#03F","fillOpacity":0.2,"dashArray":null},null,null,
"<img src = './thing.jpg'>"]}],"limits":{"lat":[30,30],"lng":[30,30]}},"evals":[]}
Run Code Online (Sandbox Code Playgroud)

Tim*_*bim 12

如果你可以使用svg而不是jpg它应该工作.在这里看到我的答案.

编辑/更新:
可以嵌入非本地的图像文件.考虑以下内容,我们在维基百科中添加R徽标.

library(leaflet)

pts <- data.frame(Latitude = 30, Longitude = 30, file = "thing")

file <- 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Rlogo.png/274px-Rlogo.png'

leaflet() %>%
  addTiles %>%
  addCircleMarkers(data = pts, lng =~Longitude, lat = ~Latitude,
                   popup = paste0("<img src = ", file, ">"))
Run Code Online (Sandbox Code Playgroud)

这很好用.

对于本地文件来说,它有点棘手leaflet,或者更好的是底层htmltools,期望指向图像文件的相对路径,该路径index.html存储在创建小部件时创建的临时文件夹中.因此,我们事先无法知道在哪里保存我们的图像.@Spacedman提供了一些用于leaflet在用户指定的文件夹中存储地图的功能,因此我们可以使用它们来创建这样的工作地图

library (leaflet)

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"))
}

file <- '/path/to/folder/image.png'

pts <- data.frame(Latitude = 30, Longitude = 30, file = "thing")

m <- leaflet() %>%
  addTiles %>%
  addCircleMarkers(data = pts, lng =~Longitude, lat = ~Latitude,
                   popup = paste0("<img src = ", file, ">"))

saveas(m, "/path/to/folder/index.html")
Run Code Online (Sandbox Code Playgroud)

我们保存index.html在与png现在相同的文件夹中如果我们index.html在浏览器中打开弹出窗口应该渲染png就好了.这也适用于jpg文件.

请注意,这仍然不会在RStudio查看器中显示所需的弹出行为.通过将图像编码为base64,可能还有一种可行的解决方法.当我找到时间时,我会深入研究这个问题.

更新2:mapview 的开发版现在具有以下专用功能:

  • popupImage() 用于嵌入本地或远程图像
  • popupGraph()用于嵌入基于格子,ggplot2htmlwidgets的图

mapview的开发版本可以安装:

devtools::install_github("environmentalinformatics-marburg/mapview", ref = "develop"
Run Code Online (Sandbox Code Playgroud)