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

使用R语言elevatr包提取高程值报错的解决方法及代码优化建议

R语言elevatr包提取圣保罗州点高程的错误排查与优化

错误原因

  1. 变量名笔误:筛选州内点时使用了未定义的grid_points_teste变量,实际应为前面创建的grid_points,会导致后续对象异常。
  2. st_crop用法错误:st_crop用于裁剪空间对象到目标范围,你不需要裁剪已在圣保罗州内的grid_points2,且参数as_points = all(na.rm = T)完全不符合函数要求,会引发对象处理异常。
  3. aggregate函数误用:aggregate处理栅格聚合时,输入的grid_pontos.cortados2是带geometry列的sf对象,函数会尝试对所有列(包括非数值的geometry列)执行均值运算,直接触发"non-numeric-alike variable(s)"错误。

解决方法

提取点对应的栅格高程值无需使用st_crop和aggregate,直接用专门的栅格提取函数即可,以下是两种可行方案:

方案1:使用stars包提取(推荐,与sf生态兼容)

# 将高程栅格转换为stars对象
elevation_stars <- st_as_stars(elevation_sp)

# 提取每个点的高程值
grid_points2 <- grid_points2 %>%
  mutate(elevation = st_extract(elevation_stars, .)[[1]])

方案2:使用raster包提取

# 直接用raster::extract提取点高程
grid_points2 <- grid_points2 %>%
  mutate(elevation = raster::extract(elevation_sp, .))

代码优化建议

  1. 修正变量名错误:将grid_points_teste替换为grid_points,避免未定义变量报错。
  2. 简化点筛选逻辑:用st_filter替代mutate + lengths + filter,代码更简洁高效:
grid_points2 <- grid_points %>%
  st_filter(sao_paulo.br)
  1. 避免不必要的栅格转data.frame:直接用stars对象绘制高程图,无需转成data.frame:
ggplot() +
  geom_stars(data = elevation_stars) +
  scale_fill_viridis_c(name = "Elevation (m)") +
  geom_sf(data = sao_paulo.br, color = "white", fill = NA) +
  geom_sf(data = grid_points2, color = "red")
  1. 统一代码风格:保持变量名一致(避免混合语言的命名如grid_pontos.cortados2),注释清晰,提升可读性。
  2. 提前处理CRS一致性:get_elev_raster返回的栅格CRS为WGS84(EPSG:4326),与你的点对象一致无需转换;后续若使用其他投影,需提前统一所有空间对象的CRS。

内容的提问来源于stack exchange,提问作者T. W.G. de Oliveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:35:38