Message posté par : zack
----------------------------------------
Bonjour,
J'ai exporté un script produit avec le modeleur graphique de QGIS, et j'essaye de
modifier le code pour automatiser des boucles.
J'ai simplifié le code en ne mettant qu'un traitement pour l'instant (le
buffer), et j'ai essayé de faire une boucle for en récupérant les entités de ma couche
:
-----------------
Code :
from qgis.core import QgsProcessing
from qgis.core import QgsProcessingAlgorithm
from qgis.core import QgsProcessingMultiStepFeedback
from qgis.core import QgsProcessingParameterVectorLayer
from qgis.core import QgsProcessingParameterFeatureSource
from qgis.core import QgsProcessingParameterFeatureSink
import processing
class Modele_iteration(QgsProcessingAlgorithm):
def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterVectorLayer('total', 'Sortie
"total" ', types=[QgsProcessing.TypeVectorPolygon],
defaultValue='I:/user/DONNEES/temp/test_iteration_pyqgis/total.shp'))
self.addParameter(QgsProcessingParameterFeatureSource('nonbati',
'Sortie "non bâti" ', types=[QgsProcessing.TypeVectorPolygon],
defaultValue='I:/user/DONNEES/temp/test_iteration_pyqgis/nonbati.shp'))
self.addParameter(QgsProcessingParameterFeatureSink('Sortie',
'sortie', type=QgsProcessing.TypeVectorAnyGeometry, createByDefault=True,
defaultValue='I:/user/DONNEES/temp/test_iteration_pyqgis/test.shp'))
def processAlgorithm(self, parameters, context, model_feedback):
# Use a multi-step feedback, so that individual child algorithm progress reports
are adjusted for the
# overall progress through the model
feedback = QgsProcessingMultiStepFeedback(1, model_feedback)
results = {}
outputs = {}
features = parameters['nonbati'].getFeatures()
for feature in features :
# Tampon
alg_params = {
'DISSOLVE': False,
'DISTANCE': 0.5,
'END_CAP_STYLE': 0,
'INPUT': f,
'JOIN_STYLE': 0,
'MITER_LIMIT': 2,
'SEGMENTS': 5,
'OUTPUT': parameters['Sortie']
}
outputs['Tampon'] = processing.run('native:buffer',
alg_params, context=context, feedback=feedback, is_child_algorithm=True)
results['Sortie'] = outputs['Tampon']['OUTPUT']
return results
def name(self):
return 'modele_iteration'
def displayName(self):
return 'modele_iteration'
def group(self):
return 'modele'
def groupId(self):
return 'modele'
def createInstance(self):
return Modele_iteration()
-----------------
Mais ça ne marche pas comme ça apparemment, puisqu'il me dit "AttributeError:
'str' object has no attribute 'getFeatures'".
Est-ce que quelqu'un sait comment construire une boucle pyqgis ?
D'autant qu'après coup, j'aimerai mettre cette boucle for dans une boucle
while, afin qu'il répète l'action tant que des changements sont effectués. En gros
mon modèle vise à changer un champs "affectation" en fonction des valeurs des
polygones voisins, et il doit se répéter jusqu'à ce qu'il n'y ait plus de
polygones qui changent d'affectation.
Merci de votre aide !
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=321777#p321777
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net