Politimap: Quels députés participent à l'Assemblée?

Posted on Jul 26 - by tetalab

Politimap est afin d'avoir une visualisation, à l'époque, des députés lors de la scéance du 8 décembre 2008 consacrée à la suppression des publicités télévisuelles sur les chaînes publiques.

Cette visualisation a pour but de montrer la participation de chaque député dans l'hémicycle. Pour cela il nous faut:

  1. la position de chaque siège dans l'Hémicycle
  2. le numéro du siège attribué à chaque député
  3. une valeur sur la participation des députés

Le code est disponible pour tous sur github, n'hésitez pas à le copier ou le modifier: http://github.com/alx/politimap

Position des sièges dans l'Hémicycle

Il faut d'abord une image de fond de l'Hémicycle, sur laquelle on extrait les coordonnées de chaques sièges.
Ces coordonnées seront ensuite utilisées pour afficher les données liées à chaque député.

Il y a environ 650 sièges dans l'Hémicycle, avec certains numéro de sièges inexistants.

Pour faciliter le processus, j'ai créé une application graphique très simple, avec le framework Shoes, afin de cliquer sur l'image de l'Hémicycle et avoir les coordonnées de chaque click.

Seatmap

Voici le resultat, après avoir nettoyé la position des points mal placé (la souris n'est pas forcément adapté sur une si petite image):

Position Seats

Vous pourrez retrouver le code de cette application de point&click dans le répertoire "seat_map" du code.

Attribution d'un siège à chaque député

RegardsCitoyens propose un API, de son site NosDéputés, qui contient toutes les infos concernant les députés à l'Assemblée Nationale.

Par contre, pour avoir le siège de chaque député, il faut d'abord demander la liste de tout les députés, puis extraire le numéro du siège de la fiche de chaque député:


def liste_des_sieges

  # Création d'un tableau contenant assez de sièges 
  # pour tous les députés
  sieges = Array.new(650)
  
  # Demande de la liste des députés
  # 
  # La méthode api_json s'occupe de la requète http
  # puis cache sa réponse afin de ne pas la refaire a chaque fois
  depute_list = api_json("http://www.nosdeputes.fr/deputes/json")
  
  # Pour chaque député dans la liste:
  #   - demander les infos du député sur sa fiche
  #   - extraire la place en hemicycle
  #   - s'il a une place attribué, le garder dans le tableau des sièges
  depute_list["deputes"].each do |depute_json|
    depute_info = api_json(depute_json["depute"]["api_url"])["depute"]
    place = depute_info["place_en_hemicycle"].to_i
    sieges[place] = depute_info["nom"] if place > 0
  end
  
  # Retourner le tableau des sièges pour traitement ultérieur
  return sieges
end

Le code ayant servi à cette tâche se trouve dans le répertoire "json_parser" du dépot git.

Récupération de données sur la participation de chaque député

Maintenant que nous connaissons la place de chaque député dans l'assemblée, nous allons rajouter une donnée concernant chaque député sur cette place.

Encore une fois, NosDéputés propose à travers son API une synthèse mois par mois de la participation de chaque député à différentes parties de la vie à l'Assemblée Nationales.

Dans l'exemple proposé du mois d'avril 2010 - http://www.nosdeputes.fr/synthese/201004/xml - nous trouvons ces infos sur le député Lionel Tardy:

<depute>
<id>17</id>
<nom>Lionel Tardy</nom>
<groupe>UMP</groupe>
<amendements_adoptes>9</amendements_adoptes>
<amendements_signes>34</amendements_signes>
<commission_interventions>0</commission_interventions>
<commission_presences>4</commission_presences>
<hemicycle_interventions>49</hemicycle_interventions>
<hemicycle_interventions_courtes>34</hemicycle_interventions_courtes>
<propositions_ecrites>0</propositions_ecrites>
<propositions_signees>2</propositions_signees>
<questions_ecrites>5</questions_ecrites>
<questions_orales>0</questions_orales>
<rapports>0</rapports>
<semaines_presence>2</semaines_presence>
</depute>

Ces infos nous permettent d'attribuer, pour le mois d'avril 2010, une participation de ce député dans l'Hémicycle par exemple.

Nous pouvons ajouter des filtres:

  • sur la date de la synthèse, ou la période des synthèses, à récupérer
  • sur le type d'information à extraire de chaque synthèse

Screen Shot 2011 07 26 At 9.42.37 Pm

Affichage de ces données

Tout ce que nous avons mis en place, avant ce point, peut se faire sous la forme d'un simple script.

Maintenant, nous allons afficher ces données sur une page web, et faire des requètes afin de filtrer les données suivant différents paramètres.

Pour cela nous avons besoin d'une application web, qui traitera ces requètes, demandera à l'API de NosDéputés.fr les informations manquantes, et retournera les données dans un format qui pourra être affiché sur la page web.

Serveur: Sinatra

Dans Politimap, j'ai utilisé Sinatra, un framework d'application en Ruby qui permet de monter rapidement des prototypes d'application web. L'idée du prototypage rapide est d'avoir une idée le matin, qui fonctionne à midi, et qui peut être livrée le soir même.

L'installation de ruby sur un serveur et déploiement d'applications sinatra n'étant pas des plus simples, je n'aborderai que le traitement de la réquète dans l'application. Si cela vous intéresse, Sinatra propose une très bonne introduction sur leur site: http://www.sinatrarb.com/intro

Pour son fonctionnement sur internet, Politimap regroupe tous les outils des points précédents, et renvoit une réponse au visiteur de la page web:

get '/heatmap' do
  # le retour de la requète sera en json
  # afin d'être facilement compris par javascript
  content_type :json
    
  # Extrait les filtres de début et fin
  start_date = Date.parse params[:start_date]
  end_date = Date.parse params[:end_date]

  # Pour chaque mois, on parse la synthèse, 
  # en utilisant le filtre d'info à sélectionner
  current_date = start_date
  while current_date <= end_date
    parse_synthese current_date.strftime("%Y%m").to_i, params[:info]
    current_date = current_date >> 1
  end
  
  # On détermine la valeur maximale dans la totalité des sièges
  max = 0
  $SEATS.each {|seat| max = seat[:count] if seat[:count] && seat[:count] > 0 && max < seat[:count] }

  # Retour du résultat au client
  {:max => max, :data => $SEATS}.to_json
end

Client: Heatmap.js

Pour l'affichage, j'ai utilisé Heatmap.js, une librairie javascript qui permet de visualiser des nuages lumineux suivant l'intensités des points.


// Ajout d'une indication pour signaler que l'image est en train de se rafraichir
$("#heatmapArea").prepend("chargement...");

// Demande au serveur des données filtrées avec la selection de l'utilisateur
$.getJSON("/heatmap", filters, function(map){
    
    // Une fois les données reçu, 
    // il faut les stocker dans le store de heatmap.js afin de les afficher
    heatmap.store.setDataSet(map);
    
    // Et on peut retirer l'indication de chargement
    $("#heatmap_loading").remove();
}

Other Posts