Suivi de colis

#géolocalisation #cartographie_automatique #visualisation #méthodologie #mondialisation

30 août 2014

 

Visionscarto a acheté un serveur informatique. « Designed in California », mais le distributeur européen d’Apple est à Cork, en Irlande, et l’appareil est fabriqué en Chine. Quant à la livraison, nous disposons d’un numéro de suivi, et d’une page Web qui nous permet de savoir « en temps réel » où se trouve notre colis. C’est donc l’occasion de tenter un petit exercice cartographique... en ligne de commande.

Pour cet exercice, nous avons choisi de tout programmer : récupération des données et géocodage, tout doit être automatisé à travers un script.

Voici le résultat, que nous détaillons plus bas.

#! /bin/bash
bon=$1
(
 echo "stage,time,place,lat,lon" &&
 (
   lynx -dump "http://www.tnt.fr/public/suivi_colis/recherche/visubontransport.do?bonTransport=$bon" \
      | sed 's/^\(.*\) \([0-9][0-9].[0-9][0-9].2014 ..:..\) \(.*\)/\1,\2,\3/' \
          2>/dev/null \
      | grep "/201[0-9] "
 ) \
 | while read i
 do
   j=`echo $i | awk -F, '{print $3}'`
   echo $i,`geotools --no-ansi geocoder:geocode "$j"`
 done
)

(Télécharger.)

En lançant cette commande dans le Terminal, on obtient, au format csv, la liste géocodée des étapes (liste à laquelle on rajoute l’Irlande et la Silicon Valley « à la main ») :

stage,time,place,lat,lon
Import reçu ,26/08/2014 10:23,Tours,47.394144, 0.68484
En cours d'acheminement,26/08/2014 07:03,Rennes,48.117266, -1.6777926
En cours d'acheminement,26/08/2014 03:46,Liege Euro Hub,50.6325574, 5.5796662
En cours d'acheminement,25/08/2014 21:56,Arnhem,51.9851034, 5.8987296
En cours d'acheminement,25/08/2014 20:23,Arnhem Hub,51.9851034, 5.8987296
En cours d'acheminement,25/08/2014 15:14,Arnhem Hub,51.9851034, 5.8987296
En cours d'acheminement,23/08/2014 10:02,Hong Kong,22.396428, 114.109497
En cours d'acheminement,22/08/2014 19:42,Shenzhen,22.543099, 114.057868
Distribution,-,Hollyhill Cork Ireland,51.91115, -8.59441
Conception,-,1 infinite Loop California,37.331741, -122.0303329

Il suffit alors de copier/coller cette liste dans un outil comme http://mapbox.github.io/csv2geojson/ pour obtenir rapidement une carte.

PNG - 726.2 ko

Que voit-on ? La mondialisation à l’œuvre, puisque pas moins de six pays sur trois continents sont impliqués dans cette livraison. Un zoom sur Shenzhen (où se trouve l’entreprise Foxconn qui fabrique les machines) montre le passage du monde oriental au monde occidental, de Shenzhen à Hong Kong.

PNG - 913 ko

(Nous avons aussi expérimenté pour l’occasion le site storymap, qui permet de faire des cartes animées en téléchargeant un fichier csv de données géo- et time-codées ; cependant, comme le résultat brut de décoffrage n’est guère satisfaisant.)

Autre leçon à tirer : avec les bons outils il est relativement aisé d’extraire de l’information pour la traiter et produire des cartes de façon automatique.

Pour aller au-delà, il faudrait refaire cette carte en indiquant la nature des étapes : en Californie, le design ; à Cork, la finance (et l’optimisation fiscale !) ; en Chine, la fabrication ; ailleurs, le transport et la consommation. Chaque point a une « valeur » différente.

↬ Philippe Rivière.

Fonctionnement du script

Le script est appelé depuis le Terminal par la commande :

./track.sh 787096848

Notre script commence par enregistrer dans la variable $bon le numéro de suivi du colis, passé en argument :

bon=$1

Affiche la ligne de description des champs du fichier CSV :

echo "stage,time,place,lat,lon"

Avec lynx, un navigateur en mode texte, le script se connecte sur la page web du transporteur avec ce numéro (L’option -dump de l’outil permet de récupérer la page web au format texte) :

lynx -dump "http://www.tnt.fr/public/suivi_colis/recherche/visubontransport.do?bonTransport=$bon"

Avec sed et grep, on extrait uniquement les lignes contenant l’information souhaitée :

| sed 's/^\(.*\) \([0-9][0-9].[0-9][0-9].2014 ..:..\) \(.*\)/\1,\2,\3/' \
  2>/dev/null \
| grep "/201[0-9] "

On envoie chacune de ces lignes dans un outil géocodeur (geotools), qui va récupérer les coordonnées (latitude, longitude) correspondant à chaque nom de lieu :

while read i
do
 j=`echo $i | awk -F, '{print $3}'`
 echo $i,`geotools --no-ansi geocoder:geocode "$j"`
done

Optionnellement, on peut ensuite ajouter une ligne pour convertir le résultat au format GeoJSON :

| csv2geojson

À noter : le script comporte plein de caractères spéciaux, parenthèses, pipes et backslashes — ( ) | \\ —, qui forment la tuyauterie d’Unix ; magie de la ligne de commande, qui permet de créer en quelques instructions une chaîne complète de traitement de l’information.

(Télécharger le script.)

Installation des outils

L’installation de ces outils en ligne de commande n’est pas toujours simple ; sur Mac OS X, il est recommandé d’utiliser Macbrew, ce qui permet souvent d’installer un outil en lançant la commande (par exemple) brew install lynx.

Pour geotools, nous avons eu quelques difficultés à l’installation : il a fallu passer par une installation sur Linux puis le recopier sur le Mac, ce qui n’est pas très aisé. À reproduire…

csv2geojson s’installe pour sa part via la commande npm install -g csv2geojson.

#Apple #Foxconn #transport #brew #géocodage #geotools #geojson