问题描述
我想知道是否有人知道如何在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")
但是,当我用新的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),0))
有人知道我如何获得第二份情节,但要拥有出版所需的版权信息吗?
我试图在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")
这涉及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])
)
}
我通过此新功能尝试了size
和scale
的一些规格,发现以下规格可以提供最佳的地图。
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")
输出
我希望这就是你想要的。我认为这是最好的结果,因为如果您尝试进一步缩小宽度(例如减小到250),则归因文字将与徽标重叠。
base_map <- get_googlemap2(
"Your API Key",size = c(250,extent = "panel")
据我所知,这是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_rect
和geom_text
的大小和限制。在此示例中,我提供了用于此的ggsave
并以一种不错的方式进行绘制。