Suite

Copier plusieurs sélections (par attribut) dans un fichier de forme de sortie à l'aide du script Python QGIS ?

Copier plusieurs sélections (par attribut) dans un fichier de forme de sortie à l'aide du script Python QGIS ?


INTRODUCTION

Le code ci-dessous effectue une sélection puis enregistre dans un fichier de « sortie » (fichier de forme ?) à chaque fois via la « boucle d'itération finale ». Chaque fichier « Output » contiendra tous les points d'adresse civique sélectionnés (à partir du fichier de formes « Input ») sur l'une des rues attribuées à l'employé Joe Blow (les rues de Joe Blow proviennent du fichier CSV « FSS_Streets_Test_Sample » et sont ajoutées au « joeblow » liste).


QUESTION

Mais que se passe-t-il si je ne voulais qu'un seul fichier de formes de sortie (ou calque) ? Un avec TOUS les points d'adresse civique dans TOUTES les rues de la liste « joeblow » ?

L'astuce consiste peut-être à donner à "selectbyattribute" plusieurs noms de rue comme paramètre final ? Est-ce possible? Sinon, comment puis-je faire plusieurs sélections et les concaténer les unes après les autres jusqu'à ce que tous les (z) points d'adresse civique sur toutes les rues appartenant à " Joe Blow " (dans la liste " joeblow ") aient été mis en surbrillance avant de les enregistrer dans un (seul) nouveau shapefile ?

  • Astuce - la plupart du script ne fait que « préparer le terrain » comme des listes de construction (par exemple, une liste unique de toutes les rues ("rues") et des rues affectées à "Joe Blow" ("joeblow"). Peut-être préférerez-vous pour passer à la fin, où les deux outils "qgis" sont exécutés.

CODE

de PyQt4.QtCore import * de qgis.core import * de qgis.utils import iface import processing ##Input=vector ##Input_Field=field Input # Assignez le .CSV des rues affectées aux employés, "FSS_Streets_Test_Sample", à la variable 'vl' vl = QgsMapLayerRegistry.instance().mapLayersByName('FSS_Streets_Test_Sample')[0] # Définir vl comme "couche active" iface.setActiveLayer(vl) # Instancier la liste des 'rues' rues = [] # Obtenir la liste des rues uniques à partir de ' Colonne STRNAME' dans 'vl' pour f dans vl.getFeatures() : si f['STRNAME'] n'est pas dans les rues : rues.append(f['STRNAME']) # Instancie la liste des rues affectées à "Joe Blow" joeblow = [] # remplissez cette liste avec les rues appartenant à "Joe Blow" comme indiqué dans 'vl' pour f dans vl.getFeatures(): if f['FSS'] == 'Joe Blow': joeblow.append(f[ 'STRNAME']) #Compter le nombre de rues appartenant à "Joe Blow" z = len(joeblow) # FINAL ITERATION LOOP: Itérer dans les rues appartenant à "Joe Blow", en sélectionnant à chaque fois dans le fichier de formes "Input", tous les champs ( adresses civiques) wh Avant le "Input_Field" (STRNAME), est égal à ("0"), la ou les rues particulières appartenant à 'joeblow' (rue(s) dans la liste 'joeblow') pour k dans la plage (0,z) : traitement. runalg('qgis:selectbyattribute', Input, Input_Field, 0, joeblow[k]) processing.runalg('qgis:saveselectedfeatures', Input, 'Output') # Fin du script

Remarques:

Entrées données à l'interface graphique lors de l'exécution du script…

Le fichier 'Input' est un shapefile de points d'adresse civique (le long des rues évidemment).

Le 'Input_Field' est une colonne appelée "STRNAME" dans le shapefile 'Input'

Le fichier CSV - "FSS_Streets_Test_Sample" se trouve dans la table des matières des couches de mon projet cartographique. Il comporte essentiellement 2 colonnes : le nom de l'employé ("FSS") et le nom de la rue (également appelé "STRNAME").


Incidemment, lorsque le script a fini de s'exécuter…

a) Les adresses municipales relatives à la dernière rue (mais pas à toutes les rues) de la liste « joeblow » sont maintenant mises en évidence sur la couche du fichier de formes « Input ».

b) L'interface graphique disparaît sans afficher aucun message d'erreur dans l'onglet "Journal" de l'interface graphique (bien qu'il y ait des messages dans les différents onglets de la fenêtre "Messages du journal".

c) Mais… Je ne vois aucun fichier 'Output' (couche temporaire ou shapefile) généré par l'outil "qgis.saveselectedfeatures".


La solution que j'ai finalement utilisée consistait à remplacer "selectbyattribute" "selectbyexpression" et à le placer dans une boucle, en parcourant à chaque fois ma liste de rues et en ajustant mon "expression" en conséquence.

processing.runalg('qgis:selectbyexpression', Input, expression, 1)

La définition de "1" comme troisième attribut s'ajoute à la sélection actuelle.


Voir la vidéo: QGIS Python PyQGIS - Select features from a vector layer