这看似简单,其实是一个相当复杂的问题。我做了一些研究,发现你可以通过调整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")
这涉及ggmap 包中的已知bug。它尚未得到解决。尽管存在here 中提到的解决方案,但它只能部分解决问题,因为该解决方案在此post 中提到的某些情况下失败了。因此,我建议重写该函数以使其以稳健的方式工作。幸运的是,在研究了源代码之后,我发现这个问题并不难处理。该问题是由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])
)
}
我用这个新功能尝试了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")
输出
我希望这是你想要的。我将此称为最佳结果,因为如果您尝试进一步缩小宽度,例如缩小到 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,使用纯文本为您提供了更大的页面布局灵活性,因此可能是更好的选择。