Limiter les propositions d'une liste relationnelle selon l'emprise de la carte

J'utilise depuis Qgis 1.8 les possibilités de personnalisation du formulaire de renseignement des attributs.

Une nouveauté (une autre!) a fait son apparition avec la sortie de QGis 2, c'est la possibilité d'utiliser des couples clé/valeur stockés dans une table de la base de données.

J'aimerai aller un peu plus loin et appliquer un "filtre d'expression", consistant à ne proposer dans la liste déroulante que les couples clé/valeur des objets présents dans l'emprise courante de ma carte.

Concrètement, j'ai besoin de délimiter du parcellaire et je dispose pour cela du scan du cadastre et des localisants de parcelles fournis par la BD Parcellaire.

Lors du dessin d'une nouvelle parcelle, j'aimerai que les valeurs proposées pour renseigner le numéro de parcelle soient issues des valeurs de numéro de parcelle des localisants contenus dans l'emprise actuelle de ma carte, et non de l'ensemble des localisants de ma bd parcellaire.

L'éditeur de filtre ne propose rien qui soit relatif à mon objet "carte".

En cherchant un peu partout une solution à mon problème, j'ai bien compris que python serait la solution.

Les 3 ressources ci-dessous m'ont bien aidé :

  - http://nathanw.net/2012/11/10/user-defi … -for-qgis/
  - http://www.3liz.com/blog/rldhont/index. … ns-de-QGIS
  - http://gis.stackexchange.com/questions/ … n-qgis-1-8

J'ai donc créé un script python (userfunctions.py), qui contient une fonction appelée current_canvas_extent, qui retourne une géométrie de type Polygone représentant l'emprise courante de la fenêtre.

from qgis.utils import qgsfunction from qgis.utils import iface from qgis.core import QGis @qgsfunction(0, "Python") def current_canvas_extent(values, feature, parent): """ retourne l etendue courante de la carte """ extend = iface.mapCanvas().extent().asWktPolygon() return extend

Cette fonction peut-être modifiée pour ne pas passer par le format WKT mais directement par un objet Geometry de QGis :

from qgis.utils import qgsfunction from qgis.utils import iface from qgis.core import (QGis, QgsGeometry) @qgsfunction(0, "Python") def current_canvas_extent(values, feature, parent): """ retourne l etendue courante de la carte """ extend = QgsGeometry.fromRect( iface.mapCanvas().extent()) return extend

J'appelle se script au démarrage de QGis (ajouter à la commande de lancement de QGis l'option "--code chemin\vers\userfunctions.py") J'ai maintenant accès dans mon éditeur d'expression à cette "variable".

Et je peux demander à QGis, grâce à l'éditeur d’expression de ne me proposer dans la liste que les parcelles présentes dans l’emprise de ma carte :

l'expression utilisée : intersects(  $geometry , geomFromWKT( $current_canvas_extent ))

Mise à jour le 22/06/2017 : A partir de QGIS 2.18, la syntaxe fonctionnelle pour le filtre est la suivnate : intersects( geometry( $currentfeature ), current_canvas_extent() )

Ca n'a jamais été aussi vrai :

Tags: 

Les contenus des sites sig.cenlr.org et si.cenlr.org sont mis à disposition selon
les termes de la licence Creative Commons Attribution 3.0 France

Licence Creative Commons