Skip to content

Instantly share code, notes, and snippets.

@mdouchin
Created March 29, 2024 16:14
Show Gist options
  • Save mdouchin/b55cb1a33c07aba23de32731f01329df to your computer and use it in GitHub Desktop.
Save mdouchin/b55cb1a33c07aba23de32731f01329df to your computer and use it in GitHub Desktop.
QGIS - Set layers substring filter with WHERE clause depending on map canvas extent and intersected polygons
class filterLayersFromExtent:
polygon_layer = {
'name': 'polygons',
'field': 'code',
'layer': None
}
target_layers = [
{
'name': 'observation',
'field': 'departement',
'layer': None
}
]
def __init__(self):
# Set layers
p = QgsProject.instance()
# QGIS polygon layer
self.polygon_layer['layer'] = p.mapLayersByName(
self.polygon_layer['name']
)[0]
# QGIS target layers
for layer in self.target_layers:
layer['layer'] = p.mapLayersByName(
layer['name']
)[0]
self.canvas = iface.mapCanvas()
self.canvas.extentsChanged.connect(self.onCanvasExtentsChanged)
def getSubsetString(self, extent, layer):
# Request polygon layer data in the map extent
request = QgsFeatureRequest(extent)
request.setFlags(QgsFeatureRequest.ExactIntersect)
features = self.polygon_layer['layer'].getFeatures(request)
# Get ids of the found features
ids = []
field = self.polygon_layer['field']
for feature in features:
ids.append(feature[field])
# Compute subset string filter
target_field = layer['field']
ids_string = "'" + ("', '").join(ids) + "'"
return f'"{target_field}" IN ( {ids_string} )'
def onCanvasExtentsChanged(self):
# Get polygons in canvas
extent = self.canvas.extent()
# For each target layer
for target_layer in self.target_layers:
# Get the subset string
subset_string = self.getSubsetString(extent, target_layer)
print(subset_string)
# Apply the subset string to the layer
layer = target_layer['layer']
if layer and layer.subsetString() != subset_string:
print(f"{target_layer['name']}: subset string modified !")
layer.setSubsetString(subset_string)
test = filterLayersFromExtent()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment