R语言中如何加速生成大区域等距空间网格用于家域分析
大区域多个体家域计算的网格生成提速方案
核心性能瓶颈原因
你当前的方案性能不足主要来自两个问题:
- 跨多国的大范围下生成1km分辨率的sf多边形网格,网格总量可达百万甚至千万级,多边形几何计算和存储开销极高
- 生成的sf网格属于冗余格式,
adehabitatHR::kernelUD本身不需要多边形网格输入,格式转换过程浪费了大量算力
可直接落地的优化方案
按个体单独生成网格,避免全局大网格
不要使用所有个体的总活动边界生成覆盖多国的全局网格,针对每只鹰的活动点范围,向外扩展5-20km缓冲后生成对应小范围网格,单只个体的网格总量可降低2-3个数量级。使用
GridTopology直接生成适配kernelUD的网格,跳过sf多边形生成流程kernelUD支持直接传入GridTopology格式的网格定义,不需要生成每个网格的多边形几何,计算效率提升10倍以上,示例代码如下:library(adehabitatHR) library(sp) library(dplyr) library(sf) # 读入单只个体的轨迹数据后,先转换为对应投影的SpatialPoints # (大范围建议使用区域等面积投影,比如全球可用摩尔威德投影,欧洲用EPSG:3035,避免跨UTM带变形) sp.UTM <- SpatialPoints(cbind(dat$x, dat$y), proj4string = CRS("+init=epsg:32632")) # 计算该个体点范围+5km缓冲,避免边界点截断 x_ext <- range(sp.UTM@coords[,1]) + c(-5000, 5000) y_ext <- range(sp.UTM@coords[,2]) + c(-5000, 5000) # 直接生成1km分辨率的GridTopology,不需要生成多边形 grid_1km <- GridTopology( cellcentre.offset = c(x_ext[1], y_ext[1]), cellsize = c(1000, 1000), cells.dim = c(as.integer(diff(x_ext)/1000) + 1, as.integer(diff(y_ext)/1000) + 1) ) # 直接传入kernelUD计算家域,不需要多余格式转换 kud <- kernelUD(sp.UTM, grid = grid_1km)投影优化
若研究范围跨多个UTM带,不要强行使用单一UTM投影,选择适配研究区的等面积投影,既可以避免投影变形导致的家域面积计算误差,也可以排除无效区域的网格生成。多个体并行处理
多只个体的家域计算完全独立,可使用parallel、furrr等并行包批量处理,效率提升幅度和CPU核心数成正比。
内容的提问来源于stack exchange,提问作者Stef
相关产品推荐
相关产品推荐

