[gdal-dev] Layer operations, a proposal

Ari Jolma ari.jolma at gmail.com
Thu Apr 19 03:03:14 EDT 2012


On 04/18/2012 11:06 PM, Jason Roberts wrote:
> For scenarios involving large numbers of features, I suspect it is much
> harder to do it fast and within available memory. It is probably necessary
> to do a multi-pass approach, where the first step operates only on the
> spatial indexes of the layers involved. It is probably too slow--or at least
> very suboptimal--to even read all of the features into memory, much less
> call GEOS on them; all of that would happen in a later pass, when a subset
> of features was identified via the spatial index pass. I suspect all of this
> must be implemented in the core OGR code, where it is possible to quickly
> and selectively probe spatial indexes, unless OGR wants to expose an
> abstraction allowing higher level code to do that. I could definitely
> appreciate the view that either of these approaches is significant scope
> creep.

I agree that having a spatial index in OGR would be useful in many 
cases. Regarding the methods I propose the index would help of course, 
but IMO the index is not their responsibility. The algorithms usually 
simply do this (with variations - and I don't see much possibilities for 
speed ups) for a method C = A->method(B):

iterate trough all features x of A // the spatial filter of A may be in 
effect
     set (or include) x.geom into the spatial filter of B
     iterate trough all features y of B // the spatial filter of B is in 
effect

Thus the key issue is to have the index help the iteration. A 
possibility would be to have a pair of layer methods:

InstallSpatialIndex() // iterate through all features and build the 
index into memory
UninstallSpatialIndex() // remove the index

There are free R-tree implementations which could be used (for example 
http://www.superliminal.com/sources/sources.htm#C%20&%20C++%20Code) and 
if available those methods would then use that. They could also be 
simple no-ops if R-tree or something else is not available. The 
GetNextFeature method would then use the spatial index if available.

Hm. The validity of the index is of course an issue - all changes to 
features and their geometries either need to be recorded into it or 
invalidate it. I would probably assume that the index is valid only the 
minimal time - basically leave it up to the user to recreate it.

After I get working examples of the layer methods I propose, I may look 
into that.

Cheers,

Ari



More information about the gdal-dev mailing list