计算个体内连续投影坐标点距离并添加距离列的方法咨询
UTM投影移动数据按个体计算连续点距离方法
实现思路
你已将坐标转换为EPSG:5321投影,该坐标系单位为米,仅需按个体ID分组后,计算组内相邻点的欧氏距离即可,无需额外坐标转换,计算标准统一。
代码实现
方法1:tidyverse方案(推荐)
先确认你的数据集包含记录点位先后顺序的时间字段,替换代码中的你的时间序列列名即可:
library(dplyr) data <- data %>% group_by(ID) %>% # 按个体分组,仅计算同个体内的距离 arrange(你的时间序列列名) %>% # 显式按采集时间排序,避免原始数据顺序错乱 mutate( # 计算当前点与前一点的欧氏距离,单位为米 distance = sqrt((x - lag(x))^2 + (y - lag(y))^2) ) %>% ungroup()
方法2:基础R方案
无需额外安装依赖包,同样需要替换你的时间序列列名:
data$distance <- ave( 1:nrow(data), data$ID, FUN = function(idx) { # 按时间排序点位 sorted_idx <- idx[order(data$你的时间序列列名[idx])] x_vals <- data$x[sorted_idx] y_vals <- data$y[sorted_idx] # 计算相邻距离,首个点位距离为NA dist_res <- c(NA, sqrt(diff(x_vals)^2 + diff(y_vals)^2)) # 映射回原数据行顺序 dist_res[match(idx, sorted_idx)] } )
结果说明
以你提供的样例数据为例,计算后的结果参考如下:
| ID | x | y | distance |
|---|---|---|---|
| Bear1 | 459486.4 | 7181992 | NA |
| Bear1 | 459652.6 | 7181904 | ~188.1m |
| Bear1 | 459661.5 | 7181880 | ~25.6m |
| Bear2 | 459604.7 | 7181898 | NA |
| Bear2 | 459639.6 | 7181894 | ~34.8m |
| Bear2 | 459565.1 | 7181960 | ~95.5m |
每个个体的第一条记录没有前序点位,默认返回NA,若有需要可自行替换为0等自定义值。
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

