Calcolare Percentuale Superficie Poligoni Intersect Postgis

Calcolatore Percentuale Superficie Poligoni Intersect PostGIS

Calcola la percentuale di intersezione tra poligoni geografici utilizzando funzioni PostGIS. Inserisci i parametri richiesti per ottenere risultati precisi e visualizzazione grafica.

Percentuale Poligono 1 coperta dall’intersezione: 0.00%
Percentuale Poligono 2 coperta dall’intersezione: 0.00%
Rapporto tra le aree (Poligono 1 / Poligono 2): 0.00
Query PostGIS consigliata:

            

Guida Completa al Calcolo Percentuale Superficie Poligoni con PostGIS

Il calcolo delle percentuali di intersezione tra poligoni geografici è un’operazione fondamentale in sistemi GIS (Geographic Information Systems) e database spaziali come PostGIS. Questa guida approfondita ti fornirà tutte le conoscenze necessarie per eseguire questi calcoli con precisione, comprendere le funzioni PostGIS rilevanti e interpretare correttamente i risultati.

1. Fondamenti di PostGIS per il Calcolo di Intersezioni

PostGIS estende PostgreSQL con supporto per oggetti geografici, permettendo di eseguire query spaziali complesse. Le operazioni fondamentali per il calcolo delle percentuali di intersezione includono:

  • ST_Intersection: Calcola l’area di intersezione geometrica tra due poligoni
  • ST_Area: Restituisce l’area di una geometria (in unità del sistema di riferimento)
  • ST_Transform: Converte tra diversi sistemi di riferimento (SRID)
  • ST_MakeValid: Corregge geometrie non valide che potrebbero causare errori

La formula base per calcolare la percentuale di intersezione è:

(ST_Area(ST_Intersection(poligono1, poligono2)) / ST_Area(poligono1)) * 100

2. Query PostGIS per Calcoli Percentuali

Ecco alcune query PostGIS essenziali per diversi scenari:

Scenario Query PostGIS Descrizione
Percentuale semplice SELECT (ST_Area(ST_Intersection(geom1, geom2)) / ST_Area(geom1)) * 100 AS percentuale FROM tabella; Calcola la percentuale di geom1 coperta da geom2
Con trasformazione SRID SELECT (ST_Area(ST_Intersection(ST_Transform(geom1, 3003), ST_Transform(geom2, 3003))) / ST_Area(ST_Transform(geom1, 3003))) * 100 AS percentuale FROM tabella; Esegue il calcolo in un SRID specifico (es. 3003 per Italia)
Con gestione geometrie non valide SELECT (ST_Area(ST_Intersection(ST_MakeValid(geom1), ST_MakeValid(geom2))) / ST_Area(ST_MakeValid(geom1))) * 100 AS percentuale FROM tabella; Corregge automaticamente geometrie non valide
Con aggregazione per gruppi SELECT categoria, AVG((ST_Area(ST_Intersection(geom1, geom2)) / ST_Area(geom1)) * 100) AS media_percentuale FROM tabella GROUP BY categoria; Calcola la media percentuale per categorie

3. Considerazioni Pratiche e Best Practice

  1. Sistemi di Riferimento (SRID):

    Il SRID influisce direttamente sui risultati delle aree. Ad esempio:

    • EPSG:4326 (WGS84) usa gradi decimali – non adatto per calcoli di area precisi
    • EPSG:3857 (Web Mercator) distorce le aree alle alte latitudini
    • Sistemi locali come EPSG:3003/3004 (Italia) sono ideali per calcoli nazionali

    Sempre trasformare in un SRID proiettato (in metri) prima di calcolare le aree:

    ST_Transform(geometria, SRID_destinazione)
  2. Precisione e Arrotondamento:

    I risultati possono avere molte cifre decimali. Usa ROUND(valore, decimali) per standardizzare l’output:

    SELECT ROUND((ST_Area(ST_Intersection(geom1, geom2)) / ST_Area(geom1)) * 100, 2) AS percentuale_arrotondata;
  3. Performance con Grandi Dataset:

    Per ottimizzare query su grandi tabelle:

    • Crea indici spaziali: CREATE INDEX idx_nome ON tabella USING GIST(geometria);
    • Usa ST_Intersects per filtrare prima dell’intersezione: WHERE ST_Intersects(geom1, geom2)
    • Considera il partizionamento per dati geografici estesi

4. Errori Comuni e Soluzioni

Errore Causa Probabile Soluzione
Risultati area = 0 Geometrie in SRID non proiettato (es. 4326) Trasforma in SRID proiettato (es. 3003 per Italia)
Errore “Geometry is invalid” Poligoni auto-intersecanti o non chiusi Usa ST_MakeValid o ST_IsValid per diagnosticare
Percentuali > 100% Poligono 2 completamente contenuto in poligono 1 Verifica la logica – potrebbe essere il comportamento atteso
Query lenta Mancanza di indici spaziali o geometrie complesse Aggiungi indici GIST e semplifica geometrie se possibile
Risultati diversi da QGIS Differenze nel sistema di riferimento o tolleranze Verifica SRID e parametri di precisione in entrambi gli strumenti

