Cette question a été posée précédemment mais jamais avec la disposition suivante des données. Voici un exemple de celui-ci:
> 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
Comme vous pouvez le voir, j'ai une colonne Date et heure [Local]
où les positions GPS sont enregistrées toutes les 4 minutes sur moyenne. Je souhaite calculer la distance (en mètres) entre deux enregistrements consécutifs et stocker cette mesure dans une nouvelle colonne Step
. J'ai essayé d'implémenter distm ()
à mes données:
> 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
Bien que je ne sois pas sûr de la syntaxe et si c'est le bonne façon de remplir les arguments de la fonction. Je suis très nouveau dans R donc j'espère pouvoir obtenir de l'aide.
Toute contribution est appréciée!
3 Réponses :
Je pense que vous y êtes déjà presque. En supposant que vous souhaitiez stocker la distance entre l'enregistrement précédent ( n
) et l'enregistrement actuel ( n + 1
) à n + 1
, vous pouvez use:
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]
Cela donne le premier résultat 0, le reste comme la distance entre les points consécutifs
Si vous regardez la documentation de la fonction, vous verrez:
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
x longitude / latitude du (des) point (s). Peut être un vecteur de deux nombres, une matrice de 2 colonnes (la première est la longitude, la seconde est la latitude) ou un objet SpatialPoints *
y Identique à x. S'il manque, y est identique à x
Cela signifie que vous pouvez utiliser à la fois une matrice ou un vecteur.
Une approche pourrait être:
library(geosphere) ?distm
solution utilisant sf
-package
exemple de données
# 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
code
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)
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)