R语言rayshader:栅格叠加层与DEM在3D地图中的对齐问题
问题:3D地形可视化中土地覆盖层与高程错位的解决方法
生成的3D地图中土地覆盖层与高程明显错位,核心原因是栅格数据的投影、重采样顺序错误,以及ggplot渲染时的坐标偏移。以下是确保ggplot2栅格叠加层与rayshader高度图精准对齐的完整工作流:
1. 统一坐标系统(先投影,再重采样)
所有栅格数据必须先转换到目标投影(如EPSG:4668),再基于投影后的DEM分辨率进行重采样,确保两者的栅格行列数、原点、分辨率完全一致:
proj <- "EPSG:4668" # 先将DEM投影到目标CRS dem_proj <- terra::project(dem, proj, method = "bilinear") # 先投影土地覆盖数据,再基于投影后的DEM重采样 province_land_cover_proj <- terra::project(province_land_cover, proj, method = "near") province_land_cover_resampled <- terra::resample( x = province_land_cover_proj, y = dem_proj, method = "near" )
2. 确保数据框的栅格行列完全匹配
将投影并重采样后的DEM和土地覆盖数据转换为数据框时,保证两者的x/y坐标完全对应:
# 从投影后的DEM生成数据框 dem_df <- as.data.frame(dem_proj, xy = TRUE, na.rm = TRUE) names(dem_df)[3] <- "dem" # 从对齐后的土地覆盖栅格生成数据框 province_land_cover_resampled_df <- as.data.frame( province_land_cover_resampled, xy = TRUE, na.rm = TRUE ) names(province_land_cover_resampled_df)[3] <- "values"
3. 统一ggplot的坐标设置
两个ggplot对象(土地覆盖图和高程图)必须使用完全相同的coord_sf参数,禁用自动缩放或偏移:
# 土地覆盖图的coord_sf设置 lc_map <- ggplot() + geom_raster(data = province_land_cover_df, aes(x = x, y = y, fill = as.factor(values))) + # ... 其他图层设置 ... coord_sf(crs = proj, expand = FALSE) + # 关键:关闭expand避免自动偏移 theme_for_the_win() # 高程图的coord_sf必须与上面完全一致 dem_map <- ggplot() + geom_raster(data = dem_df, aes(x = x, y = y, fill = dem)) + # ... 其他图层设置 ... coord_sf(crs = proj, expand = FALSE) + # 保持相同投影和expand设置 theme_for_the_win()
4. 优化rayshader的plot_gg参数
使用plot_gg时,确保width/height与ggplot输出尺寸严格匹配,强制保持宽高比一致:
rayshader::plot_gg( ggobj = lc_map, ggobj_height = dem_map, width = 7, height = 7, windowsize = c(600, 600), scale = 100, shadow = TRUE, shadow_intensity = 1, phi = 87, theta = 0, zoom = .55, multicore = TRUE, keep_aspect = TRUE # 关键:强制保持宽高比一致 )
5. 验证栅格对齐的关键步骤
处理过程中加入验证,确保数据一致性:
- 检查投影后栅格的范围:
terra::ext(dem_proj)和terra::ext(province_land_cover_resampled)必须完全相同 - 检查数据框行数:
nrow(dem_df)和nrow(province_land_cover_df)必须相等 - 对比前几行的
x/y坐标,确保完全匹配
内容的提问来源于stack exchange,提问作者Saïd Maanan
相关产品推荐
相关产品推荐

