如何在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",生成乘积栅格。 - 若为平面坐标系:
- 查看乘积栅格的分辨率,计算单元面积(分辨率²)。
- 打开乘积栅格的属性表,用【统计】工具获取像素值总和,乘以单元面积得到UDOI。
- 若为地理坐标系:
- 用【栅格转矢量】工具将乘积栅格转为多边形图层。
- 给多边形图层添加新字段,用字段计算器输入
$area计算每个单元的实际面积。 - 再添加字段,输入
"value" * "area"计算每个单元的贡献值。 - 用【统计】工具求贡献值字段的总和,即为UDOI。
内容的提问来源于stack exchange,提问作者Larissa
相关产品推荐
相关产品推荐

