在应用滤波器后,在R中计算距离 - 包括负值

时间:2015-12-13 14:20:26

标签: r distance

我希望有人可以告诉我哪里出错了......我正在尝试计算一个点与前一行之间的距离;位置是纬度/经度,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) 

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

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),])

然而,一旦我这样做,距离计算就不再适用了。相反,我得到奇数/不正确的值,包括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?

我确实得到了一些错误消息(所有这些都是由于最初的NAs,我相信),但是我在第一种情况下得到了相同的错误,它可以正常工作,而第二种情况则会给我带来奇怪的结果。

  
    

p2&lt; - SpatialPointsDataFrame(df2 [c(&#34; Long.prev&#34;,&#34; Lat.prev&#34;)],data = data.frame(id = df2 $ Animal), proj4string = CRS(&#34; + PROJ = longlat     +基准= WGS84&#34))
    .local(obj,...)中的错误:坐标中的NA值     距离&lt; - distGeo(p1,p2)
    警告消息:在cbind(p1 [,1],p1 [,2],p2 [,1],p2 [,2])中:结果的行数不是向量长度的倍数(arg 3)
    distance.VE&lt; - distVincentyEllipsoid(p1,p2)
    警告消息:在cbind(p1 [,1],p1 [,2],p2 [,1],p2 [,2],as.vector(a),as.vector(b)中,:结果行数不是矢量长度的倍数&gt;(arg 3)

  

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

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

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

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)