使用amt包计算家域核UD时重复顶点问题的解决方法
解决方案
1. 地理坐标系下的重复坐标处理
即使是WGS84坐标系,添加极小抖动不会影响家域分析结果,先对每个子数据集去重并添加抖动:
修改hr2的生成代码:
hr2 <- hr %>% nest(data = -c(hab_value)) %>% mutate( data = map(data, function(df) { # 仅按坐标去重(保留第一条记录) df_unique <- df %>% distinct(x_, y_, .keep_all = TRUE) # 添加1e-7度的抖动(约1cm精度,避免破坏地理坐标意义) df_unique$x_ <- df_unique$x_ + rnorm(nrow(df_unique), 0, 1e-7) df_unique$y_ <- df_unique$y_ + rnorm(nrow(df_unique), 0, 1e-7) return(df_unique) }), n = map_int(data, nrow) )
2. 针对小样本调整带宽
部分子数据集样本量小,默认带宽可能导致过度平滑,进而生成无效几何。手动指定带宽计算逻辑:
修改hr3的hr_kde调用:
hr3 <- hr2 %>% mutate( hr_kdedat = map(data, function(df) { # 计算参考带宽 h <- hr_kde_ref(df, method = "href") # 样本量小于20时缩小带宽,避免过度扩散 if(nrow(df) < 20) h <- h * 0.7 hr_kde(df, trast = trast, levels = c(0.6, 0.95), h = h) }) )
3. 修复无效几何图形
如果仍有错误,在提取等值线后用sf包修复无效几何:
library(sf) # 在循环中修改hr_iso的生成 hr_iso <- hr_isopleths(dataf) %>% st_make_valid() # 自动修复重复顶点、自相交等问题
4. 调整栅格分辨率
make_trast默认分辨率可能不合适,手动指定地理坐标系下的合理分辨率(如0.001度≈100米):
trast <- make_trast(hr, res = 0.001)
内容的提问来源于stack exchange,提问作者jackjack
相关产品推荐
相关产品推荐

