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")
但是,当我使用新的 x
和 y 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_rect
和geom_text
的大小和限制必须根据保存文件的大小手动编辑。在这个例子中,我提供了我用于它的 ggsave
并以一种很好的方式绘制。
看似简单,其实是一个相当复杂的问题。我做了一些研究,发现您可以通过调整 size
和 scale
参数来实现这一点。但是,如果你像我一样使用 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])
)
}
我用这个新函数尝试了 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")
输出
希望这就是您想要的。我将此称为 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,使用纯文本可以让您在页面布局方面具有更大的灵活性,因此可能是更好的选择。
我想知道是否有人知道如何保留 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")
但是,当我使用新的 x
和 y 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_rect
和geom_text
的大小和限制必须根据保存文件的大小手动编辑。在这个例子中,我提供了我用于它的 ggsave
并以一种很好的方式绘制。
看似简单,其实是一个相当复杂的问题。我做了一些研究,发现您可以通过调整 size
和 scale
参数来实现这一点。但是,如果你像我一样使用 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])
)
}
我用这个新函数尝试了 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")
输出
希望这就是您想要的。我将此称为 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,使用纯文本可以让您在页面布局方面具有更大的灵活性,因此可能是更好的选择。