Suite

Dupliquer une couche et appliquer un filtre à l'aide de PyQGIS ?


Existe-t-il un moyen, en utilisant Python, de dupliquer une couche dans QGIS autant de fois que d'occurrences uniques d'une variable contenue dans un champ et avec un filtre appliqué sur la couche dupliquée en fonction de la variable elle-même ?

Un exemple : j'ai layer0 avec un field0 qui contient var1, var2, var3, etc. Je voudrais que le layer0 soit dupliqué sur layer1, layer2, layer3 etc. pour que layer1 ait un filtre où field0 = var1, layer2 a un filtre où field0 = var2, etc.

L'idée est similaire au plugin LayersByField mais au lieu de créer un nouveau calque pour chaque occurrence d'une variable, je souhaite simplement dupliquer le calque "maître" (afin d'éviter les fichiers inutiles sur le disque)


Le script Python suivant a été testé avec des fichiers Shape, des couches PostGIS et SpatiaLite à l'aide de QGIS 2.8.2 sous Windows 7. Spécifiez le champ que vous souhaitez filtrer dans la première ligne de code (remplacez rtt).

# spécifier le champ à filtrer field_name = 'rtt' # obtenir le calque actif layer = iface.activeLayer() # obtenir la référence au champ nommé ci-dessus fni = layer.fieldNameIndex(field_name) f = layer.dataProvider().fields() # get type de champ, nécessaire pour construire une chaîne SQL valide is_string = False si f[fni].type() dans [7, 10] : is_string = True # obtenir la liste des valeurs uniques uniques_values ​​= layer.uniqueValues(fni) pour i dans unique_values : # ajouter une couche à la carte lyr_copy = iface.addVectorLayer(layer.source(), layer.name() + '_' + str(i), layer.providerType()) # construire une chaîne de sous-ensemble en SQL comme la syntaxe if is_string : lyr_copy.setSubsetString('"%s" = '%s"% (field_name, i)) else : lyr_copy.setSubsetString('"%s" = %d' % (field_name, int(i)))

Le fichier ESRI Geodatabase n'a pas fonctionné pour moi car pour tous les indices de champ layer.uniqueValues(fni) renvoie la liste des valeurs uniques du premier attribut. Ainsi, le filtrage d'un attribut par ces valeurs renvoie une liste vide ou un jeu de résultats erroné. Peut-être un problème de QGIS 2.8.2.


J'ai adapté la réponse @Detlev pour en faire un script de traitement avec quelques petits ajustements :

##Dev_scripts=group ##Field_Filter=name ##input=vector ##field_name=field input from qgis.core import QgsExpressionContextUtils from qgis.utils import iface layer = processing.getObject(input) fields = layer.dataProvider().fields () field_name_index = layer.fieldNameIndex(field_name) # obtenir le type de champ, nécessaire pour construire une chaîne SQL valide is_string = False si fields[field_name_index].type() dans [7, 10]: is_string = True # obtenir la liste des valeurs uniques unique_values = layer.uniqueValues(field_name_index) pour i dans unique_values : # ajouter une couche à la carte lyr_copy = iface.addVectorLayer(layer.source(), layer.name() + '_' + str(i), layer.providerType() ) # construire une chaîne de sous-ensemble en SQL comme la syntaxe if is_string : lyr_copy.setSubsetString('"%s" = '%s"% (field_name, i)) else : lyr_copy.setSubsetString('"%s" = %d' % (field_name, int(i)))


Voir la vidéo: QGIS Python PyQGIS - Calculate Field Values Field Calculator (Octobre 2021).