Aller au contenu | Aller au menu | Aller à la recherche

Opérateurs spatiaux dans les expressions de QGIS

Pour l'amélioration de l'implémentation de la norme WFS de l'OGC dans QGIS-Server, j'avais besoin de pouvoir évaluer des filtres exploitant des opérateurs spatiaux. L'Open Geospatial Consortium a défini au sein des normes Filter Encoding ou Simple Feature Specification for SQL une liste d'opérateur spatiaux, qui sont :

  • Equals,
  • Disjoint,
  • Touches,
  • Within,
  • Overlaps,
  • Crosses,
  • Intersects,
  • et Contains.

Aux quels, il faut ajouter BBOX qui correspond à une intersection (Intersects) avec l'emprise (BoundingBox) de la géométrie passée en paramètre.

Tous ces opérateurs nécessitent 2 arguments qui sont 2 géométries qui peuvent être :

  • celle de l'objet géographique (Feature) pour lequel l'expression est évaluée
  • une géométrie décrite en GML2 dans le cas de la norme Filter Encoding, en WKT dans le cas d'une expression

Après avoir réalisé une implémentation spécifique à QGIS-Server et obtenu des retours de contributeur à QGIS, j'ai entrepris l'implémentation de ces opérateurs dans le système d'expression de QGIS. Ces développements sont actuellement sur mon dépôt github pour QGIS mais sont déjà fonctionnelle. Et voici quelques exemples.

QGIS Expression Window Fenêtre de construction d'expression de QGIS. Dans la liste des opérateurs disponibles dans la catégorie géométrie vous trouverez les nouveaux opérateurs comme $geometry, geomFromWKT, geomFromGML2, bbox, disjoint, etc.

Pour réaliser ces exemples, j'ai choisi un jeu de données OpenData de la ville de Montpellier :

  • Sous-quartiers, Cette donnée représente le découpage administratif en sous-quartier de la ville de Montpellier.

Dans les métadonnées de cette couche, on trouve l'emprise suivante :

  • xMin,yMin 765145.88,6274561.22
  • xMax,yMax 776031.67,6284189.52

Nous allons nous en servir tout d'abord pour sélectionner les sous-quartiers se trouvant sur la diagonale xMin,yMin xMax,yMax, soit l'expression :

  • intersects( $geometry, geomFromWKT( 'LINESTRING(765145.88 6274561.22, 776031.67 6284189.52)' ) )

QGIS Expression test intersects linestring

QGIS Expression select intersects linestring

Si on souhaite sélectionner tous les éléments, on peut faire :

  • bbox( $geometry, geomFromWKT( 'LINESTRING(765145.88 6274561.22, 776031.67 6284189.52)' ) )

Mais il est aussi possible d'utiliser ces expressions dans des ensemble de règles de style, avec par exemple les expressions :

  • intersects( $geometry, geomFromWKT( 'POLYGON' ) )
  • NOT intersects( $geometry, geomFromWKT( 'POLYGON' ) )

QGIS Expression spatial style rules

Une couleur est ainsi associé à chacune de ces expressions qui permettent de colorisé facilement les sous-quartiers Nord-Ouest et Sud-Est de Montpellier.

QGIS Expression spatial style rules rendering

On peut aussi rajouter, la sélection sur la diagonale avec un ordre de priorité supérieur aux autres :

  • intersects( $geometry, geomFromWKT( 'LINESTRING(765145.88 6274561.22, 776031.67 6284189.52)' ) )

Et obtenir ceci : QGIS Expression spatial style rules rendering

Ce genre de chose était nécessaire au WFS dans QGIS-Server mais maintenant on peut imaginer étendre ces opérateurs spatiaux en ajoutant des transformateur comme :

  • exportToWKT
  • buffer
  • centroid
  • convexhull
  • distance
  • simplify

Pour créer du contenu ou complexifier les requêtes spatiales.