2 – Interrogation de l’API et constitution de la matrice de distance avec R
Le programme R suivant construit la matrice de distance entre une table d’origines et une table de destination. Le format de ces tables doit comprendre un champ d’identifiant et deux champs contenant les longitudes et latitudes des points en WGS84.
NOM | Y | X |
Amiens | 49.887557 | 2.296143 |
Reims | 49.260635 | 4.031982 |
Nancy | 48.698212 | 6.174316 |
Metz | 49.124219 | 6.174316 |
Arras | 50.296358 | 2.757568 |
Dunkerque | 51.034486 | 2.373047 |
Epinal | 48.180739 | 6.448975 |
Lille | 50.632042 | 3.065186 |
Bruxelles | 50.844105 | 4.350586 |
Namur | 50.467995 | 4.86145 |
Liège | 50.642494 | 5.570068 |
Anvers | 51.220647 | 4.389038 |
Gand | 51.05866 | 3.718872 |
Luxembourg | 49.60715 | 6.119385 |
Amsterdam | 52.362183 | 4.87793 |
Rotterdam | 51.923943 | 4.460449 |
Dusseldorf | 51.222368 | 6.764832 |
Cologne | 50.939393 | 6.957092 |
Tilburg | 51.563412 | 5.075684 |
Dortmund | 51.512161 | 7.467957 |
# librairies library(RCurl) library(RJSONIO) # import de données dataOrig<-read.csv("./data/ville.csv",sep=";") dataDest<-read.csv("./data/ville.csv",sep=";") # nombre d'origines et de destination dOrig<-dim(dataOrig)[1] dDest<-dim(dataDest)[1] # creation de la matrice vide req <-matrix(nrow=dOrig,ncol=dDest, dimnames=list(dataOrig$NOM,dataDest$NOM)) # création de la matrice des requêtes à envoyer for (i in 1:dOrig){ for (j in 1:dDest){ req[i,j] <- paste("http://localhost:8989/api/route?point=", paste(dataOrig$Y[i],dataOrig$X[i],sep=","),"&point=", paste(dataDest$Y[j],dataDest$X[j],sep=","), "&locale=fr&instructions=false&calc_points=false",sep="") } } # reception des requêtes result<-apply(X=req,c(1,2),function(x) {try(getURL(URLencode(x) ),silent=TRUE)}) # fonction de parsage des réponses decode<-function(x){ if (class(x)=="character"){ # décodage du résultat de la requête if (length(fromJSON(x)$paths[[1]]>0)){ fromJSON(x)$paths[[1]][1] } else { NA } } else { NA } } mat<-apply(X=result,c(1,2), decode) # passage des milliseconde en minutes mat<-round(mat/(1000*60),0)
La matrice produite indique les temps de trajet en minutes entre les 20 villes.
les données : ville.csv
OpenEdition vous propose de citer ce billet de la manière suivante :
Timothée Giraud (9 mai 2014). Création d’une matrice de distances routières avec des outils et des données libres (2/2). R Géomatique. Consulté le 9 décembre 2024 à l’adresse https://doi.org/10.58079/tp2z
Je vous remercie pour l’article.
J’ai rencontré un problème au niveau
“mat<-apply(X=result,c(1,2), decode)"
J'ai cette erreur: "Error in fromJSON(x)$paths : $ operator is invalid for atomic vectors"
Est ce que c'est arrivé à quelqu'un d'autre aussi??
Bonjour,
Un grand merci pour les solutions que vous proposez avec des explications très claires et précises.
Cordialement,
Toma
Très grand merci Timothée pour ce post et le code, que l’on a pu reprendre et adapter avec succès sur une matrice de ~3000 x 3000 communes!
Petits commentaires sur des possibles coquilles du code R:
– Dans l’adresse de notre serveur local, l’adresse était en fait plus courte, sans le
/api/
, ce qui donne"http://localhost:8989/route?point="
– Pour le parsage des *temps* de parcours, plutôt indiquer le 3e élément du JSON que le 1er (qui étaient dans notre cas les distances):
'fromJSON(x)$paths[[1]][3]'
Pour l’installation du serveur Graph Hopper sur des machines Windows 7, il nous avait fallu quelques adaptations:
1. L’URL pour une des bibliothèques n’était pas la bonne (mauvaise version et/ou mauvais serveur?). On édite alors dans le script ‘graphhopper.sh’:
# "No Maven found in the PATH. Now downloading+installing it to ./maven
# "--2015-01-09 18:08:09-- http://apache.websitebeheerjd.nl/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.zip
2. Pour éviter un plantage avec Javac, il faut préalablement définir la variable JAVA_HOME, avec un chemin comme ‘C:\Program Files\Java\jdk1.8.0_25’
Avec Java Development Kit préalablement téléchargé et installé, ne pas oublier les guillemets sur le chemin du JDK. Cela donne sous Cygwin:
export JAVA_HOME="/cygdrive/c/Program Files/Java/jdk1.8.0_25"
ls "$JAVA_HOME"