Partager via


CompoundCurve

S’applique à : SQL Server base de données Azure SQL Azure SQL Managed Instance

Un CompoundCurve est une collection de zéro ou plusieurs instances continues CircularString ou LineString de type geometry ou geography.

Une instance CompoundCurve vide peut être instanciée, mais pour qu’un CompoundCurve soit valide, il doit respecter les critères suivants :

  1. Il doit contenir au moins une instance CircularString ou LineString .

  2. La séquence d’instances CircularString ou LineString doit être continue.

Si un CompoundCurve contient une séquence de plusieurs instances CircularString et LineString , le point de terminaison de fin de chaque instance, à l’exception de la dernière, doit correspondre au point de terminaison de début de l’instance suivante dans la séquence. Cela signifie que si le point de fin d'une instance précédente dans la séquence est (4 3 7 2), le point de départ de l'instance suivante dans la séquence doit être (4 3 7 2). Notez que les valeurs Z (élévation) et M (mesure) du point doivent également être identiques. Si les deux points présentent une différence, une System.FormatException est levée. Les points d’un CircularString n’ont pas besoin d’une valeur Z ou M. Si aucune valeur Z ou M n'est indiquée pour le point de fin de l'instance précédente, le point de départ de l'instance suivante ne peut pas inclure de valeur Z ou M. Si le point de fin de la séquence précédente est (4 3), le point de départ de la séquence suivante doit être (4 3), mais pas (4 3 7 2). Tous les points d’une instance CompoundCurve doivent soit ne pas avoir de valeur Z, soit avoir une valeur Z identique.

Instances CompoundCurve

L’illustration suivante montre des types de CompoundCurve valides.

Exemples CompoundCurve

Instances acceptées

L’instanceCompoundCurve est acceptée s’il s’agit d’une instance vide ou si elle répond aux critères suivants.

  1. Toutes les instances contenues par l’instance CompoundCurve sont des instances de segment d’arc de cercle acceptées. Pour plus d’informations sur les instances de segment d’arc de cercle acceptées, consultez LineString et CircularString.

  2. Tous les segments d’arc de cercle dans l’instance CompoundCurve sont connectés. Le premier point de chaque segment d’arc de cercle suivant est identique au dernier point du segment d’arc de cercle précédent.

    Remarque

    Cela inclut les coordonnées Z et M. Ainsi, les quatre coordonnées X, Y, Z et M doivent être identiques.

  3. Aucune des instances contenues n'est une instance vide.

L’exemple suivant illustre des instances CompoundCurve acceptées.

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

L’exemple suivant montre des instances CompoundCurve qui ne sont pas acceptées. Ces instances lèvent une System.FormatException.

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

Instances valides

Une instance CompoundCurve est valide si elle répond aux critères suivants.

  1. L’instance CompoundCurve est acceptée.

  2. Toutes les instances de segment d’arc de cercle contenues par l’instance CompoundCurve sont des instances valides.

L’exemple suivant illustre des instances CompoundCurve valides.

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 est valide parce que l’instance CircularString est valide. Pour plus d’informations sur la validité de l’instance CircularString , consultez CircularString.

L’exemple suivant montre des instances CompoundCurve qui ne sont pas valides.

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 n’est pas valide car la deuxième instance n’est pas une instance LineString valide. @g2 n’est pas valide car l’instance LineString n’est pas valide. @g3 n’est pas valide car l’instance CircularString n’est pas valide. Pour plus d’informations sur les instances CircularString et LineString valides, consultez CircularString et LineString.

Exemples

R. Instanciation d'une instance geometry avec un CompooundCurve vide

L'exemple suivant montre comment créer une instance CompoundCurve vide :

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

B. Déclaration et instanciation d'une instance geometry à l'aide d'un CompoundCurve dans la même instruction

L’exemple suivant indique comment déclarer et initialiser une instance geometry avec CompoundCurvedans la même instruction :

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. Instanciation d'une instance geography avec un CompoundCurve

L’exemple suivant indique comment déclarer et initialiser une instance geography avec un 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. Stocker un carré dans une instance CompoundCurve

L'exemple suivant montre deux façons différentes d'utiliser une instance CompoundCurve pour stocker un carré.

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

Les longueurs de @g1 et @g2 sont identiques. Notez dans cet exemple qu’une instance CompoundCurve peut stocker une ou plusieurs instances LineString.

E. Instanciation d'une instance geometry à l'aide d'un CompoundCurve avec plusieurs CircularStrings

L'exemple suivant montre comment utiliser deux instances CircularString différentes pour initialiser un 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();  

Cela génère la sortie 12.5663706143592, qui est l’équivalent de 4?. L'instance CompoundCurve de l'exemple stocke un cercle avec un rayon de 2. Les deux exemples de code précédents n'ont pas eu à utiliser un CompoundCurve. Pour le premier exemple, une instance LineString aurait été plus simple et pour le deuxième exemple, une instance CircularString . Toutefois, l'exemple suivant montre en quoi un CompoundCurve constitue une meilleure solution.

F. Utilisation d'un CompoundCurve pour stocker un demi-cercle

L'exemple suivant utilise une instance CompoundCurve pour stocker un demi-cercle.

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

G. Stocker plusieurs instances CircularString et LineString dans un CompoundCurve

L'exemple suivant montre comment plusieurs instances CircularString et LineString peuvent être stockées à l'aide d'un 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. Stockage d'instances avec des valeurs Z et M

L'exemple suivant indique comment utiliser une instance CompoundCurve pour stocker une séquence d'instances CircularString et LineString comportant toutes deux des valeurs Z et 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))');  

I. Illustration de la raison pour laquelle les instances CircularString doivent être déclarées de manière explicite

L'exemple suivant montre pourquoi les instances CircularString doivent être déclarées de manière explicite. Le programmeur essaie de stocker un cercle dans une instance 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  

Voici le jeu de résultats obtenu.

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

Le périmètre du Cercle deux est approximativement de 4?, ce qui correspond à la valeur réelle du périmètre. Toutefois, le périmètre de Circle One est exagérément inexact. L'instance CompoundCurve de Circle One stocke un segment d'arc de cercle (ABC) et deux segments de ligne (CD, DA). L'instance CompoundCurve doit stocker deux segments d'arc de cercle (ABC, CDA) pour définir un cercle. Une instance LineString définit le deuxième ensemble de points (4 2, 2 4, 0 2) dans l'instance CompoundCurve de Circle One. Vous devez déclarer de manière explicite une instance CircularString à l'intérieur d'un CompoundCurve.

Voir aussi

STIsValid (type de données geometry)
STLength (type de données geometry)
STStartPoint (type de données geometry)
STEndpoint (type de données geometry)
LineString
CircularString
Présentation des types de données spatiales
Point