5. Applicazioni Pratiche nei Settori

Il calcolo delle percentuali di intersezione tra poligoni ha applicazioni in numerosi settori:

  • Urbanistica e Pianificazione Territoriale:
    • Calcolo percentuale aree edificabili in zone vincolate
    • Analisi copertura servizi (scuole, ospedali) per quartieri
    • Verifica conformità ai piani regolatori
  • Ambiente e Agricoltura:
    • Sovrapposizione tra aree protette e terreni agricoli
    • Monitoraggio deforestazione in aree protette
    • Calcolo indici di naturalità per valutazioni ambientali
  • Trasporti e Infrastrutture:
    • Analisi copertura rete stradale in aree urbane
    • Pianificazione corridoi per nuove infrastrutture
    • Valutazione impatto ambientale di nuove opere
  • Marketing e Analisi Territoriale:
    • Segmentazione mercato per aree di influenza
    • Analisi penetrazione commercial in zone target
    • Ottimizzazione reti distributive

6. Confronto tra Metodi di Calcolo

Esistono diversi approcci per calcolare le percentuali di intersezione. Ecco un confronto tra i metodi più comuni:

Metodo Precisione Performance Complessità Casi d’Uso Ideali
PostGIS (ST_Intersection) ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ (con indici) Media Analisi su database, elaborazioni batch, integrazione con altri dati SQL
QGIS (Strumenti vettoriali) ⭐⭐⭐⭐⭐ ⭐⭐ (per grandi dataset) Bassa Analisi ad-hoc, visualizzazione immediata, prototipazione
Python (Shapely/GeoPandas) ⭐⭐⭐⭐ ⭐⭐⭐ Alta Elaborazioni custom, integrazione in pipeline ETL, automazione
Google Earth Engine ⭐⭐⭐ ⭐⭐⭐⭐⭐ Molto Alta Analisi su vasta scala, dati raster+vettoriali, cloud processing
Excel + coordinate ⭐⭐ ⭐⭐⭐⭐ Molto Bassa Calcoli semplici, analisi preliminari, condivisione con non-tecnici

PostGIS si distingue per:

  • Precisione matematica elevata grazie all’uso di GEOS
  • Possibilità di integrare i calcoli spaziali con altri dati relazionali
  • Performance ottimizzabili con indici spaziali e partizionamento
  • Capacità di gestire operazioni complesse (unioni, differenze, buffer)

7. Ottimizzazione delle Query PostGIS

Per massimizzare le performance nelle analisi spaziali:

  1. Indici Spaziali:

    Crea sempre indici GIST sulle colonne geometriche:

    CREATE INDEX idx_nome_tabella_geometria ON nome_tabella USING GIST(geometria);

    Per tabelle grandi, considera indici parziali:

    CREATE INDEX idx_parziale ON tabella USING GIST(geom) WHERE condizione;
  2. Filtro Preliminare con ST_Intersects:

    Prima di calcolare l’intersezione, filtra con:

    WHERE ST_Intersects(geom1, geom2)

    Questo evita calcoli costosi su geometrie che non si intersecano.

  3. Semplificazione Geometrie:

    Per analisi approssimate, semplifica le geometrie:

    ST_Simplify(geometria, tolleranza)
    ST_SimplifyPreserveTopology(geometria, tolleranza)
  4. Clusterizzazione:

    Per analisi su aree vaste, usa ST_ClusterWithin:

    SELECT ST_ClusterWithin(geom, distanza) FROM punti;
  5. Materialized Views:

    Per query complesse eseguite frequentemente, crea viste materializzate:

    CREATE MATERIALIZED VIEW mv_risultati AS
    SELECT ... [query complessa] ...;

8. Integrazione con Altri Strumenti GIS

PostGIS si integra perfettamente con altri strumenti del mondo GIS:

  • QGIS:
    • Collega PostGIS come layer tramite “Aggiungi layer PostGIS”
    • Esegui query direttamente nell’interfaccia DB Manager
    • Visualizza risultati con stili avanzati
  • GeoServer:
    • Pubblica layer PostGIS come WMS/WFS
    • Crea stili SLD per visualizzazione web
    • Usa le funzioni PostGIS per filtrare dinamicamente i dati
  • Python (GeoPandas):

    Esempio di connessione e analisi:

    import geopandas as gpd
    from sqlalchemy import create_engine
    
    # Connessione a PostGIS
    engine = create_engine('postgresql://user:password@host:port/dbname')
    gdf = gpd.read_postgis("SELECT geom, other_columns FROM table", engine)
    
    # Calcolo intersezioni in Python
    gdf['intersection_area'] = gdf.geometry.area
    gdf['percentage'] = (gdf.intersection_area / gdf.geometry.area) * 100
  • Leaflet/OpenLayers:
    • Visualizza dati PostGIS tramite GeoJSON
    • Implementa interazioni utente per selezionare aree
    • Mostra risultati dei calcoli in popup

