Vai al contenuto

Calcolare il rapporto tra perimetro del Convex Hull e area del poligono

Quesito: Come calcolare l'indice di compattezza di un poligono usando il rapporto tra il perimetro del suo inviluppo convesso (Convex Hull) e la sua area? Questo indice è utile per identificare poligoni irregolari o molto frastagliati.

Esempio: poligoni con forme irregolari hanno valori più alti dell'indice

Soluzione

L'indice di compattezza basato sul Convex Hull permette di misurare quanto un poligono si discosta dalla sua forma convessa ideale. Valori più alti indicano forme più irregolari, frastagliate o allungate.

Passo 1: Calcolare il perimetro del Convex Hull

Nel calcolatore di campi, creare un nuovo campo perim_convex di tipo decimale (double):

perimeter(convex_hull($geometry))

Questa espressione: - Calcola il Convex Hull (inviluppo convesso) del poligono - Restituisce il perimetro di questa geometria convessa

Passo 2: Calcolare l'indice di compattezza

Creare un nuovo campo indice_compattezza di tipo decimale (double):

round(
  perimeter(convex_hull($geometry)) / $area,
  4
)

Oppure, per un indice normalizzato (0-1), dove valori vicini a 1 indicano maggiore compattezza:

round(
  (4 * pi() * $area) / perimeter(convex_hull($geometry))^2,
  4
)

Passo 3: Interpretare i risultati

Ordinare il campo indice_compattezza per identificare: - Valori alti (primo metodo): Poligoni molto irregolari, frastagliati o allungati - Valori bassi (secondo metodo normalizzato): Poligoni molto irregolari

Soluzione completa con una singola espressione

Per ottenere direttamente l'indice di compattezza con informazioni aggiuntive:

map(
  'nome', "NOME_CAMPO",
  'area_mq', round($area, 2),
  'perim_convex', round(perimeter(convex_hull($geometry)), 2),
  'perim_effettivo', round($perimeter, 2),
  'indice_frastagli', round(perimeter(convex_hull($geometry)) / $area * 1000, 4),
  'compattezza_norm', round((4 * pi() * $area) / perimeter(convex_hull($geometry))^2, 4)
)

Questa espressione restituisce una mappa con: - Il nome dell'elemento - L'area in metri quadrati - Il perimetro del convex hull - Il perimetro effettivo del poligono - L'indice di frastagliatura (perimetro convex/area) - L'indice di compattezza normalizzato

Selezione dei poligoni più irregolari

Per selezionare i poligoni con maggiore irregolarità (es. top 10%):

perimeter(convex_hull(@geometry)) / $area >= 
  array_get(
    array_sort(
      array_agg(perimeter(convex_hull(@geometry)) / $area)
    ),
    floor(count($id) * 0.9)
  )

Applicazioni pratiche

Questo indice è particolarmente utile per:

  1. Analisi urbanistica: Identificare lotti edilizi irregolari o difficili da edificare
  2. Catasto: Validare la regolarità delle particelle catastali
  3. Ecologia del paesaggio: Analizzare la frammentazione di habitat naturali
  4. Agricoltura: Valutare l'efficienza di appezzamenti agricoli
  5. Pianificazione territoriale: Identificare aree che potrebbero beneficiare di ricomposizione fondiaria

Confronto tra forme

Forma Indice frastagl. Compattezza norm.
Cerchio ~0.0035 1.0
Quadrato ~0.004 ~0.7854
Rettangolo 2:1 ~0.006 ~0.628
Poligono frastagliato >0.01 <0.5

Note

  • La funzione convex_hull() genera il più piccolo poligono convesso che contiene la geometria originale
  • L'indice è sensibile alla scala: normalizzare dividendo per l'area rende il confronto indipendente dalle dimensioni
  • Per geometrie multipart, considerare l'uso di num_geometries() per filtrarle prima dell'analisi
  • L'indice di compattezza normalizzato (Circle Ratio) varia tra 0 e 1, con 1 che rappresenta un cerchio perfetto
  • Valori dell'indice di frastagliatura dipendono dall'unità di misura dell'area e del perimetro

Riferimenti