[gdal-dev] SetAttributeFilter and OSM
even.rouault at mines-paris.org
Sun Jan 5 01:33:19 PST 2014
> As you can see the second time I set an attribute filter in the loop it
> returns all 341 features on the layer, not only the 321 that match the
> filter. In all other cases it seems to work fine.
> Did I go something wrong with in my code? Do I need to call some other
> commands maybe before I apply the SetAttributeFilter?
I've managed to reproduce your issue and I've understood what happens. This is
due to a performance optimization done in the OSM driver to avoid useless
ResetReading() to discard already cached features. I've pushed into GDAL trunk
a fix for that issue.
There are 2 workarounds :
* the recommanded one is to set attribute filters on all needed layers before
starting iterating over any of them. Indeed, when you read a OSM file it will
collect features for all layers, so while collecting points, it might also
collect lines and apply the attribute filter that was currently set on that
layer. If you apply another one afterwards, it is too late.
* a simple one, but potentially less efficient in terms of performance : just
insert a call to lay.GetNextFeature() between lay.SetAttributeFilter("highway
IS NOT NULL") and lay.ResetReading(). This will cause the ResetReading() to
Geospatial professional services
More information about the gdal-dev