<html><head><style type='text/css'>p { margin: 0; }</style></head><body><div style='font-family: times new roman,new york,times,serif; font-size: 12pt; color: #000000'><font face="times new roman, new york, times, serif" size="3">Thank you very much.</font><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;">It's a good explanation.</div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;">Only another think.</div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;">Which is the difference to create a spatial index in this way:</div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div><div><span style="font-family: 'times new roman', 'new york', times, serif; font-size: 16px;">feat_all</span><font face="times new roman, new york, times, serif">= layer.dataProvider().getFeatures()</font></div><div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;">layer_spIndex = QgsSpatialIndex()</div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;">for feat in feat_all:</div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;">    layer_spIndex .insertFeature(feat)</div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;">Or in this way:</div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div><div><font face="times new roman, new york, times, serif">layer.dataProvider().createSpatialIndex()</font></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;">It seems to work only in the first case.</div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;">Thanks</div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;">Stefano</div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br></div><div style="color: rgb(0, 0, 0); font-family: 'times new roman', 'new york', times, serif; font-size: 12pt;"><br><br><hr id="zwchr"><div style="color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>Da: </b>"Daniel" <danielvaz@gmail.com><br><b>A: </b>"Stefano Masera" <stefano.masera@arpa.piemonte.it><br><b>Cc: </b>"qgis-developer" <qgis-developer@lists.osgeo.org><br><b>Inviato: </b>Lunedì, 4 novembre 2013 15:55:25<br><b>Oggetto: </b>Re: [Qgis-developer] Does spatial index improve performance using the class QgsGeometry.intersects()?<br><br><div dir="ltr"><div>Try it</div><div><br></div><a href="http://nathanw.net/2013/01/04/using-a-qgis-spatial-index-to-speed-up-your-code/" target="_blank">http://nathanw.net/2013/01/04/using-a-qgis-spatial-index-to-speed-up-your-code/</a><br>
<div><br></div><div>Best regards.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Nov 4, 2013 at 9:16 AM, Stefano Masera <span dir="ltr"><<a href="mailto:stefano.masera@arpa.piemonte.it" target="_blank">stefano.masera@arpa.piemonte.it</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi list,<br>
<br>
I don't know exactly how spatial index works, so I ask this question.<br>
I have two layers and I want to check which features of the first layer intersect the features of the second one.<br>
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.<br>
<br>
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.<br>
Note:<br>
- The first layer (polilyne) has 20000 features, the second (polygon) has 600 features.<br>
- To test the script insert the path of a check file<br>
- 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.<br>
<br>
Thanks<br>
Stefano Masera<br>
<br>
<br>
====================================================================================<br>
##input_layer1_polyline=vector<br>
##input_layer2_polygon=vector<br>
<br>
from qgis.core import *<br>
from PyQt4.QtCore import *<br>
from PyQt4.QtGui import *<br>
import processing<br>
import time<br>
<br>
# start time<br>
start_time = time.time()<br>
<br>
# opens a check file: insert path<br>
file = open("INSERT PATH","w")<br>
<br>
# gets vector layer<br>
layer1_polyline = processing.getobject(input_layer1_polyline)<br>
layer2_polygon = processing.getobject(input_layer2_polygon)<br>
<br>
# creates SpatialIndex<br>
layer1_polyline.dataProvider().createSpatialIndex()<br>
layer2_polygon.dataProvider().createSpatialIndex()<br>
<br>
# gets features from layers<br>
polyline_feat_all = layer1_polyline.dataProvider().getFeatures()<br>
<br>
for polyline in polyline_feat_all:<br>
    # writes in a check file the polyline<br>
    file.write("polyline: " + str(<a href="http://polyline.id" target="_blank">polyline.id</a>()) + "\n")<br>
<br>
    polygon_feat_all = layer2_polygon.dataProvider().getFeatures()<br>
<br>
    for polygon in polygon_feat_all:<br>
        if polyline.geometry().intersects(polygon.geometry()) == 1:<br>
            # writes in a check file the intersect polygon<br>
            file.write("\t" + "intersect polygon: " + str(<a href="http://polygon.id" target="_blank">polygon.id</a>()) + "\n")<br>
<br>
# end time<br>
end_time = time.time()<br>
<br>
file.write("\n" + "Execution time: " + str(end_time - start_time) + "\n")<br>
<br>
file.close()<br>
====================================================================================<br>
<br>
<br>
<br>
_______________________________________________<br>
Qgis-developer mailing list<br>
<a href="mailto:Qgis-developer@lists.osgeo.org" target="_blank">Qgis-developer@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/qgis-developer" target="_blank">http://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Daniel Vaz
</div>
</div><br></div></div></body></html>