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

如何在QGIS或R(非adehabitat包)计算利用分布重叠指数(UDOI)

解决UDOI计算的两种可行方法

方法一:基于R的ks包直接计算(无需adehabitathr)

UDOI的核心是计算两个物种利用密度的乘积在空间上的积分,直接用ks生成的kde对象就能实现,步骤如下:

1. 统一栅格化参数

假设你已经有两个物种的kde对象kde_sp1和kde_sp2,先确定共同的栅格范围和分辨率:

# 取两个家域的外接矩形作为统一范围
x_range <- range(c(kde_sp1$eval.points[[1]], kde_sp2$eval.points[[1]]))
y_range <- range(c(kde_sp1$eval.points[[2]], kde_sp2$eval.points[[2]]))

# 设置栅格分辨率(单位与你的坐标系统一致,比如米)
res <- 100

2. 生成密度栅格

用predict()函数生成两个物种的密度栅格:

# 生成栅格网格点
grid_points <- expand.grid(
  x = seq(x_range[1], x_range[2], res),
  y = seq(y_range[1], y_range[2], res)
)

# 预测每个网格点的密度值
dens_sp1 <- predict(kde_sp1, x = grid_points)
dens_sp2 <- predict(kde_sp2, x = grid_points)

3. 计算UDOI

  • 如果是平面坐标系(比如UTM),直接计算:
cell_area <- res^2  # 单个栅格单元的面积
udoi <- sum(dens_sp1 * dens_sp2, na.rm = TRUE) * cell_area
  • 如果是地理坐标系(WGS84),需要计算每个栅格的实际球面面积,用geosphere包:
library(geosphere)

# 为每个栅格单元生成四个顶点坐标
grid_polygons <- apply(grid_points, 1, function(p) {
  matrix(c(
    p[1], p[2],
    p[1]+res, p[2],
    p[1]+res, p[2]+res,
    p[1], p[2]+res,
    p[1], p[2]
  ), ncol=2, byrow=TRUE)
})

# 计算每个单元的面积
cell_areas <- sapply(grid_polygons, areaPolygon)

# 计算UDOI
udoi <- sum(dens_sp1 * dens_sp2 * cell_areas, na.rm = TRUE)

方法二:用QGIS计算

如果你已经有导出的Shapefile或密度栅格,按以下步骤操作:

1. 准备密度栅格(若只有多边形)

如果只有ks生成的家域多边形,先在R里转成密度栅格并导出为GeoTIFF:

library(raster)
# 基于之前的grid_points和dens_sp1生成栅格对象
r_sp1 <- raster(matrix(dens_sp1, nrow = length(seq(x_range[1], x_range[2], res)), byrow = TRUE),
                xmn = x_range[1], xmx = x_range[2], ymn = y_range[1], ymx = y_range[2])
writeRaster(r_sp1, "sp1_kde.tif", format = "GTiff")

# 同理导出物种2的栅格
r_sp2 <- raster(matrix(dens_sp2, nrow = length(seq(x_range[1], x_range[2], res)), byrow = TRUE),
                xmn = x_range[1], xmx = x_range[2], ymn = y_range[1], ymx = y_range[2])
writeRaster(r_sp2, "sp2_kde.tif", format = "GTiff")

2. QGIS操作步骤

  • 导入两个GeoTIFF栅格,确保坐标系一致。
  • 打开【栅格计算器】,输入公式:"sp1_kde@1" * "sp2_kde@1",生成乘积栅格。
  • 若为平面坐标系:
    1. 查看乘积栅格的分辨率,计算单元面积(分辨率²)。
    2. 打开乘积栅格的属性表,用【统计】工具获取像素值总和,乘以单元面积得到UDOI。
  • 若为地理坐标系:
    1. 用【栅格转矢量】工具将乘积栅格转为多边形图层。
    2. 给多边形图层添加新字段,用字段计算器输入$area计算每个单元的实际面积。
    3. 再添加字段,输入"value" * "area"计算每个单元的贡献值。
    4. 用【统计】工具求贡献值字段的总和,即为UDOI。

内容的提问来源于stack exchange,提问作者Larissa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:43:37