Nelle applicazioni moderne vi è sempre più la necessità di usare dati spaziali. Basti pensare ai servizi che si usano quotidianamente come Google Maps per cercare i luoghi di nostro interesse e ottenere le indicazioni stradali, o i siti di prenotazione degli alberghi che ci mostrano su mappa la loro ubicazione. Per questa tipologia di dato è necessario usare un database spaziale.
Esistono diverse database spaziali tra cui il più famoso è sicuramente PostGIS. Ma cosa rende un normale database un database spaziale? Essenzialmente i database spaziali memorizzano e manipolano gli oggetti spaziali come qualsiasi altro oggetto del database.
Attenzione!!! Bisogna tenere presente che un sistema di gestione di database spaziali può essere utilizzato in applicazioni diverse dal mondo geografico. I database spaziali sono utilizzati, ad esempio, per gestire dati relativi all’anatomia del corpo umano, ai circuiti integrati su larga scala, alle strutture molecolari e ai campi elettromagnetici.
In questo articolo illustreremo brevemente l’evoluzione dei database spaziali, per poi passare in rassegna i tre aspetti che associano i dati spaziali a un database:
- I tipi di dati spaziali si riferiscono a forme come punto, linea e poligono;
- L’indicizzazione spaziale multidimensionale che viene utilizzata per elaborare in modo efficiente le operazioni spaziali;
- Le funzioni spaziali, definite in SQL, utili per interrogare le proprietà e le relazioni spaziali.
La combinazione dei tipi di dati spaziali, degli indici e delle funzioni fornisce una struttura flessibile al fine di ottimizzare le prestazioni e le analisi.
Breve storia
Nelle implementazioni GIS di prima generazione, tutti i dati spaziali venivano memorizzati in file che dovevano essere interpretati e manipolati mediante un software GIS speciale. Questi sistemi di gestione di prima generazione, ancora oggi utilizzati come QGIS, sono stati progettati per soddisfare le esigenze degli utenti in cui tutti i dati richiesti sono all’interno del dominio organizzativo dell’utente. Si tratta di sistemi di solito proprietari e autonomi, costruiti specificamente per gestire i dati spaziali.
I sistemi spaziali di seconda generazione, invece, memorizzano alcuni dati in database relazionali (di solito gli “attributi” o le parti non spaziali), ma mancano della flessibilità offerta dall’integrazione diretta.
I veri database spaziali sono nati quando si è iniziato a trattare le caratteristiche spaziali come oggetti del database. I database spaziali integrano completamente i dati spaziali con un database relazionale. L’orientamento del sistema cambia da GIS-centrico a database-centrico.
Aspetti fondamentali dei database spaziali
Di seguito analizziamo i tre aspetti fondamentali che caratterizzano un database spaziale.
Tipi di dati spaziali
Un normale database gestisce diverse tipologie di dato tra cui stringhe, numeri e date. Un database spaziale aggiunge altri tipi (spaziali) per rappresentare le caratteristiche geografiche. Questi tipi di dati spaziali astraggono e incapsulano strutture spaziali come i confini e le dimensioni. Per molti aspetti, i tipi di dati spaziali possono essere intesi semplicemente come forme. I tipi di dati spaziali sono organizzati in una gerarchia di tipi. Ogni sottotipo eredita la struttura (attributi) e il comportamento (metodi o funzioni) del suo tipo superiore. Di seguito è mostrata la gerarchia dei tipi base dei dati spaziali.
Indici spaziali e bounding box
Un normale database prevede indici per consentire un accesso rapido e casuale a sottoinsiemi di dati. L’indicizzazione per i tipi di dato standard (es., numeri, stringhe, date) viene solitamente effettuata con indici B-tree.
Un B-tree suddivide i dati utilizzando l’ordine naturale di ordinamento per inserire i dati in un albero gerarchico. L’ordine naturale di numeri, stringhe e date è semplice da determinare: ogni valore è minore, maggiore o uguale a ogni altro valore.
Ma poiché i poligoni possono sovrapporsi, possono essere contenuti l’uno nell’altro e sono disposti in uno spazio bidimensionale (o più), non è possibile utilizzare un B-tree per indicizzarli in modo efficiente. I database spaziali forniscono un “indice spaziale” che risponde invece alla domanda “quali oggetti si trovano all’interno di questo particolare riquadro di delimitazione (detto anche bounding box)?”.
Un bounding box è il più piccolo rettangolo – parallelo agli assi delle coordinate – in grado di contenere una determinata caratteristica. Ma perché si usano i bounding box? Se vogliamo rispondere all’interrogazione se un poligono di forma arbitraria è contenuto all’interno di un altro poligono, anch’esso di forma arbitraria, la computazione può risultare molto onerosa. Diversamente usare dei rettangoli semplifica di molto il costo computazionale. Anche i poligoni e le linee più complesse possono essere rappresentati da un semplice bounding box.
Per essere utili, gli indici devono essere veloci. Quindi, invece di fornire risultati esatti, come fanno i B-tree, gli indici spaziali forniscono risultati approssimativi. La domanda “quali linee sono all’interno di questo poligono?” sarà invece interpretata da un indice spaziale come “quali linee hanno bounding box che sono contenute all’interno dei bounding box di questo poligono?”.
Gli indici spaziali effettivamente implementati dai vari database variano notevolmente. Le implementazioni più comuni sono R-Tree e Quadtree (utilizzate in PostGIS), ma esistono anche indici basati su griglie e GeoHash implementati in altri database spaziali.
Funzioni spaziali
Per manipolare i dati durante un’interrogazione, un normale database fornisce funzioni quali la concatenazione di stringhe, l’esecuzione di operazioni di hash su stringhe, l’esecuzione di operazioni matematiche su numeri e l’estrazione di informazioni da date.
Un database spaziale fornisce, oltre alla funzioni tradizionali dei database, una serie completa di funzioni per analizzare le componenti geometriche, determinare le relazioni spaziali e manipolare le geometrie. Queste funzioni spaziali costituiscono la base di qualsiasi progetto spaziale.
La maggior parte delle funzioni spaziali può essere raggruppata in una delle cinque categorie seguenti:
- Conversione: funzioni che convertono le geometrie in formati di dati esterni
- Gestione: funzioni che gestiscono le informazioni sulle tabelle spaziali e la loro amministrazione.
- Recupero: funzioni che recuperano le proprietà e le misure di una geometria
- Confronto: funzioni che confrontano due geometrie rispetto alla loro relazione spaziale
- Generazione: funzioni che generano nuove geometrie a partire da altre
L’elenco delle possibili funzioni è molto ampio, ma un insieme comune di funzioni è definito dall’OGC (Open Geospatial Consortium) mediante lo standard SFSQL (Simple Features for SQL).
PostGIS
PostGIS trasforma il sistema di gestione dei database PostgreSQL in un database spaziale, aggiungendo il supporto per le tre caratteristiche che abbiamo discusso in precedenza: tipi spaziali, indici spaziali e funzioni spaziali.
PostgreSQL
PostgreSQL è un potente sistema di gestione di database relazionali (RDBMS). È rilasciato sotto una licenza di tipo BSD ed è quindi un software libero e open source. Come molti altri programmi open source, PostgreSQL non è controllato da una singola azienda, ma ha una comunità globale di sviluppatori e aziende che lo sviluppano.
PostgreSQL è stato progettato fin dall’inizio pensando all’estensione dei tipi, ovvero alla possibilità di aggiungere nuovi tipi di dati, funzioni e indici in fase di esecuzione. Per questo motivo, l’estensione PostGIS può essere sviluppata da un team di sviluppo separato, pur integrandosi perfettamente nel database PostgreSQL di base.
Perché scegliere PostgreSQL?
Una domanda frequente di chi ha familiarità con i database open source è: “Perché PostGIS non è stato costruito su MySQL?”.
Le principali motivazioni sono dovute al fatto che PostgreSQL ha:
- Affidabilità comprovata e integrità transazionale di default (ACID)
- Supporto attento agli standard SQL (SQL92 completo)
- Estensione dei tipi e delle funzioni
- Modello di sviluppo orientato alla comunità
- Nessun limite alle dimensioni delle colonne (tuple “TOAST”) per supportare oggetti GIS di grandi dimensioni
- Struttura di indice generica (GiST) per consentire l’indice R-Tree
- Facilità di aggiungere funzioni personalizzate
Infine, PostgreSQL offre un percorso di sviluppo molto semplice per aggiungere nuovi tipi spaziali.
Poiché il percorso di sviluppo per l’aggiunta di tipi a PostgreSQL era così semplice, gli sviluppatori hanno scelto questo database per gestire i dati spaziali. Quando MySQL ha rilasciato i tipi spaziali di base nella versione 4.1, il team di PostGIS ha dato un’occhiata al loro codice e la loro analisi ha rafforzato la decisione originale di utilizzare PostgreSQL.
Poiché gli oggetti spaziali di MySQL dovevano essere modificati in base al tipo di stringa come caso speciale, il codice MySQL è stato distribuito sull’intera base di codice. Lo sviluppo di PostGIS 0.1 è durato meno di un mese. Realizzare un sistema per MySQL avrebbe richiesto molto più tempo.
Perché non i file?
Lo Shapefile (e altri formati come il Geodatabase File di Esri e il GeoPackage) è, ancora oggi, un modo standard di archiviare e interagire con i dati spaziali fin dalla nascita del software GIS. Tuttavia, questi file “piatti” presentano i seguenti svantaggi:
- I file richiedono un software speciale per la lettura e la scrittura. L’SQL è un’astrazione per l’accesso casuale ai dati e per l’analisi. Senza questa astrazione, è necessario scrivere da soli tutto il codice di accesso e di analisi.
- Gli utenti concorrenti possono causare corruzione e rallentamenti. Sebbene sia possibile scrivere codice aggiuntivo per garantire che le scritture multiple sullo stesso file non corrompano i dati, quando avrete risolto il problema e anche il problema di prestazioni associato, avrete scritto la parte migliore di un sistema di database. Perché non usare un database standard?
- Le domande complicate richiedono un software complicato per rispondere. Le domande complicate e interessanti (join spaziali, aggregazioni, ecc.) che sono esprimibili in una riga di SQL richiedono centinaia di righe di codice specializzato per rispondere quando si programma con i file.
La maggior parte degli utenti di PostGIS crea sistemi in cui più applicazioni dovranno accedere ai dati, quindi avere un metodo di accesso SQL standard semplifica la distribuzione e lo sviluppo. Alcuni utenti lavorano con grandi insiemi di dati; con i file, questi possono essere segmentati in più file, ma in un database possono essere memorizzati come un’unica grande tabella.
In sintesi, la combinazione di supporto per più utenti, query complesse ad hoc e prestazioni su grandi insiemi di dati è ciò che distingue i database spaziali dai sistemi basati su file.
Breve storia di PostGIS
Nel maggio del 2001, Refractions Research rilasciò la prima versione di PostGIS. PostGIS 0.1 aveva oggetti, indici e una manciata di funzioni. Il risultato era un database adatto alla memorizzazione e al recupero, ma non all’analisi.
Con l’aumentare del numero di funzioni, divenne evidente la necessità di un principio organizzativo. La specifica “Simple Features for SQL” (SFSQL) dell’Open Geospatial Consortium ha fornito tale struttura con linee guida per la denominazione delle funzioni e i requisiti.
Grazie al supporto di PostGIS per semplici analisi e join spaziali, Mapserver divenne la prima applicazione esterna a fornire la visualizzazione dei dati nel database.
Negli anni successivi il numero di funzioni di PostGIS è cresciuto, ma la sua potenza è rimasta limitata. Molte delle funzioni più interessanti (ad esempio, ST_Intersects(), ST_Buffer(), ST_Union()) erano molto difficili da codificare. Scriverle da zero prospettava anni di lavoro.
Fortunatamente è arrivato un secondo progetto, il “Geometry Engine, Open Source” o GEOS. La libreria GEOS fornisce gli algoritmi necessari per implementare le specifiche SFSQL. Collegandosi a GEOS, PostGIS ha fornito un supporto completo per SFSQL dalla versione 0.8.
Con la crescita della capacità di dati di PostGIS, è emerso un altro problema: la rappresentazione utilizzata per memorizzare la geometria si è rivelata relativamente inefficiente. Per oggetti di piccole dimensioni come punti e linee brevi, i metadati della rappresentazione avevano un overhead del 300%. Per ragioni di prestazioni, è stato necessario snellire la rappresentazione. Riducendo l’intestazione dei metadati e le dimensioni richieste, l’overhead si è ridotto notevolmente. Con PostGIS 1.0, questa nuova rappresentazione, più veloce e leggera, è diventata quella predefinita.
Le recenti versioni di PostGIS continuano ad aggiungere funzionalità e miglioramenti delle prestazioni, oltre a supportare le nuove funzionalità del sistema centrale PostgreSQL.
Chi usa PostGIS?
Esistono diversi enti e aziende che usano PostGIS. Se volete avere un elenco completo di casi di studio, potete consultare la pagina dedicata di PostGIS. Di seguito riportiamo un paio dei casi più significativi.
Institut Geographique National, Francia
L’IGN è l’agenzia cartografica nazionale francese e utilizza PostGIS per archiviare la mappa topografica ad alta risoluzione del Paese, “BDUni”. BDUni ha più di 100 milioni di caratteristiche ed è mantenuto da uno staff di oltre 100 persone che ogni giorno verificano le osservazioni e aggiungono nuove mappe al database. L’installazione IGN utilizza il sistema transazionale del database per garantire la coerenza durante i processi di aggiornamento e un sistema di standby a caldo per mantenere un periodo di attività in caso di guasto del sistema.
RedFin
RedFin è un’agenzia immobiliare con un servizio basato sul web per l’esplorazione degli immobili e la stima dei valori. Il loro sistema era originariamente costruito su MySQL, ma hanno scoperto che il passaggio a PostgreSQL e PostGIS ha fornito enormi vantaggi in termini di prestazioni e affidabilità.
PostGIS è diventato un database spaziale ampiamente utilizzato e il numero di programmi di terze parti che supportano l’archiviazione e il recupero dei dati è aumentato. I programmi che supportano PostGIS includono sia software open source che proprietario, sia su sistemi server che desktop. La figura seguente mostra un elenco di alcuni software che sfruttano PostGIS.