Dati due layer poligonali (per esempio le regioni italiane e il quadro di unione del DEM Tinitaly); assegnare, per ogni riquadro, il codice univoco (cod_reg) della regione che ha maggior estensione all’interno del riquadro stesso.
Per capire meglio, ecco uno screenshot di esempio:
all’interno del riquadro (rosso) ricade una porzione di territorio siciliano (cod_reg=19) e una porzione del territorio calabrese (cod_reg=18): assegnare al riquadro il cod_reg corrispondente alla porzione con area maggiore, in questo caso, la porzione di territorio siciliano è maggiore di quello calabrese.
Per versione di QGIS < 3.24 Tisler:
Il quesito è risolto usando le potenti espressioni di QGIS:
array_reverse(
aggregate(
layer:='Reg01012022_G_Wgs84',
aggregate:='array_agg',
expression:="cod_reg",
filter:=intersects( $geometry,geometry(@parent)),
order_by:=area(intersection(geometry(@parent),$geometry )))
)[0]
Aggrego in un Array tutti i cod_reg
intersecantesi per ogni riquadro, li ordino in funzione dell’area e prendo quella con estensione maggiore.
Note aggiuntive:
- l’opzione
order_by
ordina, by default, in senso ascendente e quindi occorre invertire il senso usandoarray_reverse
, oppure, senza usarearray_reverse
ma estraendo l’ultimo valore dell’array sostituendo[0]
con[-1]
.
Per versione di QGIS >= 3.24 Tisler:
overlay_intersects(
'Reg01012022_G_Wgs84',
"cod_reg",
sort_by_intersection_size:='des')[0] -- sort_by_intersection_size Nuovo parametro
Utilizzando le funzioni di Overlay_* e il nuovo parametro sort_by_intersection_size
che semplifica enormemente la ricerca dei valori (circa tre volte più veloce!!!).
Oppure con una query SQL in un database SpatiaLite/PostGIS:
SELECT
t.pk AS pk,
t.geom AS geom,
t.max_area_regione AS COD_REG
FROM
(
SELECT
re.pk,
re.geom,
FIRST_VALUE(COD_REG) OVER (
PARTITION BY re.pk
ORDER BY
ST_area(ST_intersection(re.geom, ri.geom)) DESC
) AS max_area_regione
FROM
regioni_istat ri
JOIN reticolo re ON st_intersects(ri.geom, re.geom)
) t
GROUP BY
1,
2
Nella query si fa uso delle Windows Function, studiate appositamente per risolvere questi casi.

NOTE FINALI: Le espressioni di QGIS sono sempre più potenti e permettono di risolvere molti quesiti sia alfanumerici che spaziali, quest’ultimo parametro (sort_by_intersection_size) introdotto di recente nella funzione di Overlay_intersects semplifica notevolmente i tempi di elaborazione in quanto permette di ordinare i risultati dell’Array in funzione della dimensione dell’intersezione.
RIFERIMENTI
- QGIS : https://www.qgis.org/en/site/
- SpatiaLite : https://www.gaia-gis.it/fossil/libspatialite/index
- SQLite : https://www.sqlitetutorial.net/
RINGRAZIAMENTI
- Andrea Borruso per aver dedicato il suo tempo alla risoluzione di un problema legato agli Array.
Dati e Progetto
I MIEI CANALI – ISCRIVITI
- Telegram : https://t.me/pigrecoinfinito
- YouTube : https://www.youtube.com/c/TotòFiandaca
Se il blog post Ti è piaciuto cliccate su ‘Mi piace’, grazie!!!
if you liked the blog post click on ‘Like’, thank you !!!