Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Il tipo di dati geometry in SQL Server 2008

Rappresentare punti linee e figure piane su SQL Server 2008, effettuare query e operazioni geometriche
Rappresentare punti linee e figure piane su SQL Server 2008, effettuare query e operazioni geometriche
Link copiato negli appunti

Nello scorso articolo abbiamo introdotto il tipo di dati geography, che permette di memorizzare la posizione di un punto sulla superficie terrestre. Strettamente legato ad esso è il tipo geometry, utilizzato per rappresentare i dati in un sistema di coordinate euclideo (ovvero un piano bidimensionale), secondo quanto indicato nelle specifiche Open Geospatial Consortium (OGC) Simple Features for SQL versione 1.1.0.

Sulle istanze del tipo geometry è anche possibile eseguire computazioni, ad esempio calcolare l'area di un poligono all'interno di una normale query SQL, per mezzo dei nuovi operatori messi a disposizione. SQL Server 2008 fornisce undici diversi oggetti per gestire i dati contenuti all'interno di un campo geometry:

Figura 1. Gli oggetti supportati dal tipo geometry
Gli oggetti supportati dal tipo geometry

In un campo geometry si possono quindi memorizzare informazioni relative a punti, linee, poligoni, etc. Il tipo di dati geometry è supportato nativamente da tutte le versioni di SQL Server 2008, compresa l'edizione Express. Per utilizzarlo con i linguaggi di programmazione .NET, è necessario utilizzare Visual Studio 2008 aggiornato al Service Pack 1.

Primi passi con il tipo 'geometry'

Vediamo subito come si utilizza il tipo geometry. Proviamo ad eseguire la seguente query all'interno del Management Studio:

 
DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))');
SELECT @g AS Poligono, @g.ToString() As [Text], @g.STArea() as Area

Notiamo l'utilizzo del metodo statico geometry::Parse, a cui passiamo una stringa contenente la definizione di un tipo geometrico POLYGON: esso è composto da 5 coppie di numeri, che indicano i vertici della figura, in senso orario a partire dall'angolo in basso a sinistra.

