Bug report #19764

Features in memory layers are not accessible by pyQGIS scripts

Added by Michael Kuerbs over 2 years ago. Updated over 2 years ago.

Status:Closed
Priority:Normal
Assignee:Nyall Dawson
Category:PyQGIS Console
Affected QGIS version:3.2.2 Regression?:No
Operating System:Win 7 or Win 10 Easy fix?:No
Pull Request or Patch supplied:No Resolution:
Crashes QGIS or corrupts data:No Copied to github as #:27589

Description

Features in memory layers are not accessible.

QgsFeature.attributes() is a emty list []
QgsFeature.geometry() is a emty geometry

If I save the memory layer in a shp or something else, it works very well.

History

#1 Updated by Giovanni Manghi over 2 years ago

  • Priority changed from High to Normal
  • Pull Request or Patch supplied changed from Yes to No

#2 Updated by Nyall Dawson over 2 years ago

  • Status changed from Open to Feedback

More information is required here.

#3 Updated by Michael Kuerbs over 2 years ago

  • Assignee set to Nyall Dawson

I create a memory layer with one feature included attributes.

Now I would access this Feature directly with

feat = layer.getFeature(0)
print(feat.attributes(), feat.geometry().asWkt()) => [] ""

if i work with real storage Layers the first feature is getting with layer.getFeature(0)

if it's a memory layer, the first feature is getting with layer.getFeature(1)

if i get features by iterating, it works very well

why is the index using different in case of menory layers?

#4 Updated by Nyall Dawson over 2 years ago

Feature IDs aren't consistent across providers - they are stable within a particular layer, but won't be transferred if that layer is saved to a different format or provider.

#5 Updated by Jürgen Fischer over 2 years ago

feat = layer.getFeature(0)

getFeature takes a feature id and not an index. And the feature id is provider/data source specific. You shouldn't make assumptions about it other than you can address a feature with the id you got from the layer - as it might not even be safe to assume that features from the same datasource, but on different layers have the same id).

#6 Updated by Michael Kuerbs over 2 years ago

I would like just the first feature a layer.

#7 Updated by Nyall Dawson over 2 years ago

  • Status changed from Feedback to Closed

In that case:

feature = next(layer.getFeatures())

(or better)

feature = next(layer.getFeatures(QgsFeatureRequest().setLimit(1))

Also available in: Atom PDF