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:
- utiliser plusieurs fonds (tuiles OpenStreetMap, par défaut, Thunderforest Landscape, Mapquest Open, Mapbox bright, CartoDB Positron, Stamen Watercolor et des fonds de cartes Esri (Aerial, World Topographic Map , National Geographic World Map).
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 : LeafletAutres Liens : Les notebooks IPython comme outil de travail dans le domaine géospatial ou le plaisir de partager, de collaborer et de communiquer
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