CircularString

Si applica a:SQL ServerDatabase SQL di AzureIstanza 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:

CircularString examples

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

Questo è il set di risultati.

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

Questo è il set di risultati.

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

Vedere 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