st_contour生成sf对象调用geom_sf报mapping需由aes()创建错误求解
问题根源
你遇到的问题核心是lemons.ras对象缺失栅格地理配准元数据:st_dimensions返回的offset(栅格左上角坐标)、delta(栅格分辨率)字段为空,st_contour依赖这些参数计算等值线的真实坐标,因此输出的sf对象geometry全为NA。
你之前调用geom_stars能正常出图,是因为该图层在缺失地理配准参数时,会默认用栅格的行列号作为虚拟坐标渲染,不代表元数据完整。
解决方案
方案1:手动补全stars对象的配准参数
如果你的lemons.ras已经能返回正确的st_bbox结果,直接通过现有边界补全维度参数即可:
# 1. 提取基础参数 n_row <- dim(lemons.ras)[1] n_col <- dim(lemons.ras)[2] ras_bbox <- st_bbox(lemons.ras) res_x <- (ras_bbox$xmax - ras_bbox$xmin)/n_col res_y <- (ras_bbox$ymax - ras_bbox$ymin)/n_row # 2. 补全x维度参数 st_dimensions(lemons.ras)$x$offset <- ras_bbox$xmin st_dimensions(lemons.ras)$x$delta <- res_x st_dimensions(lemons.ras)$x$point <- FALSE # 3. 补全y维度参数 # 注意栅格y轴的offset为左上角y坐标,分辨率为负值(从上到下y值递减) st_dimensions(lemons.ras)$y$offset <- ras_bbox$ymax st_dimensions(lemons.ras)$y$delta <- -res_y st_dimensions(lemons.ras)$y$point <- FALSE # 4. 确认CRS设置正确 st_crs(lemons.ras) <- 4326
参数补全后重新生成等值线即可正常绘图:
mycontour <- st_contour(x = lemons.ras, contour_lines = FALSE, breaks = c(0.5, 0.95)) ggplot() + geom_stars(data = lemons.ras) + geom_sf(data = mycontour, aes(geometry = geometry), fill = NA, color = "red", linewidth = 1)
方案2:通过terra包中转转换(更稳定)
如果你手动补全参数仍报错,建议换转换路径,用terra包读取栅格再转stars,会自动补全所有配准元数据:
library(terra) # 读取原始asc文件 ras_terra <- rast("All_Rasters_Scaled.asc") # 设置原始CRS后投影 crs(ras_terra) <- "EPSG:2958" ras_terra_4326 <- project(ras_terra, "EPSG:4326") # 转stars对象,自动保留所有元数据 lemons.ras <- st_as_stars(ras_terra_4326)
转换完成后直接调用st_contour即可正常生成等值线。
内容的提问来源于stack exchange,提问作者dez93_2000
相关产品推荐
相关产品推荐

