Расчет расстояния между двумя местоположениями GPS в кадре данных с использованием distm () в R - PullRequest
4 голосов
/ 18 марта 2019

Этот вопрос задавался ранее, но никогда со следующим расположением данных.Ниже приведен пример этого:

> head(datagps)
   Date & Time [Local]  Latitude Longitude
1: 2018-06-18 03:01:00 -2.434901  34.85359
2: 2018-06-18 03:06:00 -2.434598  34.85387
3: 2018-06-18 03:08:00 -2.434726  34.85382
4: 2018-06-18 03:12:00 -2.434816  34.85371
5: 2018-06-18 03:16:00 -2.434613  34.85372
6: 2018-06-18 03:20:00 -2.434511  34.85376

Как видите, у меня есть столбец Date & Time [Local], где позиции GPS регистрируются в среднем каждые 4 минуты.Я хотел бы рассчитать расстояние (в метрах) между двумя последовательными записями и сохранить эту меру в новом столбце Step.Я пытался реализовать distm() для моих данных:

> datagps$Step<-distm(c(datagps$Longitude, datagps$Latitude), c(datagps$Longitude+1, datagps$Latitude+1), fun = distHaversine)
Error in .pointsToMatrix(x) : Wrong length for a vector, should be 2

Хотя я очень не уверен в синтаксисе и в том, является ли это правильным способом для заполнения аргументов функции.Я очень плохо знаком с R, поэтому я надеюсь, что смогу помочь.

Любой вклад приветствуется!

Ответы [ 3 ]

2 голосов
/ 18 марта 2019

Если вы посмотрите документацию функции, то увидите:

library(geosphere)
?distm

x долгота / широта точки (с). Может быть вектором из двух чисел, матрицей из 2 столбцов (первый - долгота, второй - широта) или объект SpatialPoints *

y То же, что и x. Если отсутствует, у совпадает с х

Это означает, что вы можете использовать как матрицу, так и вектор.

Один из подходов может быть:

res <- distm(as.matrix(df1[,c("Longitude","Latitude")]), fun = distHaversine)

res

#         [,1]     [,2]     [,3]     [,4]     [,5]     [,6]
#[1,]  0.00000 45.90731 32.15371 16.36018 35.16947 47.35305
#[2,] 45.90731  0.00000 15.29559 30.09289 16.76621 15.60347
#[3,] 32.15371 15.29559  0.00000 15.81292 16.79079 24.84658
#[4,] 16.36018 30.09289 15.81292  0.00000 22.62521 34.40483
#[5,] 35.16947 16.76621 16.79079 22.62521  0.00000 12.19500
#[6,] 47.35305 15.60347 24.84658 34.40483 12.19500  0.00000
2 голосов
/ 18 марта 2019

Я думаю, ты уже почти там. Предполагая, что вы хотите сохранить расстояние между предыдущей записью (n) и текущей записью (n+1) в n+1, вы можете использовать:

library(geosphere)
date <- c("2018-06-18 03:01.00","2018-06-18 03:06.00","2018-06-18 03:08.00","2018-06-18 03:12.00","2018-06-18 03:16.00","2018-06-18 03:20.00")
latitude <- c(-2.434901,-2.434598,-2.434726,-2.434816,-2.434613,-2.434511)  
longitude <- c(34.85359,34.85387,34.85382,34.85371,34.85372,34.85376)
datagps <- data.frame(date,lat,lon)

datagps$length <- distm(x=datagps[,2:3], fun = distHaversine)[,1]

Это дает первый результат 0, остальное как расстояние между последовательными точками

1 голос
/ 18 марта 2019

решение с использованием sf -пакета

образец данных

library(data.table)
dt1 <- data.table::fread( 'DateTime, Latitude, Longitude
2018-06-18 03:01:00, -2.434901,  34.85359
2018-06-18 03:06:00, -2.434598,  34.85387
2018-06-18 03:08:00, -2.434726,  34.85382
2018-06-18 03:12:00, -2.434816,  34.85371
2018-06-18 03:16:00, -2.434613,  34.85372
2018-06-18 03:20:00, -2.434511,  34.85376')

setDF(dt1)

код

library(sf)
#create spatial points object
dt1.sf <- st_as_sf( x= dt1, 
                    coords = c("Longitude", "Latitude"),
                    crs = "+proj=longlat +datum=WGS84")
#calculate distances
st_distance(dt1.sf)

выход

# Units: [m]
#          [,1]     [,2]     [,3]     [,4]     [,5]     [,6]
# [1,]  0.00000 45.74224 32.07520 16.32379 34.97450 47.08749
# [2,] 45.74224  0.00000 15.20702 29.96245 16.76520 15.56348
# [3,] 32.07520 15.20702  0.00000 15.77068 16.72801 24.69270
# [4,] 16.32379 29.96245 15.77068  0.00000 22.47452 34.18116
# [5,] 34.97450 16.76520 16.72801 22.47452  0.00000 12.12446
# [6,] 47.08749 15.56348 24.69270 34.18116 12.12446  0.00000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...