提问者:小点点

使用argosfilter::distanceTrack计算GPS点之间的距离


我对R相对较新,我需要计算GPS点之间的距离。我已经通过距离 argosfilter 包实现了这一目标,但我的数据中存在差距。

应该每 10 分钟录制一次,但由于现场存在问题,间隔长达 5 天。所以我需要一种方法来告诉不是计算点之间的时间是否大于 10 分钟的距离。

我现在的代码非常简单,因为它计算位置序列之间的距离:

距离轨道(纬度,纬度)

我认为一个if函数可以工作,但是我几乎没有使用过它们,也不知道如何编写它们来使用。那么这是一个合适的解决方案吗?或者有更好的方法吗?任何关于如何解决这个问题的想法将不胜感激!


共1个答案

匿名用户

实现这一点的一种方法是从与所需不匹配的数据中筛选行。如果我对distance Track函数的理解是正确的,那么它将获取N个纬度/经度点,并将它们减少到这些点之间的N-1个距离。然后只需要消除相隔不到十分钟的点,通过过滤数据帧可以很容易地做到这一点。

不知道你的数据到底是什么样子,我在下面创建了一些示例数据,希望与之类似:

## Create a data.frame of 10-minute intervals stored as POSIXct
## You can convert most times to POSIXct using as.POSIXct if they are not already that format
lizard <- data.frame(time=seq(from=as.POSIXct('2015-01-01 00:00:00'), to=as.POSIXct('2015-01-02 00:00:00'), by=10*60))

## Randomly eliminate rows with probability of 15% that a given row is eliminated to create gaps
lizard$keep = runif(nrow(lizard))
lizard <- lizard[lizard$keep <= .85, c('time'), drop=FALSE] ## drop arg used to kepe it a dataframe

## Random lat / lon data:
lizard$Lat = runif(nrow(lizard)) ## runif is random uniform
lizard$Lon = runif(nrow(lizard))

现在我运行距离计算。我们需要在消除行之前运行距离计算,因为即使行 ij 之间存在时间间隔(即 j$time - i$time

## We initialize to NA; the distance variable for row i will represent the distance between row i-1 and i; 
## row 1 will not have a meaningful value
lizard$distance <- NA 
lizard$distance[2:nrow(lizard)] <- distanceTrack(lizard$Lat, lizard$Lon)

最后,我们可以使用布尔值来过滤行,方法是比较第I行和第i-1行的每一行2:N:

lizard$isContiguous <- TRUE ## initialize a variable to determine if the data is at 10-min interval
lizard$isContiguous[2:nrow(lizard)] <- (as.numeric(lizard$time[2:nrow(lizard)] - lizard$time[1:nrow(lizard) - 1]) == 10)
lizard <- lizard[lizard$isContiguous, ] ## filter

该数据帧中剩余的距离仅仅是时间间隔为10分钟的距离。

有关过滤(或更准确地说,提取或替换)的更多信息,请查看此处的文档:

对于 [-索引:i, j, ...可以是逻辑向量,指示要选择的元素/切片