How can I get a feature's geometry from selection by attribute?
For instance from a point layer I want to get the geometry by the field CODICE filter (CODICE = A001).
I tried with:
layer = QgsMapLayerRegistry.instance().mapLayersByName("My_layer")[0]
selection = layer.getFeatures(QgsFeatureRequest(QgsExpression("\"CODICE\" = 'A001'")))
geom = selection.geometry()
It doesn't work, and the python console error is:
AttributeError: 'QgsFeatureIterator' object has no attribute 'geometry'
1 Answer 1
Your approach is correct and working. However, the result you get back from layer.getFeatures
is a QgsFeatureIterator
and not a QgsFeature
. You have potentially more than 1 feature in selection
. You can simply iterate over your selection to get all the features:
for feature in selection:
geom = feature.geometry()
# do something with geom
-
Just a last question: if I'm sure that the result from the
layer.getFeatures
is only one feature, then is it correct to use the sintax:selection.next()
, intead of the iteration?Chlorine– Chlorine2015年09月22日 14:41:19 +00:00Commented Sep 22, 2015 at 14:41 -
More generally, it is a Python iterator look at Python list iterator behavior and next(iterator)gene– gene2015年09月22日 15:01:46 +00:00Commented Sep 22, 2015 at 15:01
-
Dear @chkaiser, dear all, thanks for your answer. The feature geometry selection works, but unfortunately I have another problem. In some cases there is not the feature with requested "CODICE", and this is because I have to match two different layers to understand when they have the same code. When the two layers don't have the same code the
getFeature
gives me an error and the program stops. In this case I would like to skip to request to start another one. Do you have some suggestions? Really thanks.Chlorine– Chlorine2016年01月24日 18:00:55 +00:00Commented Jan 24, 2016 at 18:00