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

问题描述

我想知道是否有人知道如何在R中使用ggmap绘制(以新比例)地图上的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")

map_with_copyright_info)

但是,当我用新的base_mapx绘制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),0))

map_zoom_noCopyright

有人知道我如何获得第二份情节,但要拥有出版所需的版权信息吗?

我试图在zoom=函数中更改get_googlemap()参数,但是它似乎总是使英国脱颖而出,我需要能够看到整个区域我绘制数据。

非常感谢您的提前帮助!

解决方法

尽管看似简单,但这实际上是一个相当复杂的问题。我进行了一些研究,发现可以通过调整sizescale参数来实现。但是,如果像我一样使用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")

noisy map

这涉及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],size[1]/2 + 0.5,size[2]/2 - 0.5
  )
  structure(
    as.raster(img),class = c("ggmap","raster"),source = "google",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),size = c(330,380),grayscale = TRUE
)
ggmap(base_map,extent = "panel")

输出

final_image

我希望这就是你想要的。我认为这是最好的结果,因为如果您尝试进一步缩小宽度(例如减小到250),则归因文字将与徽标重叠。

base_map <- get_googlemap2(
  "Your API Key",size = c(250,extent = "panel")

overlap

据我所知,这是Google的问题,而不是ggmap的问题。我没有办法解决。另一个解决方法是从图像中删除归因文本,但将其作为纯文本形式重新引入内容中,如Google的attribution guidlines所述。但是,由于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),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并以一种不错的方式进行绘制。