如何计算SpatVect分组点中各点到组内首个点的距离?
问题解决:计算组内每个空间点到组首点的距离
错误原因
你遇到的length(x) == length(y) is not TRUE错误,是因为sf::st_distance()设置by_element = TRUE时,要求输入的两个几何对象序列长度完全一致。但first(geometry)返回的是组内第一个点的单个几何对象(长度为1),而组内的geometry是多个点的序列(长度大于1),两者长度不匹配,导致报错。
解决方案
有两种简单的修复方式,都能实现需求:
方法1:重复组首点几何对象,匹配组内行数
在mutate里,把组首点的几何对象重复成和当前组行数相同的长度,这样x(组内所有点)和y(重复后的组首点)长度一致,by_element = TRUE就能逐个计算距离:
VectorPoints_sf %>% group_by(Transect) %>% mutate( distance_first = sf::st_distance( geometry, rep(first(geometry), n()), # 重复组首点,匹配组内行数 by_element = TRUE ) ) %>% ungroup() # 按需取消分组
方法2:利用距离矩阵提取结果
不使用by_element = TRUE,直接计算组内所有点到组首点的距离矩阵(n行1列),再转成向量作为新列:
VectorPoints_sf %>% group_by(Transect) %>% mutate( distance_first = as.vector(sf::st_distance(geometry, first(geometry))) ) %>% ungroup()
验证结果
两种方法都能得到你期望的输出:组内第一个点的distance_first为0,后续点依次显示到组首点的距离。
内容的提问来源于stack exchange,提问作者mace
相关产品推荐
相关产品推荐

