我对R来说比较新。 我正在努力创建沿着GPS点的线的曲折度指数,但为了解决这个问题,我试图计算点n和n + 10点之间的距离,用于我的纬度和经度数据。 / p>
我已经使用distanceTrack来计算系列中每个点之间的距离:
lat<-data$Latitude
long<-data$Longitude
distanceTrack(lat,long)
但是我想知道是否有一个替代方案可以超过10个步骤吗?
我尝试使用另一种使用sp package和spDistsN1的方法来获取连续点之间的距离:
coordinates(gpsdat)<-~Longitude+Latitude
proj4string(gpsdat)<-CRS("+proj=longlat +datum=WGS84")
dist<-sapply(seq_along(gpsdat[-1,]), function(i)
spDistsN1(pts=gpsdat[i,],pt=gpsdat[i+1,],longlat=TRUE))
我想我可以简单地改变一些脚本,所以它是:
dist<-sapply(seq_along(gpsdat[-1,]), function(i)
spDistsN1(pts=gpsdat[i,],pt=gpsdat[i+10,],longlat=TRUE))
但是这个改变会返回我的下标超出范围。 我想知道是否有人可能知道如何推进这个? 感谢您提供的任何帮助!
答案 0 :(得分:0)
您可以在不使用data.table
和geosphere
的应用或循环结构的情况下执行此操作。
为此我们在我的示例中将纬度/经度行移动 5,过滤,那些没有NA值,计算每行的距离和重新分配到原始data.table的距离。你可以改变你想要的班次。
我的例子也按L1分组,因为它假设不同的Line-Ids。您可以调整分组列或只是省略它。
library(data.table)
library(geosphere)
## Data
points = data.table(
id = 1:20,
lon = seq(11, 30, 1),
lat = seq(51, 70, 1),
L1 = rep(seq(1,2,1), each=10)
)
## Shift Rows
points[, c("next_id", "next_lon", "next_lat") := data.table::shift(.SD, 5, NA, "lead"),
.SDcols=c("id","lon","lat"), by = L1];
## Filter NA values
points_not_NA = points[!is.na(points$next_lon),]
## Get Distance
distRes <- distCosine(as.matrix(points_not_NA[,c("lon","lat")]),
as.matrix(points_not_NA[,c("next_lon","next_lat")]))
## Assign initial value for distance
points$dist <- 0
## Assign resulting distance to filtered table
points[!is.na(points$next_lon),]$dist <- distRes
points
> points id lon lat L1 next_id next_lon next_lat dist 1: 1 11 51 1 6 16 56 647237.8260 2: 2 12 52 1 7 17 57 643248.9003 3: 3 13 53 1 8 18 58 639283.2756 4: 4 14 54 1 9 19 59 635346.2618 5: 5 15 55 1 10 20 60 631443.2317 6: 6 16 56 1 NA NA NA 0.0000 7: 7 17 57 1 NA NA NA 0.0000 8: 8 18 58 1 NA NA NA 0.0000 9: 9 19 59 1 NA NA NA 0.0000 10: 10 20 60 1 NA NA NA 0.0000 11: 11 21 61 2 16 26 66 609045.7607 12: 12 22 62 2 17 27 67 605534.8132 13: 13 23 63 2 18 28 68 602102.1704 14: 14 24 64 2 19 29 69 598753.3917 15: 15 25 65 2 20 30 70 595494.0003 16: 16 26 66 2 NA NA NA 0.0000 17: 17 27 67 2 NA NA NA 0.0000 18: 18 28 68 2 NA NA NA 0.0000 19: 19 29 69 2 NA NA NA 0.0000 20: 20 30 70 2 NA NA NA 0.0000