更换自定义SpatRaster后terra绘图网格及图例异常问题
问题:SpatRaster与OSM底图叠加后网格和图例错乱
使用terra和maptiles库实现SpatRaster与OSM底图叠加绘图时,示例代码(使用terra内置的全球高程栅格)可正常生成带网格和图例的地图,但替换为自定义的「Rio Trancura(原Rio Llafenco)流域」栅格(EPSG:4326)后,生成的地图出现网格与图例错乱问题,两张栅格均采用WGS 84(EPSG:4326)坐标系。
原因分析
- 自定义栅格分辨率极高(12.5米),原代码使用的
zoom=8级别OSM瓦片分辨率过低(约400米/像素),两者尺度差异过大,导致绘图时坐标轴、网格的计算逻辑冲突,叠加后出现错乱。 maptiles::get_tiles默认会将输入的EPSG:4326范围转换为Web墨卡托(EPSG:3857)下载瓦片,再转回EPSG:4326,这个转换过程在高分辨率栅格与低级别瓦片组合时,容易出现坐标对齐误差。- 叠加绘图时重复调用
axes = T和grid = T,导致底图和上层栅格的坐标轴、网格重复绘制,进一步加剧错乱。
解决方法
1. 匹配尺度与坐标系
根据自定义栅格的分辨率选择合适的OSM瓦片zoom级别,同时强制瓦片下载时使用与栅格一致的EPSG:4326坐标系,避免转换误差。
2. 优化绘图参数
仅在底图绘制时设置坐标轴和网格,上层栅格叠加时关闭重复的坐标轴、网格绘制,避免元素叠加冲突。
修改后的完整代码
library(terra) library(maptiles) # 加载自定义流域栅格 r <- terra::rast("C:/Users/wayym/OneDrive/Escritorio/Hidrologia/4Lucass/4Luis/dem_TrancuraAntesDeLlafenco_TanDEM_X_12_5m_noSinks[SAGA]_merged_ALOS_EPSG_4326-onlyCatchment_byMZB.tif") # 裁剪栅格空值区域,缩小瓦片下载范围(可选但推荐) r_trimmed <- terra::trim(r) ext_target <- terra::ext(r_trimmed) # 下载匹配坐标系的OSM瓦片,选择适配12.5米分辨率的zoom级别(13-14) osm_rast <- maptiles::get_tiles(ext_target, provider = "OpenStreetMap", crop = TRUE, zoom = 13, crs = "EPSG:4326") # 绘制底图:仅一次设置坐标轴和网格 terra::plot(osm_rast, axes = TRUE, mar = c(3.1, 3.1, 2.1, 7.1)) # 叠加自定义栅格:关闭重复的坐标轴和网格 terra::plot(r_trimmed, add = TRUE, axes = FALSE, grid = FALSE) # 可选:手动调整图例位置(如需) # legend_pos <- par("usr") # legend(legend_pos[2] + 0.1, legend_pos[4], # legend = seq(min(values(r_trimmed), na.rm=TRUE), max(values(r_trimmed), na.rm=TRUE), length.out=5), # fill = terrain.colors(5), bty = "n", title = "Elevation (m)")
额外注意事项
- Zoom级别参考:OSM的zoom级别与分辨率对应关系大致为:zoom13≈10米/像素,zoom14≈5米/像素,可根据实际显示效果微调。
- 坐标系验证:用
crs(r)和crs(osm_rast)确认两者完全一致,避免隐式转换误差。 - 性能优化:高zoom级别瓦片下载量较大,可通过
trim()缩小范围减少下载时间。
内容的提问来源于stack exchange,提问作者lsalinasm23
相关产品推荐
相关产品推荐

