Дмитрий, запустил ваш скрипт после пары import'ов, но к сожалению не увидел визуального изменения слоя, может быть что-то делаю не так? Поле id - есть, в скрипте изменил слой test на свой
Спойлер
Код: Выделить всё
from qgis.PyQt.QtCore import *
from qgis.utils import iface
from qgis.core import *
srcLayer = iface.activeLayer()
dstLayerName = 'SelfSymDifference'
idName = 'idSelfSymDifference'
srcLayer.startEditing()
myField = QgsField(idName, QVariant.Int )
srcLayer.addAttribute( myField )
srcLayer.updateFields()
idx = srcLayer.fieldNameIndex(idName)
i = 0
for f in srcLayer.getFeatures():
f[idx] = i
i += 1
srcLayer.updateFeature( f )
srcLayer.commitChanges()
tpl = '''
With CTE AS(
SELECT '1' AS grp, st_union(st_intersection(a.geometry, b.geometry)) as geometry
FROM %s a JOIN WV2_B45_20160625_C_NDVI_F165_S_Sieve_Convexhull-9 b ON (
(a.%s < b.%s)and
(a.geometry is NOT NULL)and
(b.geometry is NOT NULL)and
(st_intersects(a.geometry, b.geometry))
)
GROUP BY grp
)
SELECT st_difference(WV2_B45_20160625_C_NDVI_F165_S_Sieve_Convexhull-9.geometry, CTE.geometry) FROM %s
JOIN CTE'''
sql = tpl % (srcLayer.name(), idName, idName, srcLayer.name())
layer = QgsVectorLayer("?query="+sql, dstLayerName, "virtual")
QgsMapLayerRegistry.instance().addMapLayer(layer, True)
Что могло пойти не так?