Hi

On Wed, Jul 27, 2011 at 8:56 PM, maaza mekuria <sail...@yahoo.com> wrote:
> I am just wondering if one could use the following in a spatial index created 
> from the layer provider
>
>  QgsVectorLayer* cvertexLayer = cVertexLayer(txtStream);
>  QgsVectorDataProvider* cvectorProvider = cvertexLayer->dataProvider();
>  bool blnSpatialIdx = cvectorProvider->createSpatialIndex();

createSpatialIndex() method is supported only by memory provider and
by OGR provider for shapefiles. With shapefiles it means that a .qix
file is created with a quadtree structure. Memory provider builds
R-tree (using QgsSpatialIndex class).


> After creating the spatial index file how can I access it in code?
> can I use it in anyway to perform spatial filters for selection purposes?
>
>  QgsSpatialIndex mSpatialIndex = <dynamic_Cast> cvectorProvider; // may be 
> cvectorLayer;
>
> or may be even directly perform this
>
>  QgsSpatialIndex mSpatialIndex = cvectorProvider->createSpatialIndex();
>
>  // and then do something like this
>  mSpatialIndex.intersects( rect );

No. You cannot access the provider's spatial index. Some providers do
not support spatial indexing, others (optionally) use it, but it is
invisible for the client. When you call provider.select( ... ) and
specify a rectangle, you will get only features that are inside this
rectangle - and if a spatial index is available then it will be used
for faster access.


> DO I have to create my own in memory spatial index to perform the above
>
> what do you think?

If you build an application where you need to do lots of spatial
queries it makes sense to load all the features into a spatial index
(QgsSpatialIndex) and do the intersect / nearest neighbor queries
using it.

Martin
_______________________________________________
Qgis-developer mailing list
Qgis-developer@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/qgis-developer

Reply via email to