GPX文件中的点之间的距离过大

时间:2018-11-11 20:19:00

标签: r gpx geosphere

我想分析基于GPS轨迹的行进距离,但是当我计算距离时,它总是太大。

我使用python创建一个轨迹中所有点的经度和纬度的csv文件,然后使用R对其进行分析。数据框如下所示:

|      lat|      lon|   lat.p1|   lon.p1| dist_to_prev|
|--------:|--------:|--------:|--------:|------------:|
| 60.62061| 15.66640| 60.62045| 15.66660|    28.103099|
| 60.62045| 15.66660| 60.62037| 15.66662|     8.859034|
| 60.62037| 15.66662| 60.62026| 15.66636|    31.252373|
| 60.62026| 15.66636| 60.62018| 15.66636|     8.574722|
| 60.62018| 15.66636| 60.62010| 15.66650|    17.787905|
| 60.62001| 15.66672| 60.61996| 15.66684|    14.393267|
| 60.61996| 15.66684| 60.61989| 15.66685|     7.584996|
...

我可以在此处发布整个数据帧以提高可重复性,它只有59行,但是我不确定在此处发布大块数据的礼节吗?让我知道如何最好地共享它。

lat.next和lon.next只是下面一行中的lat和lon。 dist_to_prev是使用distm()从地层计算得出的:

library(geosphere)
library(dplyr)

df$dist_to_prev <- apply(df, 1 , FUN = function (row) { 
   distm(c(as.numeric(row["lat"]), as.numeric(row["lon"])), 
         c(as.numeric(row["lat.p1"]), as.numeric(row["lon.p1"])),
   fun = distHaversine)})

df %>% filter(dist_to_prev != "NA") %>% summarise(sum(dist_to_prev))

# A tibble: 1 x 1
`sum(dist_to_prev)`
            <dbl>
1           1266.

我以Trailforks and if you look at their track description it should be 787m中的这个曲目为例,而不是我得到的1266m。这不是本曲目的唯一内容,而是我看过的所有曲目的唯一内容。当我这样做时,它们都出来的时间太长了30-50%。

可能的原因之一是纬度/经度只有5个小数位。 csv中有6个小数位,但是当我在Rstudio中打开它时,我只能看到5个小数位。我以为它只是格式化以使其更易于阅读,并且“整个”数字在那里但也许没有?纬度/经度的类型为:双。

为什么我的距离比我从gpx文件得到的网站上显示的距离大?

1 个答案:

答案 0 :(得分:1)

上面的代码中有几个问题。函数distHaversine是向量化函数,因此您可以避免使用loop / apply语句。这将大大提高性能。

最重要的是与Geosphere软件包一起使用时,第一个坐标是经度,而不是纬度。

df<- read.table(header =TRUE, text=" lat      lon   lat.p1   lon.p1
60.62061 15.66640 60.62045 15.66660
60.62045 15.66660 60.62037 15.66662
60.62037 15.66662 60.62026 15.66636
60.62026 15.66636 60.62018 15.66636
60.62018 15.66636 60.62010 15.66650
60.62001 15.66672 60.61996 15.66684
60.61996 15.66684 60.61989 15.66685")


library(geosphere)

#Lat is first column (incorrect)
distHaversine(df[,c("lat", "lon")], df[,c("lat.p1", "lon.p1")])
#incorrect
#[1] 28.103099  8.859034 31.252373  8.574722 17.787905 14.393267  7.584996

#Longitude is first (correct)
distHaversine(df[,c("lon", "lat")], df[,c("lon.p1", "lat.p1")])
#correct result.
#[1] 20.893456  8.972291 18.750046  8.905559 11.737448  8.598240  7.811479