Skip to content

Instantly share code, notes, and snippets.

@Alex-Devoid
Last active January 10, 2020 22:17
Show Gist options
  • Select an option

  • Save Alex-Devoid/5e643922c7936f6d37ecb2b2c85d1a5d to your computer and use it in GitHub Desktop.

Select an option

Save Alex-Devoid/5e643922c7936f6d37ecb2b2c85d1a5d to your computer and use it in GitHub Desktop.
PyQGIS: Check if each feature intersects with features from multiple layers
canvas= qgis.utils.iface.mapCanvas()
layers = dict((k.name(),i) for i, k in enumerate(canvas.layers()))
print(layers)
## parcel layer showing property
layer1 = canvas.layer(14)
provider = layer1.dataProvider()
#main highway
#comine the geometries of all the features in each buffer
l_buffer = QgsGeometry.fromWkt('GEOMETRYCOLLECTION EMPTY')
leftBuffer11 = canvas.layer(5)
for feature in leftBuffer11.getFeatures():
l_buffer = l_buffer.combine(feature.geometry())
c_buffer = QgsGeometry.fromWkt('GEOMETRYCOLLECTION EMPTY')
centerBuffer11 = canvas.layer(4)
for feature in centerBuffer11.getFeatures():
c_buffer = c_buffer.combine(feature.geometry())
r_buffer = QgsGeometry.fromWkt('GEOMETRYCOLLECTION EMPTY')
rightBuffer11 = canvas.layer(3)
for feature in rightBuffer11.getFeatures():
r_buffer = r_buffer.combine(feature.geometry())
#connection to highway
l_buffer_connection = QgsGeometry.fromWkt('GEOMETRYCOLLECTION EMPTY')
leftBuffer11_connection = canvas.layer(2)
for feature in leftBuffer11_connection.getFeatures():
l_buffer_connection = l_buffer_connection.combine(feature.geometry())
c_buffer_connection = QgsGeometry.fromWkt('GEOMETRYCOLLECTION EMPTY')
centerBuffer11_connection = canvas.layer(1)
for feature in centerBuffer11_connection.getFeatures():
c_buffer_connection = c_buffer_connection.combine(feature.geometry())
r_buffer_connection = QgsGeometry.fromWkt('GEOMETRYCOLLECTION EMPTY')
rightBuffer11_connection = canvas.layer(0)
for feature in rightBuffer11_connection.getFeatures():
r_buffer_connection = r_buffer_connection.combine(feature.geometry())
#create the fields for the buffer checks
layer1.startEditing()
#main highway
myField = QgsField( 'buLeft', QVariant.String )
myField1 = QgsField( 'buRight', QVariant.String )
myField2 = QgsField( 'buCenter', QVariant.String )
#Highway connection
myFieldc = QgsField( 'buLeftc', QVariant.String )
myField1c = QgsField( 'buRightc', QVariant.String )
myField2c = QgsField( 'buCenterc', QVariant.String )
## field for all buffers
myField3 = QgsField( 'buAll', QVariant.String )
provider.addAttributes([myField,myField1,myField2,myFieldc,myField1c,myField2c,myField3])
layer1.updateFields()
idxLc = layer1.fields().indexFromName('buLeftc')
idxRc = layer1.fields().indexFromName('buRightc')
idxCc = layer1.fields().indexFromName('buCenterc')
idxL = layer1.fields().indexFromName('buLeft')
idxR = layer1.fields().indexFromName('buRight')
idxC = layer1.fields().indexFromName('buCenter')
idxA = layer1.fields().indexFromName('buAll')
features1 = layer1.getFeatures()
##check it each parcel intersects with each buffer
for feature in features1:
intersectL = feature.geometry().intersects(l_buffer)
intersectC = feature.geometry().intersects(c_buffer)
intersectR = feature.geometry().intersects(r_buffer)
intersectLc = feature.geometry().intersects(l_buffer_connection)
intersectCc = feature.geometry().intersects(c_buffer_connection)
intersectRc = feature.geometry().intersects(r_buffer_connection)
if all( [intersectL,intersectC,intersectR] ) or all( [intersectLc,intersectCc,intersectRc] ):
intersectA = True
else:
intersectA = False
layer1.changeAttributeValue(feature.id(), idxLc, str(intersectLc))
layer1.changeAttributeValue(feature.id(), idxRc, str(intersectRc))
layer1.changeAttributeValue(feature.id(), idxCc, str(intersectCc))
layer1.changeAttributeValue(feature.id(), idxL, str(intersectL))
layer1.changeAttributeValue(feature.id(), idxR, str(intersectR))
layer1.changeAttributeValue(feature.id(), idxC, str(intersectC))
layer1.changeAttributeValue(feature.id(), idxA, str(intersectA))
layer1.commitChanges()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment