Condividi tramite


Panoramica dei tipi di dati spaziali

Esistono due tipi di dati spaziali. Il tipo di dati geometry supporta dati planari o euclidei (terra piatta). Il tipo di dati geometry è conforme a Open Geospatial Consortium (OGC) Simple Features for SQL Specification versione 1.1.0 e a SQL MM (standard ISO).

Inoltre, SQL Server supporta il tipo di dati geography, che archivia dati ellissoidali (terra rotonda), ad esempio coordinate di latitudine e longitudine GPS.

Nota importanteImportante

Per una descrizione dettagliata ed esempi delle nuove funzionalità spaziali di questa versione, inclusi i miglioramenti dei tipi di dati spaziali, scaricare il white paper relativo alle nuove funzionalità spaziali in SQL Server nome in codice "Denali".

Contenuto dell'argomento

  • Oggetti dati spaziali

  • Differenze tra i tipi di dati geometry e geography

  • Segmenti di arco circolare

Oggetti dati spaziali

I tipi di dati geometry e geography supportano sedici oggetti dati spaziali o tipi di istanza. Solo per undici di questi tipi di istanza, tuttavia, è possibile creare istanze. È possibile creare e utilizzare queste istanze (o crearne un'istanza) in un database. Queste istanze derivano determinate proprietà dai relativi tipi di dati padre che consentono di distinguerle come Points, LineStrings, CircularStrings, CompoundCurves, Polygons, CurvePolygons o come più istanze di geometry o geography in un oggetto GeometryCollection. Il tipo Geography dispone di un tipo di istanza aggiuntivo, FullGlobe.

Nella figura seguente viene illustrata la gerarchia geometry sulla quale si basano i tipi di dati geometry e geography. I tipi di geometry e geography di cui è possibile creare istanze sono indicati in blu.

Gerarchia del tipo di geometria

Come indicato nella figura, i dieci tipi di cui è possibile creare istanze dei tipi di dati geometry e geography sono Point, MultiPoint, LineString, CircularString, MultiLineString, CompoundCurve, Polygon, CurvePolygon, MultiPolygon e GeometryCollection. Vi è un tipo aggiuntivo di cui è possibile creare istanze per il tipo di dati geography, ovvero FullGlobe. I tipi geometry e geography sono in grado di riconoscere un'istanza specifica purché si tratti di un'istanza con formato corretto, anche se non definita in modo esplicito. Ad esempio, se si definisce un'istanza Point utilizzando in modo esplicito il metodo STPointFromText(), geometry e geography riconoscono l'istanza come Point, purché il formato dell'input del metodo sia corretto. Se si definisce la stessa istanza utilizzando il metodo STGeomFromText(), entrambi i tipi di dati geometry e geography riconoscono l'istanza come Point.

I sottotipi per i tipi geometry e geography sono divisi in tipi semplici e di raccolta. Alcuni metodi come STNumCurves() possono essere utilizzati solo con tipi semplici.

I tipi semplici includono:

I tipi di raccolta includono:

[INIZIO PAGINA]

Differenze tra i tipi di dati geometry e geography

I due tipi di dati spaziali si comportano spesso in modo simile, ma esistono alcune differenze fondamentali nel modo in cui i dati vengono archiviati e modificati.

Definizione dei bordi di collegamento

I dati di definizione per i tipi LineString e Polygon sono solo vertici. Il bordo di collegamento tra due vertici in un tipo geometry è una linea retta. Tuttavia, il bordo di collegamento tra due vertici in un tipo geografico è un corto arco di grande ellissi tra i due vertici. Una grande ellisse è l'intersezione dell'ellissoide con un piano attraverso il centro e un arco di grande ellisse è un segmento di arco sulla grande ellisse.

Definizione di segmenti di arco circolare

I segmenti di arco circolare per i tipi geometry vengono definiti sul piano delle coordinate cartesiane XY (i valori Z vengono ignorati). I segmenti di arco circolare per i tipi geography vengono definiti da segmenti di curva su una sfera di riferimento. Qualsiasi parallelo sulla sfera di riferimento può essere definito da due archi circolari complementari in cui i punti per entrambi gli archi hanno un angolo di latitudine costante.

Misurazioni nei tipi di dati spaziali

Nel sistema planare, o terra piatta, le misurazioni delle distanze e delle aree vengono fornite nella stessa unità di misurazione delle coordinate. Utilizzando il tipo di dati geometry, la distanza tra (2, 2) e (5, 6) è 5 unità, indipendentemente dalle unità utilizzate.

Nel sistema ellissoidale, o terra rotonda, le coordinate sono fornite in gradi di latitudine e longitudine. Tuttavia, le lunghezze e le aree sono misurate generalmente in metri e metri quadrati, sebbene la misurazione possa dipendere dall'identificatore di riferimento spaziale (SRID) dell'istanza geography. L'unità di misurazione più comune per il tipo di dati geography è il metro.

Orientamento dei dati spaziali

Nel sistema planare l'orientamento dell'anello di un poligono non è un fattore di particolare rilevanza. Ad esempio, un poligono descritto da ((0, 0), (10, 0), (0, 20), (0, 0)) è identico al poligono descritto da ((0, 0), (0, 20), (10, 0), (0, 0)). OGC Simple Features for SQL Specification non indica un ordinamento dell'anello e SQL Server non impone tale ordinamento.

In un sistema ellissoidale, un poligono non ha significato, o è ambiguo, senza un orientamento. Ad esempio, un anello intorno all'equatore descrive l'emisfero nord o sud? Se si utilizza il tipo di dati geography per archiviare l'istanza spaziale, è necessario specificare l'orientamento dell'anello e descrivere accuratamente la posizione dell'istanza. L'interno del poligono in un sistema ellissoidale è definito dal lato sinistro della regola.

Quando il livello di compatibilità è uguale o minore di 100 in SQL Server 2012, al tipo di dati geography si applicano le restrizioni seguenti:

  • Ogni istanza geography deve adattarsi all'interno di un singolo emisfero. Non è possibile archiviare oggetti spaziali con dimensioni maggiori di un emisfero.

  • Qualsiasi istanza geography di una rappresentazione Well-Known Text (WKT) o Well-Known Binary (WKB) OCG che produca un oggetto più grande di un emisfero genera una ArgumentException.

  • I metodi del tipo di dati geography che richiedono l'input di due istanze geography, ad esempio STIntersection(), STUnion(), STDifference() e STSymDifference(), restituiranno Null se i risultati dei metodi non si adattano a un singolo emisfero. Anche STBuffer() restituirà Null se l'output supera un singolo emisfero.

In SQL Server 2012 FullGlobe è un tipo speciale di Polygon che copre l'intero globo. FullGlobe dispone di un'area, ma non ha bordi o vertici.

Anelli interni ed esterni non rilevanti nel tipo di dati geography

In OGC Simple Features for SQL Specification vengono trattati anelli esterni e interni, ma questa distinzione non è significativa per il tipo di dati geography di SQL Server. È possibile scegliere qualsiasi anello di un poligono come anello esterno.

Per ulteriori informazioni sulle specifiche OGC, vedere quanto riportato di seguito:

[INIZIO PAGINA]

Segmenti di arco circolare

Tre tipi di cui è possibile creare istanze possono accettare segmenti di arco circolare: CircularString, CompoundCurve e CurvePolygon. Un segmento di arco circolare è definito da tre punti in un piano bidimensionale. Il terzo punto non può corrispondere al primo punto.

Nelle figure A e B vengono illustrati segmenti di arco circolare tipici. Si noti come ognuno dei tre punti giace sul perimetro di un cerchio.

Nelle figure C e D viene illustrato come un segmento di linea possa essere definito segmento di arco circolare. Si noti che sono ancora necessari tre punti per definire il segmento di arco circolare, diversamente da un segmento di linea regolare, che può essere definito solo da due punti.

I metodi che operano sui tipi di segmento di arco circolare utilizzano segmenti di linea retta per simulare l'arco circolare. Il numero di segmenti di linea utilizzati per simulare l'arco dipenderanno dalla lunghezza e dalla curvatura dell'arco. Benché sia possibile archiviare i valori Z per ognuno dei tipi di segmento di arco circolare, i metodi non utilizzeranno i valori Z nei calcoli.

[!NOTA]

Se si specificano valori Z per segmenti di arco circolare, tali valori devono essere gli stessi per tutti i punti nel segmento di arco circolare perché questo venga accettato per l'input. Ad esempio, CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) è ammesso, mentre CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) non lo è.

Confronto tra LineString e CircularString

Nel diagramma seguente vengono illustrati triangoli isosceli identici. Nel triangolo A vengono utilizzati segmenti di linea per definire il triangolo, mentre nel triangolo B vengono utilizzati segmenti di arco circolare.

7e382f76-59da-4b62-80dc-caf93e637c14

In questo esempio viene illustrato come archiviare i triangoli isosceli precedenti utilizzando un'istanza LineString e un'istanza CircularString:

DECLARE @g1 geometry;
DECLARE @g2 geometry;
SET @g1 = geometry::STGeomFromText('LINESTRING(1 1, 5 1, 3 5, 1 1)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(1 1, 3 1, 5 1, 4 3, 3 5, 2 3, 1 1)', 0);
IF @g1.STIsValid() = 1 AND @g2.STIsValid() = 1
  BEGIN
      SELECT @g1.ToString(), @g2.ToString()
      SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]
  END