Stiamo dunque descrivendo un quadrilatero (l'ultima coppia di vertici è uguale alla prima perché si tratta di un poligono, quindi la figura deve essere chiusa).

Eseguiamo la query con F5: il riquadro dei risultati del Management Studio mostrerà, nella scheda Results, un record con tre colonne:

  • la prima contiene la rappresentazione binaria del tipo geometry (questo tipo di dati, infatti, è internamente memorizzato in formato binario da SQL Server)
  • la seconda mostra la definizione in formato testuale del dato geometrico
  • la terza, attraverso il metodo STArea sull'istanza di geometry, ne recupera l'area

Poiché nella nostra interrogazione è presente una colonna geometry, nel riquadro dei risultati verrà visualizzata anche una nuova scheda, Spatial results, che fornisce una rappresentazione grafica del valore di tale colonna:

Figura 2. Il quadrato visualizzato nella finestra Spatial Results
Il quadrato visualizzato nella finestra Spatial Results

Proviamo a modificare l'interrogazione precedente, definendo un nuovo poligono, ad esempio un pentagono (quindi dobbiamo indicare 6 punti, in modo analogo al caso precedente):

DECLARE @g2 geometry;
SET @g2 = geometry::Parse('POLYGON((1 0, 0 1.5, 1.5 3, 3 1.5, 2 0, 1 0))');
SELECT @g2 AS Poligono, @g2.STArea() as Area

Il cui risultato, nella finestra Spatial results, come possiamo immaginare, è il seguente:

Figura 3. La finestra Spatial results mostra un pentagono
La finestra Spatial results mostra un pentagono

Attraverso il tipo geometry possiamo definire anche semplici punti, utilizzando la parola chiave POINT:

DECLARE @g3 geometry;
SET @g3 = geometry::Parse('POINT(2 3)');
SELECT @g3 AS Punto

Oppure una linea, attraverso l'utilizzo di LINESTRING, ovvero un oggetto formato da un insieme di punti e delle rette che li uniscono:

DECLARE @g4 geometry;
SET @g4 = geometry::Parse('LINESTRING(1 1, 2 1, 4 5)');
SELECT @g4 AS Linea

In entrambi i casi, nella scheda Spatial results possiamo osservare la rappresentazione grafica corrispondente alle figure geometriche definite nelle query.

Operazioni sul tipo 'geometry'

Il tipo geometry dispone di una serie di metodi che possono essere utilizzati per effettuare calcoli sulle sue istanze. Mostriamo i più importanti attraverso alcuni esempi pratici.

Intersezione

Consideriamo le seguenti istruzioni T-SQL:

DECLARE @g5 geometry;
DECLARE @g6 geometry;
SET @g5 = geometry::Parse('POLYGON((1 0, 0 1.5, 1.5 3, 3 1.5, 2 0, 1 0))');
SET @g6 = geometry::Parse('POLYGON((0 2, 0 3, 1 3, 1 2, 0 2))');
SELECT @g5 AS Pentagono, @g6 As Quadrato,  
@g5.STIntersection(@g6) AS Intersezione, @g5.STIntersection(@g6).ToString() As PoligonoIntersezione;

Le variabili @g5 e @g6 definiscono, rispettivamente, un pentagono e un quadrato. Nella SELECT finale, attraverso il metodo @g5.STIntersection(@g6), calcoliamo l'intersezione delle due figure. Eseguendo i comandi, la scheda Spatial results mostrerà, nella lista Select spatial column sulla destra, l'elenco di tutte le colonne di tipo geometry contenute nella query:

Figura 4. La selezione della colonna geometry da mostrare
La selezione della colonna geometry da mostrare

In particolare, selezionando la voce Intersezione, sarà mostrata graficamente l'intersezione tra le due figure. Inoltre, tornando nella scheda Results, possiamo notare che la quarta colonna del risultato, PoligonoIntersezione, calcolata come @g5.STIntersection(@g6).ToString(), restituisce la definizione del tipo geometry che rappresenta proprio l'intersezione tra le due figure, ovvero, in questo esempio, POLYGON ((0.5 2, 1 2, 1 2.5, 0.5 2)).

Strettamente collegato con STIntersection è il metodo STIntersects, che restituisce 1 se una figura definita da un'istanza di geometry ne interseca un'altra (ovvero ha almeno un punto in comune).

Contenimento

Un'altra funzione importante è STContains, che ritorna 1 se un'istanza di un tipo geometry ne contiene completamente un'altra. Ad esempio:

DECLARE @g7 geometry;
DECLARE @g8 geometry;
SET @g7 = geometry::Parse('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))');
SET @g8 = geometry::Parse('POINT(1 1)');
SELECT @g7.STContains(@g8);

Verificando i vertici del poligono dichiarato nella variabile @g7, è facile capire che il punto (1, 1) (@g8) è contenuto al suo interno, infatti il metodo @g7.STContains(@g8) restituisce 1.

Distanza

Abbiamo anche la possibilità di calcolare la più breve distanza tra due oggetti di tipo geometry. Il metodo da usare è STDistance:

DECLARE @g9 geometry;
DECLARE @g10 geometry;
SET @g9 = geometry::Parse('POINT(3 5)');
SET @g10 = geometry::Parse('POINT(2 9)');
SELECT @g9.STDistance(@g10) AS Distanza;

In questo esempio, calcoliamo la distanza tra due punti, ma il metodo STDistance funziona indistintamente con ogni tipo di figura supporta da geometry (poligoni, linee, etc.).

Lunghezza (perimetro)

Nei primi esempi di questo articolo abbiamo visto come è possibile calcolare l'area di un poligono, attraverso il metodo STArea. Analogamente, con STLength possiamo determinare la lunghezza di un'istanza geometry (ovvero il perimetro, nel caso di un poligono):

DECLARE @g11 geometry;
SET @g11 = geometry::Parse('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))');
SELECT @g11 AS Poligono, @g11.STLength() As Perimetro;

Eseguendo questa query, nella colonna Perimetro otterremo il valore 12, che rappresenta effettivamente il perimetro del poligono, come possiamo verificare graficamente nella finestra Spatial results.

Rappresentazione GML

Il metodo geometry::AsGml restituisce la rappresentazione GML (Geography Markup Language) di un'istanza del tipo geometry. Ad esempio:

DECLARE @g12 geometry;
SET @g12 = geometry::Parse('POINT(3 5)');
SELECT @g12.AsGml();

DECLARE @g13 geometry;
SET @g13 = geometry::Parse('POLYGON((1 0, 0 1.5, 1.5 3, 3 1.5, 2 0, 1 0))');
SELECT @g13.AsGml();

Queste due interrogazioni producono i seguenti risultati:

<Point xmlns="http://www.opengis.net/gml">
  <pos>3 5</pos>
</Point>
<Polygon xmlns="http://www.opengis.net/gml">
  <exterior>
    <LinearRing>
      <posList>1 0 0 1.5 1.5 3 3 1.5 2 0 1 0</posList>
    </LinearRing>
  </exterior>
</Polygon>

Si tratta di un formato standard che rispetta le specifiche definite dall'Open Geospatial Consortium, quindi consente lo scambio di informazioni in tutte le applicazioni che lo supportano.

Per visualizzare l'elenco completo dei metodi disponibili sulle istanze del tipo geometry, è possibile consultare il Books Online di SQL Server 2008. Tutti gli esempi mostrati in questo articolo sono disponibili per il download.

Conclusioni

In questo articolo abbiamo presentato il tipo geometry, una delle novità di SQL Server 2008 per la gestione dei dati bidimensionali. Esso si affianca al tipo geography: insieme, forniscono nuove modalità di memorizzazione e utilizzo dei dati spaziali all'interno del DBMS, secondo gli standard previsti dall'OGC, cosa che ne dovrebbe facilitare l'adozione.

Ti consigliamo anche