如何用sf、spatialEco和terra从栅格生成指定体积的等值线?
问题
我想用R包spatialEco和terra处理带权重的数据,生成核密度估计后导出用于制图的等值线shapefile。但在生成等值线多边形时遇到了问题:sf.kde和raster.vol返回的是SpatRaster对象,我尝试用terra::as.contour将其转为多边形,尽管已经通过raster.vol指定了75%的感兴趣百分比,生成的等值线却还是有10个层级。我找不到让as.contour返回单一图层的方法,想知道返回的SpatVector里哪个层级对应栅格体积的指定百分比阈值,或者有没有其他生成该等值线的方法。
示例代码:
# 从点数据生成75% PVC library(sf) library(spatialEco) library(terra) set.seed(500) # 示例数据 lims <- data.frame(x = c(0,10), y = c(5,15)) dat <- data.frame(x = rnorm(50, 4, 1.0), y = rnorm(50, 11, 0.5)) # plot(dat, xlim = lims$x, ylim = lims$y) # 将数据转为sf坐标格式 dat_sf <- st_as_sf(dat, coords = c("x","y")) # plot(dat_sf) # 用spatialEco生成核密度估计 dat_kde <- sf.kde(dat_sf, y = NULL, bw = 2, res = .5, ref = c(lims$x, lims$y)) # plot(dat_kde) # 从KDE生成百分比体积栅格 dat_vol <- raster.vol(dat_kde, p = .75) plot(dat_vol, xlim = c(2,6), ylim = c(9,13)) contour(dat_vol, add = T) # 从栅格获取百分比体积等值线 dat_con <- as.contour(dat_vol)
解决方案
方法1:筛选as.contour返回的目标层级
raster.vol生成的dat_vol栅格,其值代表从高到低累积的概率密度占比,你指定的p=0.75意味着栅格中值≥0.75的区域就是包含75%核密度体积的范围。
as.contour返回的SpatVector中,level字段存储了每条等值线对应的阈值,直接筛选该字段等于0.75的记录即可:
# 提取对应75%阈值的等值线 dat_con_75 <- dat_con[dat_con$level == 0.75, ] # 查看结果 plot(dat_con_75)
方法2:直接生成单一阈值等值线(更高效)
无需使用as.contour默认的多层级,直接通过levels参数指定你需要的阈值,一步生成目标等值线:
# 直接生成75%阈值对应的等值线多边形 dat_con_single <- as.contour(dat_vol, levels = 0.75) # 验证结果 plot(dat_vol, xlim = c(2,6), ylim = c(9,13)) plot(dat_con_single, add = T, col = "red", lwd = 2)
导出为Shapefile
得到目标等值线后,使用terra::writeVector导出为shapefile:
writeVector(dat_con_single, "75_percent_kde_contour.shp", overwrite = TRUE)
带权重数据的适配
如果你的数据有权重列,只需在sf.kde中指定y参数为权重列即可,后续流程完全一致:
# 假设dat包含weight权重列 dat_kde_weighted <- sf.kde(dat_sf, y = dat$weight, bw = 2, res = .5, ref = c(lims$x, lims$y))
内容的提问来源于stack exchange,提问作者DDaye
相关产品推荐
相关产品推荐

