Condividi tramite


CompoundCurve

Un CompoundCurve oggetto è una raccolta di zero o più istanze continue CircularString o LineString di tipi geometry o geography.

Importante

Per una descrizione dettagliata ed esempi delle nuove funzionalità spaziali in questa versione, incluso il CompoundCurve sottotipo, scaricare il white paper New Spatial Features in SQL Server 2012.

È possibile creare un'istanza vuota CompoundCurve , ma affinché sia CompoundCurve valida, deve soddisfare i criteri seguenti:

  1. Deve contenere almeno un'istanza CircularString o LineString .

  2. La sequenza di CircularString istanze o LineString deve essere continua.

Se un CompoundCurve oggetto contiene una sequenza di più CircularString istanze e LineString , l'endpoint finale per ogni istanza, ad eccezione dell'ultima istanza, deve essere l'endpoint iniziale per l'istanza successiva nella sequenza. Ciò significa che se il punto finale di un'istanza precedente nella sequenza è (4 3 7 2), il punto iniziale dell'istanza successiva nella sequenza deve essere (4 3 7 2). Si noti che anche i valori Z(elevazione) e M(measure) per il punto devono essere uguali. Nel caso di una differenza nei due punti, viene generata un'eccezione System.FormatException . I punti in un CircularString non devono avere un valore Z o M. Se non sono presenti valori Z o M per il punto finale dell'istanza precedente, il punto iniziale dell'istanza successiva non potrà includere valori Z o M. Se il punto finale della sequenza precedente è (4 3), il punto iniziale della sequenza successiva dovrà essere (4 3). Non potrà essere (4 3 7 2). Tutti i punti in un'istanza CompoundCurve di non devono avere alcun valore Z o lo stesso valore Z.

Istanze CompoundCurve

La figura seguente mostra i tipi validi CompoundCurve .

Istanze accettate

CompoundCurve l'istanza viene accettata se si tratta di un'istanza vuota o soddisfa i criteri seguenti.

  1. Tutte le istanze contenute nell'istanza CompoundCurve vengono accettate istanze del segmento di arco circolare. Per altre informazioni sulle istanze di segmenti di arco circolare accettate, vedere LineString e CircularString.

  2. Tutti i segmenti di arco circolare nell'istanza CompoundCurve sono connessi. Il primo punto di ogni segmento di arco circolare successivo è uguale all'ultimo punto del segmento di arco circolare precedente.

    Annotazioni

    Sono incluse le coordinate Z e M. È quindi necessario che tutte e quattro le coordinate X, Y, Z e M siano uguali.

  3. Nessuna delle istanze contenute è un'istanza vuota.

L'esempio seguente mostra le istanze accettate CompoundCurve .

DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';

Nell'esempio seguente vengono illustrate CompoundCurve le istanze non accettate. Queste istanze generano un'eccezione System.FormatException.

DECLARE @g1 geometry = 'COMPOUNDCURVE(CIRCULARSTRING EMPTY)';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (1 0, 2 0))';

Istanze valide

Un'istanza CompoundCurve è valida se soddisfa i criteri seguenti.

  1. L'istanza CompoundCurve viene accettata.

  2. Tutte le istanze del segmento di arco circolare contenute nell'istanza CompoundCurve sono istanze valide.

Nell'esempio seguente vengono illustrate istanze valide CompoundCurve .

DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';
DECLARE @g3 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 1 1, 1 1), (1 1, 3 5, 5 4))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

@g3 è valido perché l'istanza CircularString è valida. Per altre informazioni sulla validità dell'istanza CircularString , vedere CircularString.

L'esempio seguente mostra CompoundCurve le istanze non valide.

DECLARE @g1 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 1 1, 1 1), (1 1, 3 5, 5 4, 3 5))';
DECLARE @g2 geometry = 'COMPOUNDCURVE((1 1, 1 1))';
DECLARE @g3 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 2 3, 1 1))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

@g1 non è valida perché la seconda istanza non è un'istanza LineString valida. @g2 non è valido perché l'istanza LineString non è valida. @g3 non è valido perché l'istanza CircularString non è valida. Per ulteriori informazioni sulle istanze valide CircularString e LineString, vedere CircularString e LineString.

Esempi

Un. Creazione di un'istanza di geometria con un CompoundCurve vuoto

Nell'esempio seguente viene illustrato come creare un'istanza CompoundCurve vuota:

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE EMPTY');

B. Dichiarazione e creazione di un'istanza di geometria tramite CompoundCurve nella medesima dichiarazione

L'esempio seguente illustra come dichiarare e inizializzare un'istanza geometry con un'istanza CompoundCurvenella stessa istruzione:

DECLARE @g geometry = 'COMPOUNDCURVE ((2 2, 0 0),CIRCULARSTRING (0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0))';

