L'origine du projet :
Dans le cadre d'un projet tutoré du master de Bioinformatique de Rennes, nous avons mis en place un pipeline d'analyse des mails envoyés par la SFBI durant l'année 2014. Plusieurs modules ont été développés sous la forme de scripts Python, par un ou plusieurs étudiants. Je me chargeais de développer un module capable de générer des cartes à partir des données extraites des mails par d'autres modules. Au cours du développement du module de cartographie j'ai pu développer un module capable à partir de fichiers tabulés de générer deux cartes :
- Une première affichant le nombre de laboratoires dans nos analyses par ville, en distinguant les laboratoires publics des laboratoires privés.
- Une autre carte affichant les thématiques de recherche ville par ville.
Ayant pu développer rapidement ce module, Olivier Dameron, l'un des deux tuteurs, m'a proposé de développer un autre module capable de générer une carte des formations en bioinformatique, en France, en m'inspirant de ce que j'avais développé et en utilisant les données du site jebif.fr.
La technique :
Le script a été développé en Python 2.7, comme l'ensemble du projet.
J'ai testé plusieurs bibliothèques gratuites capables de générer des cartes ; finalement mon choix s'est porté sur Folium, un module gratuit capable de générer des cartes interactives en s'appuyant sur leaflet, une librairie JavaScript. Folium s'est avéré très souple à l'usage car ne nécessitant pas d'autres modules. La carte générée est sous la forme d'un fichier HTML qui contient toutes les données affichées sans avoir besoin des fichiers sources.
Le principal problème est que le module a besoin des coordonnées GPS pour placer un point. Or dans ce script comme dans le projet, la seule indication géographique à ma disposition est la ville. Pour passer de l'un à l'autre, j'ai utilisé une base de données trouvée sur le site GeoNames, qui répertorie les coordonnées GPS des villes de plus de 1000 habitants dans le monde. Un grand nombre d'autres données sont fournies mais ne m'ont pas été utiles ici. Un script Python m'a permis d'extraire les données et de générer un dictionnaire des coordonnées GPS. Pour cette carte j'ai utilisé une version simplifiée en ne prenant en compte que la France. À partir du nom de la ville, le script a pu accéder à la latitude et la longitude. Dans le dictionnaire, le nom de la ville sert de clé pour retrouver les coordonnées. Le dictionnaire a été enregistré dans un fichier via la librairie pickle et est disponible sur le gitHub sous le nom "DicoPosit.txt".
La source des données pour le script est un fichier csv contenant le nom de la ville, le nom de la formation et le lien html vers la page correspondante sur le site JeBiF.fr. Ce fichier a été généré à la main avec libreoffice mais peut être généré manuellement ou automatiquement. Le script a lu ce fichier et a rassemblé les formations par ville dans un dictionnaire puis par type de formation dans des listes contenues dans le dictionnaire.
Ensuite le script a itéré ville par ville, et pour chaque ville sur chaque type de formation. À chaque étape, le script a ajouté un cercle de taille proportionnelle au nombre de formation, d'une couleur différente selon le type de formation (Masters en rouge, DUT en bleu et Licences en vert) et une étiquette s'affichant en cliquant sur le cercle. Le texte de l'étiquette est compatible avec les balises HTML, ce qui a permis ici de générer des hyperliens et de mettre les titres en gras.
1 2 3 4 5 6 7 8 9 10 11 12 |
for ville in listeVille :<br> ListeVilleLicence=[]<br> ListeVilleDUT=[]<br> ListeVilleMatser=[]<br> for formation in dicoFormationVille[ville]:<br> if "Master" in formation[0]:<br> ListeVilleMatser.append(formation)<br> elif "Licence" in formation[0]:<br> ListeVilleLicence.append(formation)<br> elif "DUT" in formation[0]:<br> ListeVilleMatser.append(formation)<br> tag="Matsers : <br>" |
for master in ListeVilleMatser :
lien = creerLien(master[1], master[2])
tag=tag+lien + "<br>"
ajouterPoint(ville, "FR", 5000*len(ListeVilleMatser),tag,"#3ADF00")
Le principal inconvénient est la superposition des données. Si deux cercles sont sur la même ville, ils doivent avoir une taille différente. Pour pallier cela, le script crée un cercle de master plus gros s'il n'y a qu'un Master pour éviter qu'il ne soit recouvert par une autre formation. Si un cercle plus gros est posé sur un cercle de petite taille, alors le petit cercle ne peut pas être sélectionné. L'astuce a été de commencer par dessiner les cercles les plus gros ; ici ce sont systématiquement les Masters.
La carte sera disponible sur le site de JeBiF très prochainement pour illustrer l'annuaire des formations en cliquant sur ce lien.
-Le script est disponible à ce lien : https://github.com/jacklabelette/CartographieJeBif/tree/master
Merci aux nombreux relecteurs de cet article : Yoann M, Mathurin, Nico M, Nolwenn et Estel, merci aux administrateurs de ce blog de m'avoir permis de publier cet article et un grand merci à Olivier Dameron pour m'avoir conseillé de réaliser cette carte et de la publier.
Laisser un commentaire