问题计算 R 中的距离 - 包括负值 - 应用过滤器后

Issue calculating distances in R - including negative values - after applying filter

我希望有人能告诉我哪里出错了...我正在尝试计算一个点与前一行那个点之间的距离;位置在 lat/longs、WGS84 中)。我发现使用以下代码无疑是一种非常不优雅的方法:

df200$Long.prev <- c(NA,df200$AvgLong[1:(length(df200$AvgLong)-1)])
df200$Lat.prev <- c(NA,df200$AvgLat[1:(length(df200$AvgLat)-1)])
library(geosphere)
library(raster)
p1 <- SpatialPointsDataFrame(df200[c("AvgLong","AvgLat")],     data=data.frame(id=df200$Animal),proj4string=CRS("+proj=longlat +datum=WGS84"))
p2 <- SpatialPointsDataFrame(df200[c("Long.prev","Lat.prev")], data=data.frame(id=df200$Animal),proj4string=CRS("+proj=longlat +datum=WGS84"))
distance <- distGeo (p1, p2)
distance.VE <- distVincentyEllipsoid(p1,p2)
df200$distance.from.previous <- as.numeric(distance)
df2$distance.from.previous.VE <-as.numeric(distance.VE) 

这适用于我的初始数据框;我从 distGeo 和 distVincentyEllipsoid 得到了合理的距离值(与我使用 QGIS 标尺工具粗略得到的值相比)和相等的值。这是输出的距离部分的示例(如预期):

distance.from.previous distance.from.previous.VE

460.8000 460.8000
725.1920 725.1920
284.0190 284.0190
861.2344 861.2344
828.64791 828.64791

但是,实际上,我想在计算距离之前过滤掉不好的 GPS 位置,所以我首先应用这个:

df2 <- with(df2, df2[AvgHDOP <=2 & (AvgAlt >=0 & AvgAlt <=75),])

但是,一旦我这样做了,距离计算就不再正常工作了。相反,我得到 odd/incorrect 值,包括 distGeo 的负数,如下所示:

distance.from.previous distance.from.previous.VE
4.415878e-14 0.0000
-1.719159e-14 0.0000
2.443902e-13 0.0000
9.951547e+02 995.1547
9.865199e+02 986.5199

在本例中,由于过滤,前两个点等于上例中的第4和第5个,因此距离输出应为828.65m。但是,显然有些地方出了问题,我这辈子都弄不明白!有什么帮助吗?另外,我是否应该担心第一行的距离值,因为该行的 Lat.prev 和 Long.prev 是 NA?

我确实收到了一些错误消息(我相信都是由于最初的 NA),但是在第一种情况下它工作正常和第二种情况下它给我奇怪的结果我都得到了相同的错误。

p2 <- SpatialPointsDataFrame(df2[c("Long.prev","Lat.prev")], data=data.frame(id=df2$Animal),proj4string=CRS("+proj=longlat +datum=WGS84"))
Error in .local(obj, ...) : NA values in coordinates
distance <- distGeo (p1, p2)
Warning message: In cbind(p1[, 1], p1[, 2], p2[, 1], p2[, 2]) : number of rows of result is not a multiple of vector length (arg 3)
distance.VE <- distVincentyEllipsoid(p1,p2)
Warning message: In cbind(p1[, 1], p1[, 2], p2[, 1], p2[, 2], as.vector(a), as.vector(b), : number of rows of result is not a multiple of vector length > (arg 3)

非常感谢任何帮助!

使用数据的简化示例(您实际使用的数据会导致此问题)。您找到的负值实际上是零。

几乎可以肯定是你的预处理。也许在这里:

df2 <- with(df2, df2[AvgHDOP <=2 & (AvgAlt >=0 & AvgAlt <=75),])

应该是

df2 <- df2[AvgHDOP <=2 & (AvgAlt >=0 & AvgAlt <=75),]

虽然我不确定这在这里是否重要。

这是一个简单的可重现示例,您可以使用它来更好地说明您的问题。

library(geosphere)

set.seed(0)
long <- 360*runif(10)-180
lat <- 180*runif(10)-90
p1 <- cbind(long, lat)

long.prev <- c(NA,long[1:(length(long)-1)])
lat.prev <-  c(NA,lat[1:(length(lat)-1)])
p2 <- cbind(long.prev, lat.prev)

distance <- distGeo(p1, p2)
round(distance / 1000)