Расстояние между точками в файле GPX становится слишком большим - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу проанализировать пройденное расстояние на основе треков 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 - это только широта и долгота из строки ниже.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, и если вы посмотрите на описание его трека, оно должно быть 787m , а не 1266m какя получил.Это не уникально для этого трека, но для всех треков, на которые я смотрел.Когда я делаю это, они все выходят на 30-50% слишком долго.

Одна причина, которая может быть причиной, состоит в том, что есть только 5 десятичных знаков для латов / дол.В CSV есть 6 десятичных знаков, но я вижу только 5, когда открываю его в Rstudio.Я думал, что это было просто форматирование, чтобы было легче читать и что "целое" число было там, но, возможно, нет?Тип широты / долготы: double.

Почему мои расстояния намного больше, чем те, которые указаны на сайте, с которого я получил gpx-файл?

1 Ответ

0 голосов
/ 11 ноября 2018

У вас пара проблем в вашем коде выше. Функция distHaversine является векторизованной функцией, поэтому вы можете избежать оператора loop / apply. Это значительно улучшит производительность.

Наиболее важным является то, что в пакете геосферы первая координата равна долгота , а не широта.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...