Si noti che un'istanza CircularString richiede sette punti per definire il triangolo, mentre un'istanza LineString richiede solo quattro punti. Il motivo è che un'istanza CircularString archivia segmenti di arco circolare e non segmenti di linea. Di conseguenza, i lati del triangolo archiviati nell'istanza CircularString sono ABC, CDE ed EFA, mentre i lati del triangolo archiviati nell'istanza LineString sono AC, CE ed EA.

Si consideri il frammento di codice seguente:

SET @g1 = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 4 0)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(0 0, 2 2, 4 0)', 0);
SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length];

Il frammento di codice produrrà i risultati seguenti:

LS LengthCS Length
5.65685…6.28318…

Nella figura seguente viene illustrato come viene archiviato ogni tipo. La linea rossa indica LineString @g1, mentre la linea blu indica CircularString @g2:

e52157b5-5160-4a4b-8560-50cdcf905b76

Come illustrato nella figura precedente, le istanze CircularString utilizzano un numero minore di punti per archiviare i limiti delle curve con maggiore precisione delle istanze LineString. Le istanze CircularString sono ideali per l'archiviazione di limiti circolari come un raggio cercato di venti miglia da un punto specifico. Le istanze LineString sono ideali per l'archiviazione di limiti lineari come un blocco urbano quadrato.

