Création d’une matrice de distances routières avec des outils et des données libres (2/2)

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


2 réflexions au sujet de « Création d’une matrice de distances routières avec des outils et des données libres (2/2) »

  1. Bonjour,

    Un grand merci pour les solutions que vous proposez avec des explications très claires et précises.

    Cordialement,
    Toma

  2. 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"

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *