You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:17:34