In questo post vedremo come utilizzare le estensioni spaziali di SQL Server 2008. Prima di entrare nel dettaglio, sarà necessario dare qualche definizione.
Una Base di dati spaziale o Database spaziale è una base di dati ottimizzata per archiviare e interrogare dati correlati ad oggetti nello spazio, tra cui, punti, linee e poligoni. Nei database spaziali sono integrate quindi delle funzionalità aggiuntive per processare tipi di dati spaziali. L'Open Geospatial Consortium ha creato le specifiche Simple Features che stabiliscono degli standard per l'aggiunta di funzionalità spaziali ai database.
A partire dalla versione 2008, SQL Server supporta i tipi spaziali, in accordo con le specifiche Open GIS. I tipi spaziali introdotti sono due: Geometry and Geography.
Geometry
Questo tipo consente l'utilizzo di dati geometrici, ossia punti, linee e poligoni, all'interno del sistema di coordinate euclideo. Viene usato per rappresentare informazione in un piano a 2 dimensioni. Le unità di misura sono arbitrarie: metri, miglia, pixel, etc.
Geography
Poiché la Terra non è piatta c’è il problema di rappresentare un punto su di essa usando una matematica bi-dimensionale. Le carte geografiche che conosciamo sono proiezioni del mondo reale su un piano. Esistono tanti metodi per eseguire una proiezione; ciascuno coi suoi pregi e difetti. Ad esempio, una carta europea tende a minimizzare le distorsioni su tale regione spostandole verso i poli: per questo motivo la Groenlandia e l’Antartide appaiono molto più grandi di quanto non siano in realtà. Un tipo Geometry non è adatto a rappresentare un punto sulla Terra soprattutto quando si vuole condividere l’informazione con altre persone che utilizzano proiezioni differenti. Fortunatamente, possiamo usare un sistema di coordinate geografiche per rappresentare punti sul pianeta o su qualsiasi superficie ellissoidale.
Il tipo Geography usa la latitudine e la longitudine per identificare un punto. E’ importante sottolineare che Latitudine e Longitudine non sono valori assoluti universalmente accettati: il meridiano primo e la longitudine 0 sono in realtà arbitrari. Ad esempio, Il meridiano primo usato dal GPS è spostato di 100 metri ad est rispetto a quello ritenuto “ufficiale”.
Una volta stabilita l’origine del sistema di riferimento va affrontato un altro problema: per calcolare la distanza tra due punti sul globo occorre conoscere il raggio della Terra che non è uniforme. Quando esprimiamo una località in termini di coordinate globali, queste sono basate su un modello della Terra che è molto accurato su quell’area ma non altrove. I parametri che caratterizzano il modello utilizzato sono noti come “Spatial Reference System” (SRS). E’ importante conoscere quale SRS si è utilizzato per un insieme di dati per salvaguardare l’accuratezza dei dati. Il SRS più usato attualmente è chiamato WGS84.
Vi rimando a questo link per una trattazione più dettagliata su questi nuovi tipi.
Partiamo da una tabella in SQL Server (U2_Concerts) che contenga due campi esprimenti la latitudine e la longitudine di un punto associato al record. Aggiungiamo un campo (che chiameremo Location) di tipo Geography e aggiorniamo la tabella eseguendo il seguente comando all’interno del Management Studio di SQL Server:
UPDATE U2_Concerts SET Location = GEOGRAPHY::Point(latitude,longitude,4326);
Il valore del campo Location viene costruito a partire dalla latitudine e dalla longitudine e da un numeretto magico (4326) che rappresenta il WGS84.
Eseguiamo ora una query sulla tabella U2_Concerts:
SELECT * FROM [ProvEuropa].[dbo].[U2_concerts]

Nella regione dei risultati compare un nuovo tab chiamato Risultati Spaziali che mostra visivamente il risultato della query.

Introduciamo ora nella nostra analisi una seconda tabella spaziale. Per costruirla partiamo da uno shapefile (vedi post precedente) contenente le province dell’Europa.

Per importare in SQL Server 2008 lo shapefile possiamo utilizzare un tool chiamato Shape2SQL.

A differenza della tabella precedente, ora abbiamo a che fare con 1991 poligoni descritti con un tipo Geometry. Possiamo quindi eseguire query spaziali più sofisticate:
DECLARE @Napoli geometry;
SET @Napoli=(SELECT TOP 1 geom FROM province WHERE PROVNAME='Napoli');
Definiamo cioè un oggetto geometry chiamato @Napoli e lo identifichiamo selezionando il poligono cha abbia come attributo PROVNAME “Napoli”. A questo punto selezioniamo dalla tabella tutti quei poligoni che confinano con @Napoli.
Il risultato della query è il seguente (in forma tabulare e grafica):


Costruiamo ora una query che utilizzi entrambe le tabelle e che mostra tutti i concerti avvenuti nella provincia di Milano:
SELECT geom, id, NUll, NUll FROM Province WHERE ProvNAME='Milano'
UNION ALL
SELECT Location.STBuffer(800), Latit, Longit, Data FROM U2_concerts

Utilizzando il Generatore report 3.0 di Microsoft SQL Server 2008 R2 è possibile stampare una mappa a partire da query spaziale. E’ possibile, inoltre, inserire Bing Maps come layer addizionale:




Concludiamo l’articolo parlando di nuovo della libreria SharpMap, descritta nello scorso post.
SharpMap è in grado di caricare layer provenienti da tabelle di SQL Server. Anzitutto definiamo un oggetto di tipo
SharpMap.Data.Providers.SqlServer2008 shpDS;
E lo istanziamo nella maniera seguente
shpDS = new SharpMap.Data.Providers.SqlServer2008(cnnString,”MyTable”, "geom", "ID");
dove cnnString è la stringa di connessione al database, “MyTable” è il nome della tabella contenente i dati che vogliamo caricare, “geom” è il relativo campo di tipo GEOMETRY e ID è la chiave della tabella.
E’ sempre consigliabile validare la geometria usando Sharpmap mediante la seguente chiamata:
shpDS.ValidateGeometries = true;
In caso contrario, l’applicazione darà spesso errori dovuti alla conversione da Shapefile. Definiamo quindi un oggetto di tipo layer
SharpMap.Layers.VectorLayer layer = new SharpMap.Layers.VectorLayer("first layer");
E settiamo la sua sorgente dati con il provider appena costruito:
layer.DataSource = shpDS;
A questo punto basta definire lo stile da utilizzare nella visualizzazione facendo attenzione a non usare colori di riempimento dei poligoni che nascondano le linee e i punti.
Il layer così costruito può essere aggiunto alla mappa. La procedura va ripetuta per tutti i layer che vogliamo sovrapporre. Nella immagine seguente la mappa contiene due layer: le nazioni del mondo (poligoni) e i punti estratti dalla tabella U2_Concerts appartenenti all’Italia.

Nella prossima immagine invece sono rappresentate le nazioni del mondo (con zoom sugli USA),i fiumi (in verde) e gli epicentri dei terremoti avvenuti nella storia degli Stati Uniti (punti rossi).

In conclusione, abbiamo introdotto le estensioni spaziali di SQL Server e visto qualche semplice esempio di suo utilizzo. L’argomento è complesso e relativamente giovane ma col passare del tempo sicuramente gli strumenti a disposizione del programmatore o analista GIS miglioreranno così come la documentazione.
Per i programmatori .NET la libreria SharpMap è lo strumento che garantisce una continuità di lavoro rispetto all’utilizzo di shapefile.