[Qgis-developer] Does spatial index improve performance using the class QgsGeometry.intersects()?

Stefano Masera stefano.masera at arpa.piemonte.it
Mon Nov 4 03:16:35 PST 2013


Hi list,

I don't know exactly how spatial index works, so I ask this question.
I have two layers and I want to check which features of the first layer intersect the features of the second one.
I write a simple script where I create the spatial index for both themes and I use the class QgsGeometry.intersects() to check the intersections.

I cannot understand why the executing time is the same even if I create or I don't create the spatial index for the layers.
Note: 
- The first layer (polilyne) has 20000 features, the second (polygon) has 600 features.
- To test the script insert the path of a check file
- To compare time executing you have to comments the two lines (21 and 22) in which I create the spatial index and cancel the file *.qix on the hard disk.

Thanks
Stefano Masera


====================================================================================
##input_layer1_polyline=vector
##input_layer2_polygon=vector

from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import processing
import time

# start time
start_time = time.time()

# opens a check file: insert path 
file = open("INSERT PATH","w")

# gets vector layer
layer1_polyline = processing.getobject(input_layer1_polyline)
layer2_polygon = processing.getobject(input_layer2_polygon)

# creates SpatialIndex
layer1_polyline.dataProvider().createSpatialIndex()
layer2_polygon.dataProvider().createSpatialIndex()

# gets features from layers
polyline_feat_all = layer1_polyline.dataProvider().getFeatures()

for polyline in polyline_feat_all:
    # writes in a check file the polyline
    file.write("polyline: " + str(polyline.id()) + "\n")

    polygon_feat_all = layer2_polygon.dataProvider().getFeatures()

    for polygon in polygon_feat_all:
        if polyline.geometry().intersects(polygon.geometry()) == 1:
            # writes in a check file the intersect polygon
            file.write("\t" + "intersect polygon: " + str(polygon.id()) + "\n")

# end time
end_time = time.time()

file.write("\n" + "Execution time: " + str(end_time - start_time) + "\n")

file.close()
====================================================================================





More information about the Qgis-developer mailing list