Creazione, costruzione e query di istanze geometry
Il tipo di dati spaziali planare, geometry
, rappresenta i dati in un sistema di coordinate euclideo (piano). Questo tipo viene implementato come tipo di dati CLR (Common Language Runtime) in SQL Server.
Il tipo geometry
è predefinito e disponibile in ogni database. È possibile creare colonne di tabella di tipo geometry
e operare sui dati geometry
nello stesso modo in cui si utilizzano gli altri tipi CLR.
Il geometry
tipo di dati (planare) supportato da SQL Server è conforme alle funzionalità semplici OGC (Open Geospatial Consortium) per la specifica SQL versione 1.1.0.
Per ulteriori informazioni sulle specifiche OGC, vedere quanto riportato di seguito:
OGC Specifications, Simple Feature Access Part 1 - Common Architecture
OGC Specifications, Simple Feature Access Part 2 - SQL Options (Specifiche OGC, accesso semplificato alle caratteristiche Parte 2 - Opzioni SQL)
SQL Server supporta un subset dello standard GML 3.1 esistente, definito nello schema seguente: https://schemas.microsoft.com/sqlserver/profiles/gml/SpatialGML.xsd.
Creazione o costruzione di una nuova istanza geometry
Creazione di una nuova istanza geometry da un'istanza esistente
Il tipo di dati geometry
offre molti metodi predefiniti che è possibile utilizzare per creare nuove istanze geometry
in base a quelle esistenti.
Per creare un buffer relativo a una geometria
STBuffer (tipo di dati geometry)
BufferWithTolerance (tipo di dati geometry)
Per creare una versione semplificata di una geometria
Reduce (tipo di dati geometry)
Per creare la struttura convessa di una geometria
STConvexHull (tipo di dati geometry)
Per creare una geometria dall'intersezione di due geometrie
STIntersection (tipo di dati geometry)
Per creare una geometria dall'unione di due geometrie
STUnion (tipo di dati geometry)
Per creare una geometria dai punti in cui una non si sovrappone all'altra
STDifference (tipo di dati geometry)
Per creare una geometria dai punti in cui due geometrie non si sovrappongono
STSymDifference (tipo di dati geometry)
Per creare un'istanza Point arbitraria che giace su una geometria esistente
STPointOnSurface (tipo di dati geometry)
Costruzione di un'istanza geometry da un input WKT (well-known text)
Il tipo di dati geometry
fornisce molti metodi predefiniti che generano una geometria dalla rappresentazione WKT OGC (Open Geospatial Consortium). Lo standard WKT è una stringa di testo che consente lo scambio di dati geometrici in formato testuale.
Per costruire qualsiasi tipo di istanza geometry da input WKT
STGeomFromText (tipo di dati geometry)
Per costruire un'istanza di geometria Point dall'input WKT
STPointFromText (tipo di dati geometry)
Per costruire un'istanza MultiPoint di tipo geometry da un input WKT
STMPointFromText (tipo di dati geometry)
Per costruire un'istanza LineString di tipo geometry da un input WKT
STLineFromText (tipo di dati geometry)
Per costruire un'istanza MultiLineString di tipo geometry da un input WKT
STMLineFromText (tipo di dati geometry)
Per costruire un'istanza Polygon di tipo geometry da un input WKT
STPolyFromText (tipo di dati geometry)
Per costruire un'istanza MultiPolygon di tipo geometry da un input WKT
STMPolyFromText (tipo di dati geometry)
Per costruire un'istanza GeometryCollection di tipo geometry da un input WKT
STGeomCollFromText (tipo di dati geometry)
Costruzione di un'istanza geometry da un input WKB (well-known binary)
WKB è un formato binario definito da OGC (Open Geospatial Consortium) che consente di scambiare i dati geometry
tra un'applicazione client e un database SQL. Le funzioni seguenti accettano input WKB per costruire le geometrie:
Per costruire qualsiasi tipo di istanza geometry da un input WKB
STGeomFromWKB (tipo di dati geometry)
Per costruire un'istanza Point di tipo geometry da un input WKB
STPointFromWKB (tipo di dati geometry)
Per costruire un'istanza MultiPoint di tipo geometry da un input WKB
STMPointFromWKB (tipo di dati geometry)
Per costruire un'istanza LineString di tipo geometry da un input WKB
STLineFromWKB (tipo di dati geometry)
Per costruire un'istanza MultiLineString di tipo geometry da un input WKB
STMLineFromWKB (tipo di dati geometry)
Per costruire un'istanza Polygon di tipo geometry da un input WKB
STPolyFromWKB (tipo di dati geometry)
Per costruire un'istanza MultiPolygon di tipo geometry da un input WKB
STMPolyFromWKB (tipo di dati geometry)
Per costruire un'istanza GeometryCollection di tipo geometry da un input WKB
STGeomCollFromWKB (tipo di dati geometry)
Costruzione di un'istanza geometry da un input di testo GML
Il geometry
tipo di dati fornisce un metodo che genera un'istanza geometry
da GML, una rappresentazione XML di oggetti geometrici. SQL Server supporta un subset di GML.
Per costruire qualsiasi tipo di istanza geometry da un input GML
GeomFromGml (tipo di dati geometry)
Restituzione di WKT e WKB da un'istanza geometry
È possibile utilizzare i metodi seguenti per restituire il formato WKT o WKB di un'istanza geometry
:
Per restituire la rappresentazione WKT di un'istanza geometry
STAsText (tipo di dati geometry)
ToString (tipo di dati geometry)
Per restituire la rappresentazione WKT di un'istanza geometry, con qualsiasi valore Z e M.
AsTextZM (tipo di dati geometry)
Per restituire la rappresentazione WKB di un'istanza geometry
STAsBinary (tipo di dati geometry)
Per restituire la rappresentazione GML di un'istanza geometry
AsGml (tipo di dati geometry)
Esecuzione di query sulle proprietà e i comportamenti delle istanze geometry
Tutte le geometry
istanze hanno una serie di proprietà che possono essere recuperate tramite metodi forniti SQL Server. Negli argomenti seguenti vengono definiti le proprietà e i comportamenti dei tipi di geometria, nonché i metodi per l'esecuzione di query per ognuno di essi.
Informazioni sulla validità, sul tipo di istanza e su GeometryCollection
Dopo aver costruito un'istanza geometry
, è possibile utilizzare i metodi seguenti per determinare se essa è corretta, per restituire il tipo di istanza o, se si tratta di un'istanza di raccolta, per restituire un'istanza geometry
specifica.
Per restituire il tipo di istanza di una geometria
STGeometryType (tipo di dati geometry)
Per determinare se una geometria è un tipo di istanza specificato
InstanceOf (tipo di dati geometry)
Per determinare se un'istanza geometry è corretta per il tipo di istanza
STIsValid (tipo di dati geometry)
Per convertire un'istanza geometry in un'istanza geometry corretta con un tipo di istanza
MakeValid (tipo di dati geometry)
Per restituire il numero delle geometrie in un'istanza GeometryCollection
STNumGeometries (tipo di dati geometry)
Per restituire una specifica geometria in un'istanza GeometryCollection
STGeometryN (tipo di dati geometry)STGeometryN (tipo di dati geometry)
Numero di punti
Tutte le istanze non interrotte geometry
sono costituite da punti. Tali punti rappresentano le coordinate X e Y del piano su cui vengono tracciate le geometrie. Il tipo di dati geometry
offre numerosi metodi predefiniti per l'esecuzione di query sui punti di un'istanza.
Per restituire il numero di punti che comprendono un'istanza
STNumPoints (tipo di dati geometry)
Per restituire un punto specifico in un'istanza
STPointN
Per restituire un punto arbitrario che si trova in un'istanza
STPointOnSurface
Per restituire il punto di inizio di un'istanza
STStartPoint
Per restituire il punto di fine di un'istanza
STEndpoint
Per restituire la coordinata X di un'istanza Point
STX (tipo di dati geometry)
Per restituire la coordinata Y di un'istanza Point
STY
Per restituire il punto centrale geometrico di un'istanza Polygon, CurvePolygon o MultiPolygon
STCentroid
Dimensione
Un'istanza geometry
non vuota può essere a 0, 1 o 2 dimensioni. Le istanze geometries
senza dimensioni, ad esempio Point
e MultiPoint
non dispongono di lunghezza o area. Gli oggetti unidimensionali, ad esempio LineString, CircularString, CompoundCurve
e MultiLineString
, dispongono della lunghezza. Le istanze bidimensionali, ad esempio Polygon
, CurvePolygon
e MultiPolygon
, dispongono di area e lunghezza. Per le istanze vuote verrà indicata una dimensione di -1 e per GeometryCollection
verrà indicata un'area dipendente dai tipi del contenuto.
Per restituire la dimensione di un'istanza
STDimension
Per restituire la lunghezza di un'istanza
STLength
Per restituire l'area di un'istanza
STArea
Empty
Un'istanza vuotageometry
non ha punti. La lunghezza delle istanze LineString, CircularString
, CompoundCurve
e MultiLineString
vuote è pari a zero. L'area delle istanze Polygon
, CurvePolygon
e MultiPolygon
vuote è pari a 0.
Per determinare se un'istanza è vuota
STIsEmpty.
Semplice
Affinché un'istanza geometry
sia semplice, deve soddisfare entrambi i requisiti seguenti:
Ogni figura dell'istanza non deve intersecarsi, salvo agli endpoint.
Le figure dell'istanza non possono intersecarsi tra di loro in un punto non esistente in entrambi i loro limiti.
Nota
Le geometrie vuote sono sempre semplici.
Per determinare se un'istanza è semplice
STIsSimple.
Limite interno ed esterno
L'interno di un'istanza geometry
è lo spazio occupato dall'istanza e l'esterno non lo occupa.
Illimite è definito da OGC come segue:
Le istanze
Point
eMultiPoint
non hanno un limite.I limiti
LineString
eMultiLineString
sono formati dai punti di inizio e di fine, rimuovendo quelli che si hanno per un numero di volte pari.
DECLARE @g geometry;
SET @g = geometry::Parse('MULTILINESTRING((0 1, 0 0, 1 0, 0 1), (1 1, 1 0))');
SELECT @g.STBoundary().ToString();
Il limite di un'istanza Polygon
o MultiPolygon
è il set dei suoi anelli.
DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))');
SELECT @g.STBoundary().ToString();
Per restituire il limite di un'istanza
STBoundary
Envelope
La busta di un'istanza geometry
, nota anche come casella di selezione, è il rettangolo allineato all'asse formato dalle coordinate minime e massime (X,Y) dell'istanza.
Per restituire l'envelope di un'istanza
STEnvelope
Chiusura
Un'istanza chiusageometry
è una figura i cui punti iniziali e punti finali sono uguali. Le istanze Polygon
sono considerate chiuse. Le istanze Point
non sono considerate chiuse.
Un anello è un'istanza LineString
semplice chiusa.
Per determinare se un'istanza è chiusa
STIsClosed
Per determinare se un'istanza è un anello
STIsRing
Per restituire l'anello esterno di un'istanza Polygon
STExteriorRing
Per restituire il numero di anelli interni in un'istanza Polygon
STNumInteriorRing
Per restituire un anello interno specificato di un'istanza Polygon
STInteriorRingN
Identificatore SRID
L'identificatore SRID specifica in quale sistema di coordinate è rappresentata l'istanza geometry
. Due istanze con identificatori SRID diversi non possono essere confrontate.
Per impostare o restituire l'identificatore SRID di un'istanza
STSrid
Questa proprietà può essere modificata.
Determinazione delle relazioni esistenti tra istanze geometry
Il tipo di dati geometry
offre molti metodi predefiniti che è possibile utilizzare per determinare relazioni tra due istanze geometry
.
Per determinare se due istanze includono lo stesso punto impostato
STEquals
Per determinare se due istanze sono disgiunte
STDisjoint
Per determinare se due istanze si intersecano
STIntersects
Per determinare se due istanze entrano in contatto
STTouches
Per determinare se due istanze si sovrappongono
STOverlaps
Per determinare se due istanze si incrociano
STCrosses
Per determinare se un'istanza è all'interno dell'altra
STWithin
Per determinare se un'istanza contiene l'altra
STContains
Per determinare se un'istanza si sovrappone all'altra
STOverlaps
Per determinare se due istanze sono collegate a livello spaziale
STRelate
Per determinare la distanza più breve tra punti in due geometrie
STDistance
Istanze geometry con SRID zero per impostazione predefinita
Il SRID predefinito per geometry
le istanze in SQL Server è 0. Con i dati spaziali geometry
lo specifico identificatore SRID dell'istanza spaziale non deve eseguire i calcoli. Di conseguenza le istanze possono risiedere nello spazio planare indefinito. Per indicare lo spazio planare non definito nei calcoli dei metodi del tipo di dati, il motore di geometry
database di SQL Server usa SRID 0.
Esempio
Nei due esempi seguenti viene illustrato come aggiungere ed eseguire query su dati di tipo geometry.
Nel primo esempio viene creata una tabella con una colonna di identità e una colonna
geometry
GeomCol1
. Una terza colonna effettua il rendering della colonnageometry
nella rappresentazione Well-Known Text (WKT) OGC (Open Geospatial Consortium) e utilizza il metodoSTAsText()
. Vengono quindi inserite due righe: in una riga è contenuta un'istanzaLineString
digeometry
e in una seconda è contenuta un'istanzaPolygon
.IF OBJECT_ID ( 'dbo.SpatialTable', 'U' ) IS NOT NULL DROP TABLE dbo.SpatialTable; GO CREATE TABLE SpatialTable ( id int IDENTITY (1,1), GeomCol1 geometry, GeomCol2 AS GeomCol1.STAsText() ); GO INSERT INTO SpatialTable (GeomCol1) VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0)); INSERT INTO SpatialTable (GeomCol1) VALUES (geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0)); GO
Nel secondo esempio viene utilizzato il metodo
STIntersection()
per restituire i punti in cui si intersecano le due istanzegeometry
inserite in precedenza.DECLARE @geom1 geometry; DECLARE @geom2 geometry; DECLARE @result geometry; SELECT @geom1 = GeomCol1 FROM SpatialTable WHERE id = 1; SELECT @geom2 = GeomCol1 FROM SpatialTable WHERE id = 2; SELECT @result = @geom1.STIntersection(@geom2); SELECT @result.STAsText();