如何将Thunderforest API密钥传递给R ggspatial包以创建地图

时间:2017-10-17 14:58:36

标签: r openstreetmap rosm ggspatial thunderforest

我正在使用rosmggspatial R包创建地图。 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密钥,因此我已经注册了https://www.thunderforest.com/的API密钥。此页面(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>。我需要知道zxy(缩放级别和图块编号)来指定图块。这是不可能的,因为我有很多空间对象要绘制,我需要ggosm来确定适合我的缩放级别和平铺。如果有人能够对此有所了解,那就太棒了。

2 个答案:

答案 0 :(得分:2)

目前看起来并不像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

长期解决方案

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

希望有所帮助。

答案 1 :(得分:2)

解决方案:

轻笑 - 有一种方法可以使用rosm 执行此操作,而无需 修改库

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

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

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

保重 吨。

示例用法:source_from_url_format()

注意:使用Thunderforest网站上的私钥替换<insert key>

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密钥

一个单独但相关的问题是如何从公共代码中隐藏API密钥。建议的方法是将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