如何在Terra库绘制的栅格图中添加背景图且保留原有格式?
解决Terra栅格叠加OSM背景图超出设定范围的问题
问题根源
maptiles::get_tiles基于OSM瓦片网格下载数据,即便设置crop=TRUE,返回的瓦片范围是刚好覆盖目标区域的完整瓦片,会略大于你定义的ext_expanded。- 直接绘制瓦片会让绘图区域自动适配瓦片的实际范围,导致超出你设定的边界。
- 原代码中叠加的是原始栅格
r,而非扩展后的r_expanded,和背景范围不匹配。
修正方案
通过精确裁剪背景瓦片、固定绘图范围、匹配栅格范围三个步骤解决:
library(terra) library(maptiles) # 加载示例栅格 r <- rast(system.file("ex/elev.tif", package="terra")) # 定义原始范围和扩展范围 ext_original <- ext(r) ext_expanded <- ext( xmin(ext_original) - 1, xmax(ext_original) + 1, ymin(ext_original) - 1, ymax(ext_original) + 1 ) # 生成扩展后的栅格 r_expanded <- extend(r, ext_expanded) # 下载OSM瓦片,先获取覆盖扩展范围的瓦片 osm_rast <- get_tiles(ext_expanded, provider = "OpenStreetMap", crop = TRUE, zoom = 8) # 精确裁剪瓦片到ext_expanded的严格范围 osm_rast_cropped <- crop(osm_rast, ext_expanded) # 先初始化绘图,固定范围为ext_expanded plot(ext_expanded, main = "Expanded Raster with OSM Background", axes = TRUE) # 绘制裁剪后的OSM背景 plot(osm_rast_cropped, axes = FALSE, legend = FALSE, add = TRUE) # 叠加扩展后的栅格(设置透明度过渡,方便看背景) plot(r_expanded, add = TRUE, alpha = 0.7)
关键步骤解释
- 精确裁剪背景:用
terra::crop对下载的瓦片二次裁剪,确保完全匹配ext_expanded的边界。 - 固定绘图范围:先调用
plot(ext_expanded)初始化绘图区域,强制后续绘图都在这个范围内。 - 匹配栅格范围:叠加扩展后的
r_expanded,而非原始栅格,保证和背景范围一致。
内容的提问来源于stack exchange,提问作者lsalinasm23
相关产品推荐
相关产品推荐

