【问题标题】:R: Using addResourcePath for rendering local leaflet tilesR:使用 addResourcePath 渲染本地传单图块
【发布时间】:2019-12-04 10:53:08
【问题描述】:

我想为传单添加本地图块,以便在闪亮的应用程序中离线渲染它们。 尽管在 SO 上有解决方案,例如 herehere ,但我仍然得到没有瓷砖的灰色地图。看到一些可重现的例子真的会帮助我。 谢谢。

我的示例代码:

library(shiny)
library(dplyr)
library(RgoogleMaps)

#downloads tiles for a given regions, saves it to C:/Users/.../mapTiles/OSM
for (zoom in 0:16)
  GetMapTiles(center = c(lat = 52.431635, lon = 13.194773),
              zoom = zoom,
              nTiles = round(c(20,20)/(17-zoom)))
#shiny ui 
ui = fluidPage(leafletOutput("map"))

#create basic map, load tiles from directory and set view to centre of downloaded tiles
server = function(input, output, server){
  addResourcePath(prefix = "OSM", "C:/Users/.../mapTiles")
  output$map = renderLeaflet({
    leaflet() %>% 
      addTiles( urlTemplate = "/OSM/{z}_{x}_{y}.png") %>% 
      setView(52.431635, 13.194773 , zoom = 10) %>%  #set to the location with tiles
      addMarkers(52.431635, 13.194773 )
  }
  )
}

shinyApp(ui, server)

【问题讨论】:

  • addResourcePath 中的“OSM”与对象类似,因此必须是完整路径,即您错过了路径末尾的“/OSM”。在 addTiles 下,OSM 被转换回它所代表的完整路径。还要仔细检查文件夹中是否存在缩放级别为 10 的图块。
  • 我之前尝试过使用addResourcePath(prefix = "OSM", "C:/Users/.../mapTiles/OSM")。但它不起作用。在那种情况下,你说问题可能出在瓷砖本身上? zoom=10 的示例磁贴如下所示:10_550_336.png
  • 在父文件“OSM”下,文件夹结构应该是每个缩放级别(9、10、11、12、13....)的单独文件,在这些文件夹中,您应该有更多的文件夹通过该缩放级别的正方形系统表示总平铺区域,并且在这些文件夹中 .png 文件。您的文件结构可能有误。
  • 嗯,你说得对,我的文件夹结构不好。您能否通过正确文件夹结构的示例添加答案?我没有得到最后一个“通过该缩放级别的正方形系统表示总平铺区域的更多文件夹”。谢谢!

标签: r shiny leaflet


【解决方案1】:

就我而言,我通过gdal2tiles 创建自己的图块,它会获取您的数据并自动创建一个 {z}/{x}/{y}.png 文件夹结构。请参阅this link 以获得一个很好的教程以及我对文件结构的意思;

+---14
|   +---8185
|     +---5460.png
|     +---5461.png
|     +---etc.png
|   \---8186

# I use the following server (see how my addTiles has a folder structure)
server <- function(input, output,session) {
   addResourcePath("mytiles", "C:/.../tiles")
   output$tilemap <- renderLeaflet({
     leaflet() %>%
       setView(lng = -4.4, lat = 52, zoom = 12) %>%
       addTiles(urlTemplate = "mytiles/{z}/{x}/{y}.png")

   })
}

现在,当您将图块从 Google 地图下载到硬盘时,您需要一种稍微不同的方法,因为文件是以 {z}_{x}_{y}.png 格式下载的,而不是像 gdal 创建的那样生成文件结构;

+---11_1098_671.png 等等

因此您需要调整 addTiles 代码以反映这一点,使用下划线,如 Google 文件名;

server <- function(input, output,session) {
  addResourcePath("mytiles", "C:/.../OSM")
  output$tilemap <- renderLeaflet({
    leaflet() %>%
      setView(lng = 13.194773, lat = 52.431635, zoom = 11) %>%
      addTiles(urlTemplate = "mytiles/{z}_{x}_{y}.png")

  })

}

最后,我的 setView 参数的顺序与您的不同,但我不确定这是否会有所不同。

【讨论】:

  • 感谢您的时间和帮助。我不想再打扰你了,这两个选项都对我不起作用。甚至尝试手动创建这样的结构 .../OSM/10/548/335.png (参考链接中的建议结构)。在浏览所有我能得到的参考资料之前,我会让它休息一下。可能尝试使用 gdal2tiles 创建结构。如果有进展,会发布。再次感谢!
  • 祝你好运,我在答案的后半部分使用了您在示例中提供的确切下载和我的代码,它在柏林给了我一些瓷砖,所以我不确定出了什么问题给你的
  • 有效!在家试了一下,立马见效!非常感谢。
【解决方案2】:

我尝试了这个解决方案,但它不起作用,这个话题很老,但它确实帮助我实现了我想做的事情,我通过创建两个端口为你们找到了另一个解决方案:

  • 只需为闪亮的服务器 (3838) 和托管磁贴的服务器 (8000) 定义两个不同的端口

servr::httd(dir="C:/TestApp/data_hydrepat/tiles_hydrepat/mapTiles/mytiles",daemon=TRUE,port=8000) options(shiny.port = 3838)

  • 要关闭托管磁贴的服务器,只需在输入或其他内容上放置一个响应式......然后关闭

(servr::daemon_stop(which = daemon_list())

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 2017-07-28
    • 2015-10-12
    • 2022-11-15
    • 2014-06-01
    • 1970-01-01
    • 2018-01-25
    • 2020-01-27
    相关资源
    最近更新 更多