Condividi tramite


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:

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)

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 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 e MultiPoint non hanno un limite.

  • I limiti LineString e MultiLineString 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 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  
    
  • Nel secondo esempio viene utilizzato il metodo STIntersection() per restituire i punti in cui si intersecano le due istanze geometry 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();  
    

Vedere anche

Dati spaziali (SQL Server)