Confronto tra LineString e CompoundCurve

Negli esempi di codice seguenti viene illustrato come archiviare la stessa figura utilizzando istanze LineString e CompoundCurve:

SET @g = geometry::Parse('LINESTRING(2 2, 4 2, 4 4, 2 4, 2 2)');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2), (4 2, 4 4), (4 4, 2 4), (2 4, 2 2))');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2, 4 4, 2 4, 2 2))');

Oppure

Negli esempi precedenti un'istanza LineString o un'istanza CompoundCurve potrebbe archiviare la figura. Nell'esempio seguente viene utilizzata un'istanza CompoundCurve per archiviare una sezione di un grafico a torta:

SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(2 2, 1 3, 0 2),(0 2, 1 0, 2 2))');

Un'istanza CompoundCurve consente di archiviare direttamente il segmento di arco circolare (2 2, 1 3, 0 2), mentre con un'istanza LineString è necessario convertire la curva in diversi segmenti di linea più piccoli.

Confronto tra CircularString e CompoundCurve

Nell'esempio di codice seguente viene illustrata l'archiviazione di una sezione di un grafico a torta in un'istanza CircularString:

DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)');
SELECT @g.ToString(), @g.STLength();

Per archiviare la sezione del grafico a torta utilizzando un'istanza CircularString, è necessario utilizzare tre punti per ogni segmento di linea. Se un punto intermedio non è noto, deve essere calcolato oppure è necessario raddoppiare l'endpoint del segmento di linea, come illustrato nel frammento di codice seguente:

SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');

Le istanze CompoundCurve consentono componenti sia LineString sia CircularString, in modo che solo due punti nei segmenti di linea della sezione del grafico a torta debbano essere noti. In questo esempio di codice viene illustrato come utilizzare un'istanza CompoundCurve per archiviare la stessa figura:

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING( 3 6.3246, 0 7, -3 6.3246), (-3 6.3246, 0 0, 3 6.3246))');
SELECT @g.ToString(), @g.STLength();

Confronto tra Polygon e CurvePolygon

Le istanze CurvePolygon possono utilizzare istanze CircularString e CompoundCurve per definire i relativi anelli esterni e interni. Le istanze Polygon non possono utilizzare i tipi di segmento di arco circolare: CircularString e CompoundCurve.

[INIZIO PAGINA]

Vedere anche

Riferimento

STNumCurves (tipo di dati geometry)

STNumCurves (tipo di dati geography)

STGeomFromText (tipo di dati geometry)

STGeomFromText (tipo di dati geography)

Concetti

Dati spaziali (SQL Server)

Guida di riferimento ai metodi per il tipo di dati geometry

Altre risorse

Guida di riferimento ai metodi per il tipo di dati geography