[GIS] Deleting selected features from Vector/OGR in GDAL/Python

gdalogrpython

I run the following code to first select specific attributes using a query and then I need to delete them

from osgeo import gdal, ogr
import os

##shapefile = "D:/New.shp"
##driver = ogr.GetDriverByName("ESRI Shapefile")
##dataSource = driver.Open(shapefile, 0)

shapefile = ogr.Open( "D:/New.shp")

layer = shapefile.GetLayer()
layer.SetAttributeFilter("Area < 5000")

for i in layer:
    print i.GetField("Area")
    layer.DeleteFeature(i)

I get the following error :

layer.DeleteFeature(i)   File
"C:\Python27\ArcGIS10.2\lib\site-packages\osgeo\ogr.py", line 1499, in
DeleteFeature
return _ogr.Layer_DeleteFeature(self, *args) TypeError: not an integer

I changed the last line of my code to ogr.Layer_DeleteFeature(i) to which i get the error

ogr.layer_DeleteFeature(i)
AttributeError: 'module' object has no attribute 'layer_DeleteFeature'

Best Answer

You're passing a Feature object to layer.DeleteFeature which is expecting an integer value (a feature ID or "FID"), not a Feature object.

Try passing the FID instead:

for feat in layer:
    print feat.GetField("Area")
    layer.DeleteFeature(feat.GetFID())

Note that the OGR layer.DeleteFeature(fid) method doesn't actually delete features, it just marks them as deleted in the .dbf then ignores them. This is mentioned in the shapefile driver doc:

Deleted shapes are marked for deletion in the .dbf file, and then ignored by OGR. To actually remove them permanently (resulting in renumbering of FIDs) invoke the SQL 'REPACK ' via the datasource ExecuteSQL() method.

For more info, see GetFeatureCount gives same result after deleting a feature.