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.
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
-
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)
-
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;
-
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
- Crea indici spaziali:
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:
-
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;
-
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.
-
Semplificazione Geometrie:
Per analisi approssimate, semplifica le geometrie:
ST_Simplify(geometria, tolleranza) ST_SimplifyPreserveTopology(geometria, tolleranza)
-
Clusterizzazione:
Per analisi su aree vaste, usa ST_ClusterWithin:
SELECT ST_ClusterWithin(geom, distanza) FROM punti;
-
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:
-
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.
-
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.
-
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
-
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.
-
Q: Come gestire geometrie molto complesse che causano errori?
A: Per geometrie con molti vertici:
- Usa
ST_Simplifyper ridurre la complessità - Applica
ST_MakeValidper correggere automaticamente - Considera di suddividere geometrie molto grandi
- Aumenta la memoria disponibile per PostGIS (
work_memin postgresql.conf)
- Usa
-
Q: È possibile calcolare le percentuali per gruppi di poligoni?
A: Sì, usando
GROUP BYcon funzioni di aggregazione:SELECT categoria, AVG((ST_Area(ST_Intersection(geom1, geom2)) / ST_Area(geom1)) * 100) AS media_percentuale FROM tabella GROUP BY categoria; -
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_AsGeoJSONe aggrega i risultati - Shapefile: Esporta tramite QGIS o
ogr2ogr - Excel: Usa
\copyin psql o strumenti come pgAdmin
- CSV:
-
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.