【问题标题】:Distance across multiple GPS points跨多个 GPS 点的距离
【发布时间】:2016-02-07 15:27:37
【问题描述】:

我对 R 比较陌生。 我正在沿着 GPS 点创建一条线的曲折指数,但为了解决这个问题,我正在尝试为我的纬度和经度数据计算点 n 和 n+10 点之间的距离。

我已经使用 distanceTrack 来计算序列中每个点之间的距离:

lat<-data$Latitude
long<-data$Longitude

distanceTrack(lat,long)

但我想知道是否有其他方法可以超过 10 步?

我尝试使用另一种方法,使用 sp 包和 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))

但此更改返回我的下标超出范围。 我想知道是否有人可能知道如何在这方面取得进展? 感谢您提供的任何帮助!

【问题讨论】:

  • 当然是越界了。当它获得第 (nrow(gpsdat)-5) 行时会发生什么?
  • 嗨迈克尔 - 我不确定我会如何增加界限?如果这是一个愚蠢的问题,我很抱歉,但我正在研究我仍在学习的东西,我真的很感激解释?
  • 你不能。您需要限制循环,使其仅在 nrow-10 行而不是所有行上运行。

标签: r gps distance


【解决方案1】:

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

为此,在我的示例中,我们将 lat/lon 行移位 5,过滤那些没有 NA 值的行,计算每行的距离并重新分配到原始 data.table 的距离。您可以根据自己的需要改变班次的数量。

我的示例也按 L1 分组,因为它假设不同的 Line-Id。您可以调整分组列或直接省略它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多