Skip to Content

Nous adressons toutes nos pensées à la famille de notre ami Jérôme !

http://www.forumsig.org/showthread.php/43488-Disparition-de-Phoenix

Python : Comment convertir les graphiques obtenus avec le module matplotlib en cartes interactives simples Leaflet (avec le module mplleaflet)

Niveau Intermédiaire
Logiciels utilisés Python
matplotlib (module Python)
mplleaflet (module Python)
Plateforme Windows | Mac | Linux | FreeBSD

Après avoir vu comment convertir les graphiques matplotlib en fichiers shapefiles, examinons maintenant comme les transformer en carte interactive Leaflet. Cela se fait directement avec le module mplleaflet.

Je vais l’illustrer ici avec le module Python GeoPandas (voir Python à finalité géospatiale: pourquoi débuter avec le module ogr alors qu’il existe des alternatives plus simples et plus didactiques ?) pour traiter les fichiers shapefiles.

Mais, comme d’habitude, je vais vous ouvrir l’appétit avec un exemple concret d’application puis je fournirai des explications.

Exemple concret

Le script, très simple, est:

import geopandas
# lecture du fichier shapefile
couche = geopandas.GeoDataFrame.from_file('varisque.shp')
# changement de projection puisque LeafLet ne marche qu’avec les coordonnées WGS84
coucheWGS84 = couche.to_crs(epsg=4326)
import mplleaflet
ax = coucheWGS84.plot()
mapfile = 'montest.html'
mplleaflet.show(fig=ax.figure, crs=coucheWGS84.crs, path=mapfile)


Le résultat est (la carte est visible sur le fichier résultant montest.html)

 

Explication

Où est matplotlib là dedans ? Si je détaille la procédure:

import geopandas
# lecture du fichier shapefile
couche = geopandas.GeoDataFrame.from_file('varisque.shp')
# changement de projection puisque LeafLet ne marche qu’avec les coordonnées WGS84
coucheWGS84 = couche.to_crs(epsg=4326)
import mplleaflet
import matplotlib.pyplot as plt
ax = coucheWGS84.plot()
# visualisation avec matplotlib
plt.show()

Le résultat de matplotlib est:

C’est donc la figure maplotlib ax = coucheWGS84.plot() qui est transformée par mplleaflet au format GeoJSON (il suffit de regarder dans le fichier résultant) et superposée sur un fond OpenStreetMap ici.

Pour aller plus loin

Le module est clairement destiné à être utilisé directement dans un Notebooks Jupyter/IPython (avec mplleaflet.display au lieu de show()) et il y a moyen de:

  • représenter plusieurs couches à la fois:

La plupart des commandes matplotlib peuvent être utilisées comme contour(), vue précédemment:

ou streamplot():

Conclusions

Le seul petit défaut est qu'il n’y a pas moyen de créer d'« enjolivures ». Ce n’est pas trop difficile de les rajouter par la suite, mais ce n’est plus du Python.

Quelles sont les alternatives ?

  • en Python, il y a le module Folium, présenté sur le Portail dans Python + Leaflet = Folium, ou comment créer des cartes interactives simplement. Il n’a rien à voir avec matplotlib et permet  beaucoup plus de choses à partir des géométries au format GeoJSON;
  • avec QGIS, vous avez les plugins (écrits en Python) qgis2web et QGIS2leaf qui offrent beaucoup plus d’alternatives de « mise en page », d’utilisation de fonds de cartes différents ou la possibilité d’utiliser OpenLayers comme alternative (pour le premier).

Maintenant, vous savez comment utiliser les commandes de matplotlib et transformer les résultats graphiques en fichiers shapefiles ou en cartes interactives simples Leaflet.

Tous les traitements présentés ont été effectués sur Mac OS X avec Python 2.7.11 et matplotlib 1.4.x et 1.5.x

Site officiel : Leaflet
Autres Liens : Les notebooks IPython comme outil de travail dans le domaine géospatial ou le plaisir de partager, de collaborer et de communiquer


Creative Commons License
licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Pas de Modification 2.0 France

Commentaires

mplleaflet vs leaflet

Bonjour Martin,

merci pour le tuto. C'est exactement ce que je cherchais ;)

Pour Folium , je trouve que faire soi même son template Jinja2/Leaflet est souvent plus simple (pour moi)

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.