9. Casi Studio Reali

Ecco alcuni esempi concreti di applicazione di questi calcoli:

  1. Analisi Copertura Verde Urbana (Comune di Milano):

    Obiettivo: Calcolare la percentuale di aree verdi (parchi, giardini) in ogni quartiere.

    Soluzione:

    SELECT
        q.nome_quartiere,
        ROUND((ST_Area(ST_Intersection(q.geom, v.geom)) /
               ST_Area(q.geom)) * 100, 2) AS percentuale_verde
    FROM
        quartieri q
    JOIN
        aree_verdi v ON ST_Intersects(q.geom, v.geom)
    GROUP BY
        q.id, q.nome_quartiere, q.geom;

    Risultato: Mappa interattiva con classificazione quartieri per livelli di verde.

  2. Valutazione Rischio Alluvionale (Regione Emilia-Romagna):

    Obiettivo: Identificare la percentuale di edifici in aree a rischio alluvione.

    Soluzione:

    WITH edifici_rischio AS (
        SELECT
            e.id_edificio,
            ST_Intersection(e.geom, r.geom) AS geom_intersezione
        FROM
            edifici e
        JOIN
            aree_rischio r ON ST_Intersects(e.geom, r.geom)
    )
    SELECT
        r.livello_rischio,
        COUNT(e.id_edificio) AS num_edifici,
        SUM(ST_Area(e.geom_intersezione)) AS area_totale_intersezione,
        ROUND(AVG((ST_Area(e.geom_intersezione) / ST_Area(e.geom)) * 100), 2)
            AS media_percentuale_copertura
    FROM
        edifici_rischio e
    JOIN
        aree_rischio r ON ST_Contains(r.geom, e.geom_intersezione)
    GROUP BY
        r.livello_rischio;

    Risultato: Report con priorità di intervento per aree critiche.

  3. Ottimizzazione Rete Distributiva (Azienda Energetica):

    Obiettivo: Valutare la copertura della rete di distribuzione gas in relazione ai centri abitati.

    Soluzione:

    SELECT
        c.nome_comune,
        ROUND((ST_Length(ST_Intersection(c.geom, ST_Buffer(r.geom, 500))) /
               ST_Length(r.geom)) * 100, 2) AS percentuale_copertura
    FROM
        reti_distribuzione r
    CROSS JOIN
        comuni c
    WHERE
        ST_DWithin(r.geom, c.geom, 1000)
    ORDER BY
        percentuale_copertura DESC;

    Risultato: Identificazione aree con bassa copertura per pianificazione estensioni rete.

10. Risorse per Approfondire

11. Domande Frequenti

  1. Q: Perché ottengo risultati diversi tra PostGIS e QGIS?

    A: Le differenze possono dipendere da:

    • Diversi sistemi di riferimento (SRID) usati
    • Parametri di precisione e tolleranze differenti
    • Metodi di calcolo dell’area (es. sferica vs piana)
    • Versione delle librerie GEOS sottostanti

    Soluzione: Verifica che entrambi gli strumenti usino lo stesso SRID e le stesse impostazioni di precisione.

  2. Q: Come gestire geometrie molto complesse che causano errori?

    A: Per geometrie con molti vertici:

    • Usa ST_Simplify per ridurre la complessità
    • Applica ST_MakeValid per correggere automaticamente
    • Considera di suddividere geometrie molto grandi
    • Aumenta la memoria disponibile per PostGIS (work_mem in postgresql.conf)
  3. Q: È possibile calcolare le percentuali per gruppi di poligoni?

    A: Sì, usando GROUP BY con funzioni di aggregazione:

    SELECT
        categoria,
        AVG((ST_Area(ST_Intersection(geom1, geom2)) / ST_Area(geom1)) * 100) AS media_percentuale
    FROM
        tabella
    GROUP BY
        categoria;
  4. Q: Come esportare i risultati per usarli in altri software?

    A: Puoi esportare in vari formati:

    • CSV: COPY (query) TO '/path/to/file.csv' WITH CSV HEADER;
    • GeoJSON: Usa ST_AsGeoJSON e aggrega i risultati
    • Shapefile: Esporta tramite QGIS o ogr2ogr
    • Excel: Usa \copy in psql o strumenti come pgAdmin
  5. Q: Qual è il SRID migliore per calcoli in Italia?

    A: Per l’Italia, i sistemi di riferimento consigliati sono:

    • EPSG:3003: Monte Mario / Italy zone 1 (Nord e Centro)
    • EPSG:3004: Monte Mario / Italy zone 2 (Sud e Isole)
    • EPSG:6706: ETRS89 / UTM zone 32N (alternativa moderna)
    • EPSG:6707: ETRS89 / UTM zone 33N

    Evita EPSG:4326 (WGS84) per calcoli di area, in quanto è un sistema geografico (in gradi) non adatto per misure di distanza/area.

Leave a Reply

Your email address will not be published. Required fields are marked *