CircularString
CircularString
è una raccolta di zero o più segmenti di arco circolare continui. Un segmento di arco circolare è un segmento curvo definito da tre punti su un piano bidimensionale. Il primo punto non può corrispondere al terzo punto. Se tutti e tre i punti di un segmento di arco circolare sono collineari, il segmento di arco verrà gestito come un segmento di linea.
Importante
Per una descrizione dettagliata ed esempi delle nuove funzionalità spaziali introdotte in SQL Server 2012, incluso il CircularString
sottotipo, scaricare il white paper New Spatial Features in SQL Server 2012.
Istanze CircularString
Nel disegno seguente vengono illustrate le istanze CircularString
valide:
Istanze accettate
Un'istanza CircularString
viene accettata se è vuota o contiene un numero dispari di punti, n, dove n > 1. Le istanze CircularString
seguenti vengono accettate.
DECLARE @g1 geometry = 'CIRCULARSTRING EMPTY';
DECLARE @g2 geometry = 'CIRCULARSTRING(1 1, 2 0, -1 1)';
DECLARE @g3 geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 2 0, 1 1)';
In @g3
viene illustrato che l'istanza CircularString
può essere accettata, ma non è valida. La dichiarazione dell'istanza CircularString seguente non viene accettata. Questa dichiarazione genera un'eccezione System.FormatException
.
DECLARE @g geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 1 1)';
Istanze valide
Un'istanza CircularString
valida deve essere vuota o disporre degli attributi seguenti:
Deve contenere almeno un segmento di arco circolare, cioè avere un minimo di tre punti.
L'ultimo endpoint per ogni segmento di arco circolare nella sequenza, a eccezione dell'ultimo segmento, deve essere il primo endpoint per il segmento successivo nella sequenza.
Deve contenere un numero di punti dispari.
Non deve sovrapporsi a un intervallo.
Anche se è possibile che le istanze
CircularString
contengano segmenti di linea, questi ultimi devono essere definiti da tre punti collineari.
Nell'esempio seguente vengono illustrate le istanze CircularString
valide.
DECLARE @g1 geometry = 'CIRCULARSTRING EMPTY';
DECLARE @g2 geometry = 'CIRCULARSTRING(1 1, 2 0, -1 1)';
DECLARE @g3 geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 1 1, 0 1)';
DECLARE @g4 geometry = 'CIRCULARSTRING(1 1, 2 2, 2 2)';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(),@g4.STIsValid();
Un'istanza CircularString
deve contenere almeno due segmenti di arco circolare per definire un cerchio completo. In un'istanza CircularString
non può essere utilizzato un singolo segmento di arco circolare, ad esempio (1 1, 3 1, 1 1), per definire un cerchio completo. Utilizzare (1 1, 2 2, 3 1, 2 0, 1 1) per definire il cerchio.
Nell'esempio seguente vengono illustrate le istanze CircularString non valide.
DECLARE @g1 geometry = 'CIRCULARSTRING(1 1, 2 0, 1 1)';
DECLARE @g2 geometry = 'CIRCULARSTRING(0 0, 0 0, 0 0)';
SELECT @g1.STIsValid(), @g2.STIsValid();
Istanze con punti collineari
Nei casi seguenti un segmento di arco circolare sarà considerato come un segmento di linea:
Quando tutti e i tre punti sono collineari, ad esempio, (1 3, 4 4, 7 5).
Quando il primo punto e il punto medio sono gli stessi, ma il terzo punto è diverso, ad esempio, (1 3, 1 3, 7 5).
Quando il punto medio e l'ultimo punto sono gli stessi, ma il primo punto è diverso, ad esempio, (1 3, 4 4, 4 4).
Esempi
R. Creazione di un'istanza Geometry con un'istanza CircularString vuota
In questo esempio viene illustrato come creare un'istanza CircularString
vuota:
DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING EMPTY');
B. Creazione di un'istanza Geometry utilizzando un'istanza CircularString con un segmento di arco circolare
Nell'esempio seguente viene illustrato come creare un'istanza CircularString
con un solo segmento di arco circolare (mezzo cerchio):
DECLARE @g geometry;
SET @g = geometry:: STGeomFromText('CIRCULARSTRING(2 0, 1 1, 0 0)', 0);
SELECT @g.ToString();
C. Creazione di un'istanza Geometry utilizzando un'istanza CircularString con più segmenti di arco circolare
Nell'esempio seguente viene illustrato come creare un'istanza CircularString
con più di un segmento di arco circolare (cerchio completo):
DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1)');
SELECT 'Circumference = ' + CAST(@g.STLength() AS NVARCHAR(10));
Viene prodotto l'output seguente:
Circumference = 6.28319
Confrontare l'output quando viene utilizzata LineString
anziché CircularString
:
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(2 1, 1 2, 0 1, 1 0, 2 1)', 0);
SELECT 'Perimeter = ' + CAST(@g.STLength() AS NVARCHAR(10));
Viene prodotto l'output seguente:
Perimeter = 5.65685
Si noti che il valore dell'esempio CircularString
è vicino a 2π (2 * pi), ovvero la circonferenza effettiva del cerchio.
D. Dichiarazione e creazione di un'istanza Geometry utilizzando un'istanza CircularString nella stessa istruzione
In questo frammento viene illustrato come dichiarare e creare un'istanza geometry
con un'istanza CircularString
nella stessa istruzione:
DECLARE @g geometry = 'CIRCULARSTRING(0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)';
E. Creazione di un'istanza Geometry con un'istanza CircularString
Nell'esempio seguente viene illustrato come dichiarare e creare un'istanza geography
con un'istanza CircularString
:
DECLARE @g geography = 'CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653)';
F. Creazione di un'istanza Geometry con un'istanza CircularString che corrisponde a una linea retta
Nell'esempio seguente viene illustrato come creare un'istanza CircularString
che corrisponde a una linea retta:
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('CIRCULARSTRING(0 0, 1 2, 2 4)', 0);
Vedere anche
Panoramica dei tipi di dati spazialiCompoundCurveMakeValid (tipo di dati geography)MakeValid (tipo di dati geometry)STIsValid (tipo di dati geometry)STIsValid (tipo di dati geography)STLength (tipo di dati geometry)STStartPoint (tipo di dati geometry)STEndpoint (tipo di dati geometry)STPointN (tipo di dati geometry)STNumPoints (tipo di dati geometry)STIsRing (tipo di dati geometry)STIsClosed (geometry Data Type)geometry Tipo di dati)STPointOnSurface (tipo di dati geometry)LineString