CircularString
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure
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.
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)';
@g3
mostra 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. Un'istanza CircularString non può usare 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
L'esempio seguente mostra come creare un'istanza CircularString con un singolo 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
L'esempio seguente mostra come creare un'istanza CircularString con più segmenti 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));
Il set di risultati è il 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));
Il set di risultati è il seguente.
Perimeter = 5.65685
Si noti che il valore per l'esempio CircularString è vicino a 2∏, che è 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);
Vedi anche
Panoramica dei tipi di dati spaziali
CompoundCurve
MakeValid (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 (tipo di dati geometry)
STPointOnSurface (tipo di dati geometry)
LineString