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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:03:39