C. Creazione di un'istanza di geografia con CompoundCurve

Nell'esempio seguente viene illustrato come dichiarare e inizializzare un'istanza geography con :CompoundCurve

DECLARE @g geography = 'COMPOUNDCURVE(CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';

D. Archiviazione di un quadrato in un'istanza CompoundCurve

Nell'esempio seguente vengono utilizzate due diverse modalità per archiviare un quadrato tramite un'istanza CompoundCurve .

DECLARE @g1 geometry, @g2 geometry;
SET @g1 = geometry::Parse('COMPOUNDCURVE((1 1, 1 3), (1 3, 3 3),(3 3, 3 1), (3 1, 1 1))');
SET @g2 = geometry::Parse('COMPOUNDCURVE((1 1, 1 3, 3 3, 3 1, 1 1))');
SELECT @g1.STLength(), @g2.STLength();

Le lunghezze per @g1 e @g2 sono le stesse. Si noti che un'istanza CompoundCurve di può archiviare una o più istanze di LineString.

E. Creazione di un'istanza di geometria tramite CompoundCurve con più CircularStrings

Nell'esempio seguente viene illustrato come utilizzare due diverse istanze CircularString per creare un'istanza CompoundCurve:

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), CIRCULARSTRING(4 2, 2 4, 0 2))');
SELECT @g.STLength();

Viene generato l'output seguente: 12.566370... equivalente a 4π (4 * pi). L'istanza CompoundCurve riportata nell'esempio consente di archiviare un cerchio con un raggio di 2. In entrambi gli esempi di codice precedenti non è stato necessario utilizzare un'istanza CompoundCurve. Per il primo esempio sarebbe stata più semplice un'istanza LineString , mentre per il secondo esempio sarebbe stata più semplice un'istanza CircularString . Nell'esempio successivo viene tuttavia illustrato in quale punto un'istanza CompoundCurve costituisce una migliore alternativa.

F. Uso di CompoundCurve per archiviare un semicircolo

Nell'esempio seguente viene utilizzata un'istanza CompoundCurve per archiviare un semicerchio.

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 0 2))');
SELECT @g.STLength();

G. Archiviazione di più istanze CircularString e LineString in un CompoundCurve

Nell'esempio seguente viene illustrato come è possibile archiviare più istanze CircularString e LineString tramite un'istanza CompoundCurve.

DECLARE @g geometry
SET @g = geometry::Parse('COMPOUNDCURVE((3 5, 3 3), CIRCULARSTRING(3 3, 5 1, 7 3), (7 3, 7 5), CIRCULARSTRING(7 5, 5 7, 3 5))');
SELECT @g.STLength();

H. Archiviazione di istanze con valori Z e M

Nell'esempio seguente viene illustrato come utilizzare un'istanza CompoundCurve per archiviare una sequenza di istanze CircularString e LineString con valori Z e M.

SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(7 5 4 2, 5 7 4 2, 3 5 4 2), (3 5 4 2, 8 7 4 2))');

Io. Illustrare il motivo per cui le istanze CircularString devono essere dichiarate in modo esplicito

Nell'esempio seguente viene illustrato il motivo per cui è necessario dichiarare in modo esplicito le istanze CircularString . Il programmatore sta tentando di archiviare un cerchio in un'istanza CompoundCurve .

DECLARE @g1 geometry;  
DECLARE @g2 geometry;
SET @g1 = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 2 4, 0 2))');
SELECT 'Circle One', @g1.STLength() AS Perimeter;  -- gives an inaccurate amount
SET @g2 = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), CIRCULARSTRING(4 2, 2 4, 0 2))');
SELECT 'Circle Two', @g2.STLength() AS Perimeter;  -- now we get an accurate amount

L'output è il seguente:

Circle One11.940039...
Circle Two12.566370...

Il perimetro di Circle Two è di circa 4π (4 * pi), ovvero il valore effettivo per il perimetro. Il perimetro per Circle One, tuttavia, è significativamente impreciso. L'istanza di CompoundCurve Circle One archivia un segmento di arco circolare (ABC) e due segmenti di linea (CD, DA). L'istanza CompoundCurve deve archiviare due segmenti di arco circolare (ABC, CDA) per definire un cerchio. Tramite un'istanza LineString viene definito il secondo set di punti (4 2, 2 4, 0 2) nell'istanza CompoundCurve di Circle One. È necessario dichiarare in modo esplicito un'istanza CircularString in un'istanza CompoundCurve.

Vedere anche

STIsValid (tipo di dati geometry)STLength (tipo di dati geometry)STStartPoint (tipo di dati geometry)STEndpoint (tipo di dati geometry)LineStringCircularStringSpatial Data Types OverviewPoint