代码之家  ›  专栏  ›  技术社区  ›  www

如何将Thunderforest API密钥传递给GGR空间包以创建地图

  •  2
  • www  · 技术社区  · 7 年前

    我正在使用 rosm ggspatial ggosm 该函数易于根据提供的空间对象提取底图层。这里有一个例子。

    library(ggplot2)
    library(sp)
    library(rosm)
    library(ggspatial)
    
    ggosm() + 
      geom_spatial(longlake_waterdf, fill = NA, color = "black")
    

    enter image description here

    这很有效。我可以将底图图层更改为其他类型(请参见 osm.types() cartolight 作为底图层。

    ggosm(type = "cartolight") + 
      geom_spatial(longlake_waterdf, fill = NA, color = "black")
    

    enter image description here

    这同样有效。现在我的问题是 如何传递Thunderforest API密钥 ? 如果我使用类型作为 thunderforestoutdoors ,我得到了以下输出。

    ggosm(type = "thunderforestoutdoors") + 
      geom_spatial(longlake_waterdf, fill = NA, color = "black")
    

    enter image description here

    显然,我需要Thunderforest API密钥,因此我已经从注册了一个API密钥 https://www.thunderforest.com/ . 本页( https://www.thunderforest.com/docs/apikeys/ )演示如何使用API密钥。文件 rosm公司 还显示了用户可以通过提供URL来定义地图分幅(请参见 ?as.tile_source ). 然而,URL的总体结构似乎如下所示: https://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png?apikey=<insert-your-apikey-here> . 我需要知道 z , x y (缩放级别和平铺编号)来指定平铺。这是不可能的,因为我有很多空间对象要绘制,我需要 ggosm公司

    2 回复  |  直到 7 年前
        1
  •  2
  •   Technophobe01    7 年前

    解决方案:

    咯咯笑-有一种方法可以做到这一点,用rosm做到这一点 没有 修改库 .

    • 使用 rosm:: source_from_url_format() 作用这就是它的设计目的,它记录在rosm包中。[无可否认,有点简短]

    注意-为了完整性,我介绍了在使用单独的后续项目符号下的共享代码时如何隐藏公共API密钥。

    我希望这会有所帮助,它至少会让那些想做你提议的事情而不需要修改库的人变得更容易。

    当心 T

    用法示例:source\u from\u url\u format()

    笔记 :替换 <insert key> 使用来自Thunderforest网站的私钥。

    if (!require(ggplot2)) install.packages("ggplot2")
    if (!require(rosm)) install.packages("rosm")
    if (!require(ggspatial)) install.packages("ggspatial")
    if (!require(sp)) install.packages("sp")
    
    thunderforest = source_from_url_format(
      url_format = c('http://a.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=<insert key>',
                     'http://b.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=<insert key>',
                     'http://c.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=<insert key>'),
      attribution = "More on Thunderforest at http://www.thunderforest.com/"
    )
    
    ggosm(type = thunderforest) + 
      geom_spatial(longlake_waterdf, fill = NA, color = "black")
    

    运行时输出示例:

    > if (!require(ggplot2)) install.packages("ggplot2")
    > if (!require(rosm)) install.packages("rosm")
    > if (!require(ggspatial)) install.packages("ggspatial")
    > if (!require(sp)) install.packages("sp")
    > thunderforest = source_from_url_format(
    
    +   url_format = c('http://a.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=<secret>',
    +                  'http://b.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=<secret>',
    +                  'http://c.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=<secret>'),
    +   attribution = "More on Thunderforest at http://www.thunderforest.com/"
    + )
    > ggosm(type = thunderforest) + 
    +   geom_spatial(longlake_waterdf, fill = NA, color = "black")
    Converting coordinates to lat/lon (epsg:4326)
    Zoom: 15
    Fetching 4 missing tiles
      |===================================================================================================================================| 100%
    ...complete!
    

    输出绘图:

    enter image description here

    在公共代码中隐藏Thunderforest API密钥

    ~/.Renviron 文件

    THUNDERFOREST_API_KEY="<insert api key"`
    

    我们也通过调用检索环境变量:

    Sys.getenv("THUNDERFOREST_API_KEY")
    

    现在我们可以在R程序中调用它,如下所示:

    if (!require(ggplot2)) install.packages("ggplot2")
    if (!require(rosm)) install.packages("rosm")
    if (!require(ggspatial)) install.packages("ggspatial")
    if (!require(sp)) install.packages("sp")
    
    thunderforest = source_from_url_format(
      url_format = c(paste0('http://a.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=',Sys.getenv("THUNDERFOREST_API_KEY")),
                     paste0('http://b.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=',Sys.getenv("THUNDERFOREST_API_KEY")),
                     paste0('http://c.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=',Sys.getenv("THUNDERFOREST_API_KEY"))),
      attribution = "More on Thunderforest at http://www.thunderforest.com/"
    )
    
    ggosm(type = thunderforest) +
      geom_spatial(longlake_waterdf, fill = NA, color = "black")
    

    执行的代码

    使用此示例可以更轻松地共享代码。 发布的代码中不需要包含密钥 ;-)

    > if (!require(ggplot2)) install.packages("ggplot2")
    > if (!require(rosm)) install.packages("rosm")
    > if (!require(ggspatial)) install.packages("ggspatial")
    > if (!require(sp)) install.packages("sp")    
    > thunderforest = source_from_url_format(
    
    +   url_format = c(paste0('http://a.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=',Sys.getenv("THUNDERFOREST_API_KEY")),
    +                  paste0('http://b.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=',Sys.getenv("THUNDERFOREST_API_KEY")),
    +                  paste0('http://c.tile.thunderforest.com/landscape/${z}/${x}/${y}.png?apikey=',Sys.getenv("THUNDERFOREST_API_KEY"))),
    +   attribution = "More on Thunderforest at http://www.thunderforest.com/"
    + )
    > ggosm(type = thunderforest) +
    +   geom_spatial(longlake_waterdf, fill = NA, color = "black")
    Converting coordinates to lat/lon (epsg:4326)
    Zoom: 15
    

    输出绘图:

    enter image description here

        2
  •  2
  •   detroyejr    7 年前

    目前似乎没有办法用ggspatial或rosm实现这一点。 So, I forked rosm 并将其中一个函数修改为包含api键(如果在您的环境中找到)。

    短期解决方案

    # Packages
    devtools::install_github("jonathande4/rosm")
    library(rosm)
    library(ggspatial)
    
    # Set environment.
    Sys.setenv("THUNDERFOREST_KEY" = "YOUR_API_KEY")
    
    # Plot
    ggosm(type = "thunderforestoutdoors") + 
      geom_spatial(longlake_waterdf, fill = NA, color = "black")
    

    output

    长期解决方案

    我想尝试提交此更改的请求。如果实现中有任何偏离原始解决方案的更改,我将发布更新。

    希望这有帮助。

    推荐文章