Creare, costruire ed eseguire query di istanze di geometria

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

Il tipo di dati spaziali planare geometryrappresenta i dati in un sistema di coordinate euclideo (piano). Questo tipo è implementato come tipo di dati Common Language Runtime (CLR) 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 tipo di dati geometria (planare) supportato da SQL Server è conforme allo standard Open Geospatial Consortium (OGC) Simple Features for SQL Specification versione 1.1.0.

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

SQL Server supporta un sottoinsieme 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 usare per creare nuove istanze di 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)

Parse (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 lo scambio di 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 tipo di dati geometry include un metodo che genera un'istanza geometry da GML, una rappresentazione XML di oggetti geometrici. SQL Server supporta un sottoinsieme 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

A tutte le istanze geometria sono associate numerose proprietà che possono essere recuperate tramite metodi forniti da 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 usare 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 geometrici) STGeometryN (tipo di dati geometrici)

Numero di punti

Tutte le istanze geometry non vuote sono costituite da punti. Tali punti rappresentano le coordinate X e Y del piano su cui vengono tracciate le geometrie. Il tipo di datigeometry 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 geometrysenza dimensioni, come Point e MultiPoint, non hanno lunghezza o area. Gli oggetti unidimensionali come LineString, CircularString, CompoundCurvee MultiLineStringhanno una lunghezza. Le istanze bidimensionali come Polygon, CurvePolygone MultiPolygon. 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

Vuoto

Un'istanza vuota di tipo geometry non contiene punti. La lunghezza delle istanze LineString, CircularString, CompoundCurvee MultiLineString vuote è pari a zero. L'area delle istanze Polygon, CurvePolygone MultiPolygon vuote è pari a 0.

Per determinare se un'istanza è vuota
STIsEmpty.

Semplice

Affinché il tipo geometry dell'istanza sia semplice, deve soddisfare entrambi questi requisiti:

  • 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 è lo spazio non occupato da essa.

Illimite è definito da OGC come segue:

  • Le istanzePoint e MultiPoint non hanno un limite.

  • I limitiLineString e MultiLineString boundaries are formed by the start points e end points, removing those that occur an even number of times.

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

L' envelope di un'istanza geometry , nota anche come rettangolo 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 geometrychiusa è una figura i cui punti di inizio e di fine corrispondono. Le istanzePolygon sono considerate chiuse. Le istanzePoint 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 il sistema di coordinate in cui è 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

Nota

Questa proprietà può essere modificata.

Determinazione delle relazioni esistenti tra istanze geometry

Il tipo di dati geometry offre molti metodi predefiniti che è possibile usare 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 istanze geometria 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 indefinito nei calcoli di metodi del tipo di dati geometria, il motore di database di SQL Server usa SRID 0.

Esempi

Nei due esempi seguenti viene illustrato come aggiungere ed eseguire query su dati di tipo geometry.

Esempio A.

In questo esempio viene creata una tabella con una colonna di identità e una colonna geometryGeomCol1. Una terza colonna effettua il rendering della colonna geometry nella rappresentazione Well-Known Text (WKT) OGC (Open Geospatial Consortium) e utilizza il metodo STAsText() . Vengono quindi inserite due righe: in una riga è contenuta un'istanza LineString di geometrye in una seconda è contenuta un'istanza Polygon .

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  

Esempio B.

In questo esempio viene usato il metodo STIntersection() per restituire i punti in cui le due istanze geometry inserite in precedenza si intersecano.

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();  

Vedi anche

Dati spaziali (SQL Server)