PyQGIS – Finding Polygon Self-Intersection Using PyQGIS on QGIS 3.4

pyqgis-3qgis-3self-intersection

My script:

from qgis.core import *
import qgis.utils
import processing, os, sys, glob

polys = QgsVectorLayer("/Users/john/shapefile/layer.shp","intersection","ogr")
output = "/Users/john/shapefile/intersection.shp"
processing.run("saga:polygonselfintersection", polys, output)

Generates the return message:

if param not in parameters or parameters[param.name()] is None:
TypeError: argument of type 'QgsVectorLayer' is not iterable

Best Answer

Tested in QGIS 3.6.0. I also needed to check some layers for its intersecting features and found that for me raw geometry loop works much faster than saga algorithm. In my case I had three polygon layers which I had to check. Here is a code:

import time
import processing
layers_list = iface.mapCanvas().layers()

start = time.time()
for lyr in layers_list:
    tech_layer = QgsVectorLayer("MultiPolygon?crs=EPSG:102014" , "tech_test", "memory")
    features = [f for f in lyr.getFeatures()]
    for n in features:
        geom = n.geometry()
        if any(geom.overlaps(init.geometry())==True for init in features if n.id()!=init.id()):
            tech_layer.dataProvider().addFeatures([n])
end = time.time()
elapsed_time = end - start  
et_str_1 = time.strftime("%H:%M:%S", time.gmtime(elapsed_time)) 

start = time.time()
for lyr in layers_list:
    out = processing.run('saga:polygonselfintersection', {'POLYGONS':lyr, 'INTERSECT': 'memory:tmp'})
end = time.time()
elapsed_time = end - start  
msec_str = str(int(elapsed_time%1*60))
et_str_2 = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

print ("Raw geometry check: \t{}".format(et_str_1))
print ("SAGA geometry check: \t{}".format(et_str_2))

Here are the results:

Raw geometry check:     00:00:13
SAGA geometry check:    00:00:24

In general this might not be too significant here but in case of checking much more layers raw geometry loop can be faster.