R 中的 ggmap - 在裁剪地图上保留 google 版权信息

ggmap in R - keep google copyright information on cropped map

我想知道是否有人知道如何保留 ggmap 在 R 中绘制的地图(使用新比例尺)的 google 版权信息?

例如:

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")

当我在不更改比例的情况下绘制 base_map 时,版权信息将插入到绘图的底部,如下所示:

ggmap(base_map, extent = "panel")

但是,当我使用新的 xy axis 绘制 base_map 以放大英国大陆时。我还删除了版权信息。如下:

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))

有谁知道我怎样才能得到第二个情节,但有我出版所需的版权信息?

我试图更改 get_googlemap() 函数中的 zoom= 参数,但它似乎总是切断英国的顶部或底部,我需要能够看到整个区域因为当我绘制我的数据时。

非常感谢您的提前帮助!

我用了很多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')

geom_rectgeom_text的大小和限制必须根据保存文件的大小手动编辑。在这个例子中,我提供了我用于它的 ggsave 并以一种很好的方式绘制。

看似简单,其实是一个相当复杂的问题。我做了一些研究,发现您可以通过调整 sizescale 参数来实现这一点。但是,如果你像我一样使用 ggmap v3.0.0,你会发现指定 non-square 尺寸只会给你一个“嘈杂的图像”,如下所示:

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")

这涉及到已知的bug in the ggmap package. It has not yet been resolved. Although there exists a solution as mentioned here, that only partially solves the problem because the solution has failed for some cases mentioned in this post。因此,我建议重写该函数以使其以稳健的方式工作。幸运的是,在研究了源代码之后,我发现这个问题并没有那么难处理。该问题是由 get_goolemap 函数中的某些 image-processing 故障引起的。因此,将该功能中的图像处理外包给专用包是一种简单的解决方法。

考虑这个 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])
  )
}

我用这个新函数尝试了 sizescale 的一些规格,发现以下规格可以呈现最好的地图。

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")

输出

希望这就是您想要的。我将此称为 best-possible 结果,因为如果您尝试进一步缩小宽度,例如缩小到 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")

据我所知,这是 Google 的问题,而不是 ggmap 的问题。我没有办法解决它。另一种解决方法是从图像中删除属性文本,但在内容中将其作为纯文本重新引入,如 Google 的 attribution guidlines 中所述。但是,由于 Google 的徽标仍然需要存在,因此您必须弄清楚如何将其粘贴到地图上。 IMO,使用纯文本可以让您在页面布局方面具有更大的灵活性,因此可能是更好的选择。