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

时间:2015-03-28 05:13:40

标签: r gps geospatial distance latitude-longitude

我对R比较新,我需要计算GPS点之间的距离。我通过distanceTrack包中的argosfilter实现了此目的,但我的数据存在差距。

意味着每10分钟录制一次,但由于该领域的问题,有长达5天的差距。因此,如果点之间的时间大于10分钟,我需要一种告诉R不计算距离的方法。

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

LAT< -lizard $纬度

LON< -lizard $经度

distanceTrack(LAT,LON)

我认为if函数可以工作,但我几乎没有使用它们,也不知道如何编写它们以便与时间一起使用。那么这是一个合适的解决方案还是有更好的方法来做到这一点? 如何解决这个问题的任何想法将不胜感激!

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是过滤数据中与您想要的不匹配的行。如果我对distanceTrack函数是正确的,它需要N个lat / lon点并将它们减少到这些点之间的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&gt; 10分钟),我们仍然需要行j中的值来计算行jk之间的行进距离,这些距离本身可能相隔10分钟:

## 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)

最后,我们可以使用布尔来通过比较每行2的行i和i-1来过滤行: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分钟的距离。

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

  

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