多个GPS点的距离

时间:2015-11-06 13:07:42

标签: r gps distance

我对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))

但是这个改变会返回我的下标超出范围。 我想知道是否有人可能知道如何推进这个? 感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

您可以在不使用data.tablegeosphere的应用或循环结构的情况下执行此操作。

为此我们在我的示例中将纬度/经度行移动 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