使用R语言elevatr包提取高程值报错的解决方法及代码优化建议
R语言elevatr包提取圣保罗州点高程的错误排查与优化
错误原因
- 变量名笔误:筛选州内点时使用了未定义的
grid_points_teste变量,实际应为前面创建的grid_points,会导致后续对象异常。 st_crop用法错误:st_crop用于裁剪空间对象到目标范围,你不需要裁剪已在圣保罗州内的grid_points2,且参数as_points = all(na.rm = T)完全不符合函数要求,会引发对象处理异常。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, .))
代码优化建议
- 修正变量名错误:将
grid_points_teste替换为grid_points,避免未定义变量报错。 - 简化点筛选逻辑:用
st_filter替代mutate + lengths + filter,代码更简洁高效:
grid_points2 <- grid_points %>% st_filter(sao_paulo.br)
- 避免不必要的栅格转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")
- 统一代码风格:保持变量名一致(避免混合语言的命名如
grid_pontos.cortados2),注释清晰,提升可读性。 - 提前处理CRS一致性:
get_elev_raster返回的栅格CRS为WGS84(EPSG:4326),与你的点对象一致无需转换;后续若使用其他投影,需提前统一所有空间对象的CRS。
内容的提问来源于stack exchange,提问作者T. W.G. de Oliveira
相关产品推荐
相关产品推荐

