我正在使用rosm
和ggspatial
R包创建地图。 ggosm
函数很容易用于根据提供的空间对象提取基本地图图层。这是一个例子。
library(ggplot2)
library(sp)
library(rosm)
library(ggspatial)
ggosm() +
geom_spatial(longlake_waterdf, fill = NA, color = "black")
这很有效。我可以将基本地图图层更改为其他类型(有关可用类型,请参阅osm.types()
。以下是使用cartolight
作为基本地图图层的示例。
ggosm(type = "cartolight") +
geom_spatial(longlake_waterdf, fill = NA, color = "black")
这也有效。现在我的问题是如何传递Thunderforest API密钥?如果我使用类型thunderforestoutdoors
,我得到以下输出。
ggosm(type = "thunderforestoutdoors") +
geom_spatial(longlake_waterdf, fill = NA, color = "black")
显然,我需要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>
。我需要知道z
,x
和y
(缩放级别和图块编号)来指定图块。这是不可能的,因为我有很多空间对象要绘制,我需要ggosm
来确定适合我的缩放级别和平铺。如果有人能够对此有所了解,那就太棒了。
答案 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")
哪个输出此地图,不含水印。
我想尝试提交此次更改的拉取请求。如果实施中的任何更改偏离原始解决方案,我将发布更新。
希望有所帮助。
答案 1 :(得分:2)
轻笑 - 有一种方法可以使用rosm 执行此操作,而无需 修改库。
rosm:: source_from_url_format()
功能。这就是它的设计目的,它在rosm包中有记录。 [不可否认有点简短] 注意 - 我将介绍如何在单独的后续项目符号下使用共享代码时隐藏您的公共API密钥,以确保完整性。
我希望这会有所帮助,至少应该让那些想要做你想做的事情的人更容易,而不需要修改库。
保重 吨。
注意:使用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!
一个单独但相关的问题是如何从公共代码中隐藏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