Suite

Existe-t-il un moyen d'avoir un tampon « live » dans QGIS


J'utilise QGIS (2.10.1) pour créer des tampons autour des polygones. Je crée souvent une série de tampons, et plus tard, j'ai besoin de modifier les polygones sous-jacents. Il est frustrant de repartir de zéro pour recréer plusieurs tampons en fonction des changements lorsque cela se produit.

Existe-t-il un moyen de créer un tampon « en direct », qui se mettra automatiquement à jour en fonction des modifications apportées au polygone parent, ou, en second lieu, un moyen de répliquer en un seul clic les paramètres de tampon et le formatage que vous avez créés à l'origine ?


Créer une vue dans PostGIS pour avoir un "tampon dynamique" est bien sûr le meilleur choix si vous souhaitez configurer un SGBDR. J'étais curieux de voir si vous pouviez également obtenir une sorte de tampon en direct sans PostGIS, alors je l'ai essayé avec spatialite et cela fonctionne aussi. La différence est juste qu'il semble que vous ne puissiez pas créer une vue avec un type de géométrie différent dans spatialite. J'ai trouvé cette information ici : https://groups.google.com/forum/#!topic/spatialite-users/ZZIPwYt8-uA il y avait écrit :

"il n'y a absolument aucun moyen d'afficher une géométrie de vue dans spatialite-gis, si la classe de géométrie n'est pas exactement la même que celle utilisée pour la table principale"

Il faut donc utiliser une table tampon et trois déclencheurs :

CREATE TABLE lines ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, nom TEXT NOT NULL); SELECT AddGeometryColumn('lines', 'geometry', 3857, 'LINESTRING', 'XY'); CREATE TABLE lines_buffer (id INTEGER PRIMARY KEY AUTOINCREMENT, gid INTEGER, nom TEXT NOT NULL); SELECT AddGeometryColumn('lines_buffer', 'geo', 3857, 'POLYGON', 'XY'); CRÉER LE TRIGGER "lines_buffer_insert" APRÈS INSERTION SUR "lines" POUR CHAQUE LIGNE COMMENCER INSERT INTO lines_buffer (gid, name, geo) SELECT new.id, new.name, ST_Buffer(new.geometry, 1000) ; END CREATE TRIGGER "lines_buffer_update" APRÈS LA MISE À JOUR SUR "lines" POUR CHAQUE LIGNE COMMENCER LA MISE À JOUR lines_buffer SET geo=(ST_Buffer(NEW.geometry, 1000)) WHERE gid=NEW.id ; UPDATE lines_buffer SET name=NEW.name WHERE gid=NEW.id ; END CREATE TRIGGER "lines_buffer_delete" APRÈS SUPPRIMER SUR "lines" POUR CHAQUE LIGNE COMMENCER À SUPPRIMER DE lines_buffer O gid=OLD.id ; FINIR

Je ne l'ai pas testé de manière excessive, mais j'ai créé, mis à jour et supprimé plusieurs lignes et le tampon a toujours été mis à jour (après rafraîchissement / panoramique de QGIS bien sûr). Cela pourrait donc être une alternative où vous n'avez qu'un seul fichier spatialite pour stocker les données et n'avez pas besoin de configurer une base de données PostGIS…


Publication d'une réponse à une autre question (Comment ajouter un tampon dans QGIS qui se met à jour) comme alternative aux solutions postgis/rdbms déjà partagées.

Pour une visualisation simple et infaillible, essayez le générateur de géométrie.

  1. Accédez au panneau Style de calque -> sélectionnez le style -> Type de calque de symbole : générateur de géométrie
  2. sélectionnez le type de géométrie : Polygone/Multipolygone
  3. entrez l'expression suivantebuffer($geometry,AMOUNT)
  4. MONTANT peut être un nombre fixe dans les unités de votre SIR, ou un champ dans vos données - auquel cas il seraitbuffer($geometry,"buffer_field")
  5. les tampons apparaîtront dès que vous ajoutez ou modifiez un point dans qgis, même si vous n'avez pas enregistré les modifications

Pour générer des polygones dont vous pouvez calculer des aires, etc., essayez couches virtuelles.

  1. Allez dans Couche -> Ajouter une couche -> Ajouter/Modifier une couche virtuelle
  2. cliquez sur Importer et sélectionnez votre calque
  3. entrez la requête suivante :SÉLECTIONNEZ le champ_désiré, le champ_désiré2, 'le champ souhaité', st_buffer(geometry,AMOUNT) AS géométrie de 'Nom de la couche' ;- les champs souhaités sont facultatifs. Tous les noms de calques ou de champs contenant des espaces, ou la plupart des caractères non alphanumériques, doivent être placés entre guillemets simples. Cliquez sur Tester pour vérifier qu'il n'y a pas d'erreurs avant de cliquer sur OK.
  4. les tampons sont enregistrés en tant que calque séparé, qui ne sera mis à jour que lorsque vous appuyez sur Actualiser, et toutes les modifications sont enregistrées (si vous modifiez votre calque source en dehors de qgis)

Fais juste

from qgis.analysis import QgsGeometryAnalyzer # Sélectionnez votre couche layer_ref = iface.activeLayer() # Obtenez la racine de l'arborescence des couches = QgsProject.instance().layerTreeRoot() # Préparez la fonction qui agira comme slot def save_after_edit(layer, qgsgeometrymap): output_filename = "output.shp" # Créer un tampon et le sauvegarder dans un shp QgsGeometryAnalyzer().buffer(layer_ref, output_filename, 500, False, False, -1) # Si le calque avec un nom 'buffer', le supprimer (un seul calque 'buffer' autorisé) si 'buffer' dans [i.name() pour i dans QgsMapLayerRegistry.instance().mapLayers().values()] : QgsMapLayerRegistry.instance().removeMapLayer([i.id() pour i in QgsMapLayerRegistry.instance().mapLayers().values() if i.name() == "buffer"][0]) # Ajoutez le tampon créé et ajoutez-le juste en dessous du calque en haut si 'buffer' n'est pas dans [i.name() pour i dans QgsMapLayerRegistry.instance().mapLayers().values()] : mylayer = QgsVectorLayer(output_filename, "buffer", "ogr") QgsMapLayerRegistry.instance().addMapLayer(mylayer, False ) root.insertLayer( 1, mylayer) # Position dans l'arborescence des calques # Utilisez le signal émis par le calque lorsque vous validez les modifications # Autres signaux disponibles sur http://www.qgis.org/api/classQgsVectorLayer.html layer_ref.committedGeometriesChanges.connect(save_after_edit)