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

如何解决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并以一种不错的方式进行绘制。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res