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