Condividi tramite


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