QPa*_*aps 13 google-maps r ggplot2 ggmap
我想知道是否有人知道如何在 R 中的 ggmap 绘制的地图上保留谷歌版权信息(使用新比例)?
例如:
library(ggmap)
library(ggplot2)
# download basemap
ggmap::register_google(key="xxx") # insert your hey here xxx
ggmap::ggmap_show_api_key()
base_map <- get_googlemap(center = c(lon= -2.325278, lat=54.6000000), zoom = 5, style = 'element:labels|visibility:off',color= "bw")
Run Code Online (Sandbox Code Playgroud)
当我在base_map不改变比例的情况下进行绘图时,版权信息会插入到绘图的底部,如下所示:
ggmap(base_map, extent = "panel")
Run Code Online (Sandbox Code Playgroud)
然而,当我绘制base_map一个新的x,并y axis放大到英国大陆。我还裁剪了版权信息。如下:
ggmap(base_map, extent = "panel")+
scale_x_continuous(limits = c(-7, 3), expand = c(0, 0)) +
scale_y_continuous(limits = c(49.5, 59), expand = c(0, 0))
Run Code Online (Sandbox Code Playgroud)
有谁知道我如何获得第二个情节但有出版所需的版权信息?
我试图更改zoom=函数中的参数,get_googlemap()但它似乎总是将英国的顶部或底部剪掉,并且在绘制数据时我需要能够看到整个区域。
非常感谢您的帮助!
这看似简单,其实是一个相当复杂的问题。我做了一些研究,发现你可以通过调整size和scale参数来实现这一点。但是,如果您ggmap像我一样使用v3.0.0,您会发现指定非正方形尺寸只会给您一个“嘈杂的图像”,如下所示:
base_map <- ggmap::get_googlemap(center = c(lon= -2.325278, lat=54.6000000), zoom = 5, size = c(331, 367), style = 'element:labels|visibility:off', color= "bw")
ggmap(base_map, extent = "panel")
Run Code Online (Sandbox Code Playgroud)
这涉及包中的一个已知错误ggmap。它尚未解决。尽管存在提到的解决方案在这里,因为该解决方案未能在此提到的一些情况下,仅部分地解决了这个问题后。因此,我建议重写该函数以使其以稳健的方式工作。幸运的是,在调查了源代码后,我发现问题并不难处理。该问题是由get_goolemap函数中的某些图像处理失败引起的。因此,将该功能中的图像处理外包给专用包是一种简单的解决方法。
考虑一下get_googlemap2(为了简单起见,我忽略了原始文件中的所有参数检查get_goolemap,因此请注意您的输入)
require(RgoogleMaps)
require(httr)
require(magick)
require(urltools)
require(tibble)
get_googlemap2 <- function(
api_key = "Your API Key",
center = c(lon = -95.3632715, lat = 29.7632836),
zoom = 10, size = c(640, 640), scale = 2,
maptype = c("terrain", "satellite", "roadmap", "hybrid"),
grayscale = FALSE, style
) {
maptype <- match.arg(maptype)
params <- c(
center = paste0(center[c(2L, 1L)], collapse = ","),
zoom = zoom,
size = paste0(size, collapse = "x"),
scale = scale,
maptype = maptype,
style = style,
key = api_key
)
url <- "https://maps.googleapis.com/maps/api/staticmap"
urltools::parameters(url) <- paste(names(params), params, sep = "=", collapse = "&")
url <- URLencode(url)
message("Souce: ", url)
img <- magick::image_read(httr::content(httr::GET(url)))
if (grayscale) img <- magick::image_quantize(img, colorspace = "gray")
ll <- RgoogleMaps::XY2LatLon(
list(lat = center[2], lon = center[1], zoom = zoom),
-size[1]/2 + 0.5, -size[2]/2 - 0.5
)
ur <- RgoogleMaps::XY2LatLon(
list(lat = center[2], lon = center[1], zoom = zoom),
size[1]/2 + 0.5, size[2]/2 - 0.5
)
structure(
as.raster(img), class = c("ggmap", "raster"),
source = "google", maptype = maptype, zoom = zoom,
bb = tibble::tibble(ll.lat = ll[1], ll.lon = ll[2], ur.lat = ur[1], ur.lon = ur[2])
)
}
Run Code Online (Sandbox Code Playgroud)
我尝试了这个新功能的一些规范,size并scale发现以下规范可以呈现最好的地图。
base_map <- get_googlemap2(
"Your API Key",
center = c(lon = -2.325278, lat = 54.6000000), zoom = 5, size = c(330, 380), scale = 2, style = 'element:labels|visibility:off', grayscale = TRUE
)
ggmap(base_map, extent = "panel")
Run Code Online (Sandbox Code Playgroud)
输出
我希望这就是你想要的。我称之为最佳结果,因为如果您尝试进一步缩小宽度,例如,缩小到 250,属性文本将与徽标重叠。
base_map <- get_googlemap2(
"Your API Key",
center = c(lon = -2.325278, lat = 54.6000000), zoom = 5, size = c(250, 380), scale = 2, style = 'element:labels|visibility:off', grayscale = TRUE
)
ggmap(base_map, extent = "panel")
Run Code Online (Sandbox Code Playgroud)
据我所知,这是 Google 的问题,而不是ggmap。我没有办法解决它。另一种解决方法是从图像中删除归属文本,但将其作为纯文本重新引入内容中,如 Google 的归属指南中所述。但是,由于 Google 的徽标仍然需要存在,因此您必须弄清楚如何将其粘贴到地图上。IMO,使用纯文本可为您提供更大的页面布局灵活性,因此可能是一种更好的方法。
我使用了很多 ggmap,而这种类型的问题当时我无法以优雅的方式解决。但是有一种方法可以实现您想要的东西(手动操作)。随着geom_rect制作灯箱,并与geom_text写版权信息。
ggmap(base_map, extent = "panel")+
scale_x_continuous(limits = c(-7, 3), expand = c(0, 0)) +
scale_y_continuous(limits = c(49.5, 59), expand = c(0, 0)) +
geom_rect(ymin = 49.5,ymax = 49.7, fill = 'white', alpha = 0.1, xmin = -3.35, xmax = 3) +
geom_text(y = 49.6, x = -0.2, size = 2.5,
label = 'Map data ©2020 GeoBasis-DE/BKG (©2009), Google, Inst. Geogr Nacional')
ggsave('Map.jpg', width = 7, height = 9, units = 'in')
Run Code Online (Sandbox Code Playgroud)
的大小和限制geom_rect以及geom_text必须手动根据保存文件的大小进行编辑。在这个例子中,我提供了ggsave我用于它并以一种很好的方式绘图。
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |