Skip to Content

Les modules Python à finalités géospatiales: quid, quando, ubi ?

Niveau Débutant
Logiciels utilisés Python
Plateforme Windows | Mac | Linux | FreeBSD

Beaucoup de sigistes commençant à utiliser Python sont un peu déroutés devant la profusion de modules à finalités géospatiales dont ils ont entendu parler et n'en voient souvent pas l'intérêt. Certains sont aussi un peu perdus devant des messages ou des erreurs signalés par leur logiciel SIG lorsqu'ils veulent installer/utiliser une extension:

ImportError: No module named shapely.wkb

« Flute, c'est quoi shapely.wkb ? Ce n'est pas dans les extensions QGIS, vite une question sur forumSIG et/ou sur Georezo et/ou sur GIS StackExchange pour avoir une réponse»

Et non, Shapely n'est pas une extension de QGIS mais un simple module géospatial Python, car en pratique:

  • il est possible d'utiliser Python dans son logiciel SIG en se limitant aux  modules fournis (ArcPy, PyQGIS, grass, ...);
  • il est possible d'utiliser Python sans logiciel SIG (avec les modules géospatiaux);
  • il est aussi possible d'utiliser un module géospatial tiers dans son logiciel SIG.

Le problème est qu'il y a un très grand nombre de modules Python à finalités géospatiales (voir Pypi:GIS) et que si je vais sur GitHub par exemple, il s'en crée un presque tous les jours...

À l'occasion des 10 ans du forumSIG et puisque j'ai commencé sur le Portail par là (Python - Interrogation d'un service cartographique ), je vais essayer de les classer de manière pratique:

« quel module utiliser si je veux... »

en me limitant aux fondamentaux, c'est-à-dire les plus utilisés à l'heure actuelle. Il y a quelques constantes cependant:

  • la plupart d'entre eux sont liés plus ou moins directement au  principal module scientifique sur Python: Numpy (soit basé sur, soit compatible avec le type de données de numpy, les arrays). Cela garantit la suite des traitements possibles;
  • la classification peut être redondante dans le sens où un même module peut effectuer beaucoup de choses alors qu'un autre est limité à un seul traitement (par exemple, PySAL peut lire nativement un fichier shapefile et le traiter de même que matplotlib.basemapCartopy et  mapnik peuvent aussi le lire nativement et le représenter graphiquement);
  • la documentation, surtout francophone, est comment dire, hum.... aux abonnés absents.
  • hormis exception, je ne soulignerai ici que l'utilisation du module sur le Portail (je sais, je sais, c'est réducteur, voire de l'auto promotion, mais comme ça je ne vexe personne et puis c'est la fête du Forum/Portail après tout...).

Il y a cependant un module « universel » dans le sens où il peut presque tout faire:

le module osgeo

  1. c'est la version Python de la  librairie C/C++ GDAL/OGR;
  2. il est subdivisé en plusieurs sous-modules, osgeo.ogr, osgeo.gdal, et osgeo.osr dont la signification sera donnée dans la suite;
  3. il est compatible avec Numpy;
  4. il est relativement difficile d'accès pour celui qui débute en Python.

Au milieu des nombreux tutoriels à son sujet, je ne pourrai pas passer sous silence:

Protocole de standardisation: la geo_interface

Avant de commencer, signalons qu'un protocole de standardisation a éte proposé par Sean Gillies. Il est basé sur le format GeoJSON et est de plus en plus disponible dans les modules géospatiaux (dont ArcPy et PyQGIS), voir:

Je signalerai donc chaque fois qu'il est disponible.

Les modules basiques: je voudrais lire et écrire des données géospatiales

Ils sont fondamentaux, car sans possibilité de les lire... La majorité des autres modules de traitements  se basent donc sur ceux-ci.

je veux lire ou écrire des données provenant de fichiers vectoriels

le module osgeo.ogr:

  1. Il permet de lire et d'écrire tous les formats vectoriels supportés par la librairie ( OGR: Vector Formats);
  2. il y a facilement moyen d'implémenter la geo_interface;
  3. il permet aussi de faire de nombreux autres traitements.

Il a été abordé sur le Portail dans:

le module Fiona

C'est le petit dernier qui monte:  c'est un habillage du module  osgeo.ogr  pour le rendre plus « pythonesque », on ne manipule que des dictionnaires Python, suivant l'adage de Sean Gillies, son auteur, que le traitement des données spatiales n'a rien de particulier vis-à-vis de celui des autres données.

  1. son but est de lire et écrire les formats supportés par OGR (fichiers);
  2. il est directement basé sur la librairie GDAL/OGR et non sur le module osgeo.ogr;
  3. il est compatible avec Numpy et dispose de la geo_interface;
  4. une fois qu'on a compris sa logique, il est très facile à utiliser.

Il a été présenté sur le Portail dans:

le module pyshp (shapefile)

Il est écrit en pur Python (aucune dépendance).

  1. il ne traite que la lecture et l'écriture des fichiers shapefile;
  2. il n'a rien à voir avec osgeo ni Numpy;
  3. il dispose de la geo_interface depuis ses dernières versions;
  4. c'est le plus facile à utiliser lorsqu'on débute en Python.

Il a été abordé sur le Portail dans

Autres

D'autres modules cités dans la suite pour autre chose permettent aussi de le faire nativement (comme PySAL, matplotlib.basemap  ou mapnik). Il en existe aussi d'autres, abordés sur le Portail (Python et les Shapefiles), mais ils sont de plus en plus anecdotiques.

je veux lire ou écrire des données provenant de tables spatiales (SGBD, NoSQL)

Encore une fois, le maître choix pour lire/écrire les données spatiales est le module osgeo.ogr:

le module osgeo.ogr

  1. il dispose des pilotes (drivers) pour traiter la majorité des bases de données spatiales.
  2. cela veut dire qu'il peut être utilisé seul.

le module psycopg2

  1. C'est le module le plus utilisé pour lire et écrire les données de  PostgreSQL/PostGIS.
  2. Il y en a d'autres (modules pour traiter les données PostgreSQL), mais beaucoup moins populaires.

le module sqlite3

  1. c'est le module pour accéder à aux bases SQLite. Il est livré en standard dans les distributions de Python

le module pyspatialite

  1. il est, comme son nom l'indique, destiné à traiter les données des bases SQLite/Spatialite
  2. il y a moyen de s'en passer en utilisant le module précédent (voir SQLite - SpatiaLite: le pourquoi du comment).

autres

Il y a, bien entendu, des modules pour traiter toutes les bases spatiales et même les bases NoSQL

Ils ont été abordés sur le Portail:

je veux lire des données provenant d'un service WFS

Ici encore, il faut utiliser le module osgeo.ogr.

je veux lire ou écrire des fichiers de type raster ou provenant de services WMS ou ...

Ici, il y a théoriquement du choix avec les modules traditionnels qui permettent de lire les fichiers images (comme Python Imaging Library ou PIL « forkée » dans Pillow) mais la solution la plus appropriée est

le module osgeo.gdal.

  1. Il permet de lire tous les formats supportés dans GDAL Raster Formats;
  2. il tient compte du géoréférencement de l'image.

Les quelques autres modules restent marginaux.

je veux lire des données « spécifiques »

Il y a aussi des modules plus spécialisés et non liés aux précédents qui permettent de lire des formats plus spécifiques, comme le module officiel d'OpenStreetMap OsmApi, mais il y en a d'autres (Pypi: OpenStreetMap) ou ceux qui permettent de lire directement des fichiers KML.

je veux m'occuper des projections de mes données

Je peux le faire avec les modules osgeo.osr ou pyproj. Le sujet a été traité sur le Portail:

Je voudrais traiter les données

Une fois que les données ont été lues, le monde Python offre un vaste choix pour les traiter. Il faut distinguer ici ceux qui permettent de traiter les géométries vectorielles, ceux qui permettent de traiter les données matricielles (rasters) et ceux qui veulent tout traiter.

je veux traiter les géométries vectorielles

le module Shapely

  1. il est basé sur la librairie C++ GEOS et permet, schématiquement, d'effectuer tous les traitements géométriques « à la PostGIS » en Python;
  2. il ne lit pas et n'écrit pas les données et ne s'occupe pas des projections.
  3. mais comme la geo_interface est implantée, il n'y a aucun problème pour utiliser osgeo.ogr, Fiona , pyshp ou PyQGIS pour suppléer à ce problème;
  4. pyproj peut être utilisé pour les projections avant/après traitement;
  5. intialement limité au plan cartésien 2D, ses dernières versions permettent d'effectuer des translations, cisaillements ou rotations en 2D et 3D;
  6. il est directement compatible avec Numpy;

Il existe une version très simplifiée de Shapely ( "shapely ultralight" ), le module PyGeoIf, destiné à fournir une geo_interface à d'autres modules qui en sont dépourvus (comme cela a été le cas dans pyshp).

Sur le portail, il a été abordé dans

le module osgeo.ogr

  1. les  traitements sont aussi disponibles, mais ils sont  beaucoup plus complexes à utiliser.
  2. il a l'avantage d'être indépendant pour lire et écrire les données.

autres

Les géométries étant récupérées en format Python, il est donc possible d'utiliser tous les autres modules comme Numpy ou Scipy pour effectuer des traitements spécifiques (TIN, Voronoï, etc.). Il existe d'autres modules plus spécialisés que je n'aborderai pas ici.

Sur le portail, l'utilisation de  ces modules a été traitée dans:

je veux faire de la statistique géospatiale

le module PySAL

  1. il permet une multitude de traitements de statistiques géospatiales;
  2. il permet aussi de lire et d'écrire des fichiers shapefiles;
  3. il est totalement intégré avec le module Shapely (Using PySAL with Shapely for GIS Operations);
  4. il est compatible avec Numpy et dispose de la geo_interface.

je veux traiter les données matricielles (rasters)

Ici, vous avez l'embarras du choix: comme déjà signalé, il y une multitude de modules permettant de traiter ce type de fichier (dont Numpy) mais il n'y a que le module osgeo.gdal qui tient compte du géoréférencement des images. Il y a quelques autres modules plus spécialisés, basés sur ce dernier.

le module osgeo.gdal

  1. il possède d'origine une multitude de traitements disponibles;
  2. le passage vers un format Numpy est enfantin.

les modules Numpy et Scipy

  1. Puisque les fichiers rasters ne sont que des matrices de pixels, il est aussi possible de les utiliser directement avec leurs très grands nombres de traitements disponibles.

les modules dérivés:

Tous les autres modules sont basés sur ces derniers comme:

- le module Python raster stats, basé sur Numpy et  osgeo.gdal. Il permet de faire des statistiques zonales

- le module Pyresample est basé sur Scipy. Il est destiné à reprojeter les rasters sur base des kd-tres

je voudrais représenter mes données sans logiciel SIG:

Puisqu'elles ont été transformées en objets Python, il est théoriquement possible d'utiliser n'importe quel module qui permet de le faire ( Pypi: Plotting ) et il y en a beaucoup...

Dans les faits, il n'y en a que quelques-uns qui ressortent:

le module matplotlib

  1. c'est le module graphique le plus complet et le plus utilisé;
  2. sa finalité est scientifique (à la Matlab);
  3. il permet la représentation 2D ou 3D des données vectorielles ou matricielles;
  4. il dispose aussi de nombreux traitements propres;
  5. il est compatible avec Numpy.
  • il a été abondamment utilisé sur le Portail.

le module matplotlib.basemap

  1. c'est une extension de matplotlib (Matplotlib Basemap Toolkit) qui permet de représenter des données géospatiales munies d'une projection sur une carte (2D) ou un globe (mais toujours en 2D);
  2. il permet aussi de lire nativement les shapefiles
  • il n'a pas été abordé sur le Portail mais comme il est important dans le monde universitaire, je me dois de citer une des meilleures séries de tutoriels que je connaisse: celle du sismologue belge Thomas Lecocq à Tutorials

 module Descartes

  1. c'est une extension de matplotlib qui permet de mieux représenter les surfaces des objets géométriques (2D)
  2. il dispose de la geo_interface

module Cartopy

  1. il se veut une solution intégrée puisqu'il se propose de lire les données vectorielles avec le module pyshp, de les traiter avec les modules Shapely et Numpy et de les représenter avec le module matplotlib (2D);
  2. il gère les projections de manière non standard avec sa propre implémentation basée sur la librairie PROJ4 (Cartopy projections);
  3. les seuls rasters qu'il peut figurer sont ceux du serveur de tuiles Mapquest;
  4. ils travaillent sur la possibilité de représenter les données SRTM (Shuttle Radar Topography Mission) et GSHHS (Global Self-consistent, Hierarchical, High-resolution Shoreline).

module mapnik

Mapnik est un monde en soi dont le seul but est, caricaturelement, de créer les plus belles représentations cartographiques possibles (Mapnik is about making beautiful maps). Il utilise le module Pycairo et sait aussi lire nativement les shapefiles. La geo_interface. peut facilement être implémentée.

module Mayavi

  1. c'est LE module de représentation scientifique 3D;
  2. il est basé sur la librairie VTK et permet de représenter toutes les données vectorielles et matricielles en 3D;
  3. il offre aussi une gamme importante de traitements propres;
  4. il est, bien évidemment, compatible avec Numpy
  5. il est relativement complexe à utiliser.

autres

Il y a toujours moyen d'utiliser d'autres modules comme Visvis (3D) mais c'est moins fréquent.

Conclusions

Oufti, j'espère vous avoir apporté quelques éclaircissements qui vous permettront de choisir le module adéquat ou l'enchaînement de modules adéquat pour faire ce que vous voulez en Python, avec ou sans logiciel SIG (et Shapely ou matplotlib sont bien utilisés par des extensions de QGIS...)

Site officiel : Python


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

Commentaires

Lien cassé

Article super !

Le lien vers l'article sur pyshp :
Python et les shapefiles (suite) ou le module le plus simple à utiliser (un seul fichier, sans dépendance)
http://www.portailsig.org/content/python-et-les-shapefiles-suite-ou-le-m...
est incomplet.

Le bon lien est :
http://www.portailsig.org/content/python-et-les-shapefiles-suite-ou-le-m...

un autre module très utile : Rtree

Panaroma très complet (comme souvent) et très intéressant (comme toujours) de Martin !

Je n'ajouterai qu'un module, Rtree (https://pypi.python.org/pypi/Rtree) que, personnellement, j'utilise souvent, et de concert, avec Shapely.

Rtree permet - entre autres choses - de "débroussailler le terrain" quand on se lance dans la recherche d'intersections entre de nombreux objets sur une zone étendue en réduisant le nombre de candidats possibles : pas besoin de calculer/tester l'intersection entre tous les objets, 2 à 2, mais seulement sur une partie d'entre eux que calcule Rtree (basé sur une bibliothèque C++)

Ooops : panOrAma !

Ooops : panOrAma !

Poster un nouveau commentaire

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