Projets

[MP04c] Libère les données... Opendata !

Objectifs :

Récupérer les données sur l'opendata de la ville de Rennes.

Traiter les données et les mettre en forme.

Critères d'évaluation :

C1.2 Détailler le déroulement d'une communication numérique, ...

C2.2 Structurer une formule logique, des données,...

C2.3 Développer une interface logicielle,...

Lectures et travail demandés :

INTRODUCTION

Définition d'OpenData :

L’OpenData c’est rendre accessible au citoyen les données publiques, dans le cadre des grandes métropoles, des gouvernements, et des organismes publics de recherche. L'objectif est de développer des applications innovantes, d’améliorer les services et de créer de « la croissance » économique. C’est aussi une façon d’assurer la transparence publique.

Des exemples d'Opendata :

Les exemples les plus connus sont ceux des gouvernements américain et britannique (avec leur data.gov), et des grandes métropoles comme New York, San Francisco, Londres, Vancouver. Les institutions ont ainsi rendu accessibles de nombreuses données (transports en communs, vélos, bureaux de vote, accessibilité des stations de métro, travaux en cours, etc.), qui sont utilisées aux travers d’applications innovantes (pour trouver un taxi, ou un quartier qui bouge, ...). En France, l’Open Data se met en place doucement. Rennes est la ville précurseur en la matière, avec depuis mars 2010 l’ouverture des données de l’opérateur de transport en commun Keolis Renne. D’autres villes semblent vouloir suivre le mouvement d’ouverture des données publiques, comme à Paris et Nantes.

Utilisation de l'Open data de Rennes :

La ville de Rennes met à disposition un certains nombres de données accessibles directement à l'aide d'une requête transmise sur le serveur de la ville (toutes les requêtes sont décrites dans la documentation de l'API "Application Programming Interface" du site). Pour envoyer nos requêtes et récupérer puis traiter les données nous allons utiliser une fois de plus Processing.

Inscription sur le site :

Pour pouvoir interroger la base de données, il faut s'inscrire sur le site : http://data.keolis-rennes.com/

Puis obtenir une clé d'application en remplissant un petit formulaire

Accès à la base de données

Avec la clé d'application créée, nous allons écrire un petit programme avec Processing 1.5 . Ce programme va venir se connecter au service pour l’interroger à l'aide d’une adresse internet (ou URL) constituée de plusieurs éléments dont notre clé et la commande de la requête. Il existe un certains nombres de commandes dédiées par services (informations sur les vélos, métros, … voir liste sur le site). Il faut aussi indiquer le numéro de version de l'API utilisée.

La requête s’effectue en une seule instruction avec Processing : loadStrings. Cette dernière nous renvoie un tableau de chaîne de caractères (String), chaque entrée de ce tableau correspondant à une ligne de la réponse donnée par l’API de la ville de Rennes. Cette réponse nous est fournie au format XML et nous allons dans un premier temps simplement l’imprimer sur la console de Processing.

String keolisCle = "LNVIWRQ9N5V76HX";
String keolisCommande = "getbikestations";
String keolisVersion = "2.0";

void setup() 
{
  // Addresse à laquelle nous allons accéder aux données
  String url = "http://data.keolis-rennes.com/xml/?version="+keolisVersion+"&key="+keolisCle+"&cmd="+keolisCommande;
  
  // Connexion à l'API et chargement des données avec la clé et la commande
  String lines[] = loadStrings(url);
  // Impression du résultat sur la console
  for (int i=0;i<lines.length;i++)
    println(lines[i]);
}
void draw() 
{
  // On ne dessine rien pour l'instant
}

Voici le résultat obtenu dans la fenëtre console de Processing :

Interprétation des données

Plutôt que d’utiliser la fonction loadStrings, nous allons utiliser les fonctionnalités de Processing dédiées à l'interprétation du format XML. Ansi seule la fonction d’appel et le format du résultat changent :

XMLElement xml = new XMLElement(this, url);

En analysant la réponse renvoyée, nous constatons la répétition de l'élément <station>, chacun de ces noeuds contenant des informations relatives à une station. Voici un extrait de la réponse :

Nous allons d’abord récupérer simplement le nombre de stations de vélo de Rennes, ce nombre étant directement liés au nombre de noeuds <station>. Grâce à Processing qui permet de traiter les données XML, nous allons stocker dans un tableau de XMLElement tous les noeuds <station>.

XMLElement[] stations = xml.getChildren("answer/data/station"); int nombreStations = stations.length;

Nous allons accéder à présent aux données du premier noeud (de la première station) : le numéro, le nom, l’adresse, la latitude et la longitude pour la géolocalisation, le nombre de vélos disponibles (noeud fils <bikesavailable>) et le nombre d'emplacements disponibles (noeud fils <slotsavailable>).

XMLElement numeroXML = stationsXML[1].getChild("number");
String numero1 = numeroXML.getContent();

Voici un exemple de code :

String keolisCle = "LNVIWRQ9N5V76HX";
String keolisCommande = "getbikestations";
String keolisVersion = "2.0";

int nombreStations=0;
String numero1;
PFont maFonte;

void setup() 
{
  // Dimension de la fenêtre
  size(600,600);
  // On charge notre fonte
  maFonte = loadFont("Geneva-70.vlw");
  textFont(maFonte,20);
  // Addresse à laquelle nous allons accéder aux données
  String url = "http://data.keolis-rennes.com/xml/?version="+keolisVersion+"&key="+keolisCle+"&cmd="+keolisCommande;
  
  // Plus simple que la méthode loadStrings, nous allons directement
  // charger les données dans un objet permettant de lire le XML
  XMLElement xml = new XMLElement(this, url);
  
 // On est prêt à analyser les données à présent
  // Nous accèdons d'abord aux noeuds <station>
   XMLElement[] stations = xml.getChildren("answer/data/station");
  
 // Nous stockons ce nombre de noeuds <station>, qui correspond au nombre de stations vélos de la ville de Rennes
  nombreStations = stations.length;

 // Nous pouvons ensuite extraire les données du premier noeud, c'est à dire la station n°1
  XMLElement numero1XML = stations[1].getChild("number");
  numero1 = numero1XML.getContent();
}

void draw() 
{
  background(255);
  fill(0);
  textFont(maFonte,20);
  text("nombre de stations de vélos à rennes :",0,20);
  fill(0,0,255);
  textFont(maFonte,20);
  text(nombreStations,400,20);
  fill(0);
  text("station n°:",0,120,150,25);
  fill(0,0,255);
  text(numero1,150,120,300,25);  
}

[P] A partir de l'exemple ci-dessus, réaliser une application de votre choix mettant en oeuvre les données disponibles sur l'opendata de Rennes. Imaginer une représentation graphique des données.

Ressources :

Opendata Nantes :

[+] http://data.nantes.fr/api/

Librairie de cartographie pour processing :

[+] http://unfoldingmaps.org/