CompoundCurve
Un CompoundCurve
est une collection de zéro ou plusieurs instances continues CircularString
ou LineString
, de type geometry ou geography.
Important
Pour obtenir une description détaillée et des exemples des nouvelles fonctionnalités spatiales de cette version, y compris le CompoundCurve
sous-type, téléchargez le livre blanc New Spatial Features in SQL Server 2012.
Une instance CompoundCurve
vide peut être instanciée, mais pour qu'un CompoundCurve
soit valide, il doit respecter les critères suivants :
Il doit contenir au moins une instance
CircularString
ouLineString
.La séquence des instances
CircularString
ouLineString
doit être continue.
Si un CompoundCurve
contient une séquence de plusieurs CircularString
instances et LineString
, le point de terminaison de fin pour chaque instance à l’exception de la dernière instance doit être le point de terminaison de départ de la 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 dans un CircularString
n'ont pas besoin de 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.
Instances acceptées
L'instance CompoundCurve
est acceptée s'il s'agit d'une instance vide ou si elle répond aux critères suivants.
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.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.Notes
Cela inclut les coordonnées Z et M. Ainsi, les quatre coordonnées X, Y, Z et M doivent être identiques.
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.
L'instance
CompoundCurve
est acceptée.Toutes les instances de segment d'arc de cercle contenues par l'instance
CompoundCurve
sont des instances valides.
L'exemple suivant montre 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é du CircularString
instance, 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 valides CircularString
et LineString
, 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 CompoundCurve
dans 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 produit la sortie suivante : 12,566370... qui est l’équivalent de 4π (4 * pi). 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
La sortie se présente comme suit :
Circle One11.940039...
Circle Two12.566370...
Le périmètre du cercle 2 est d’environ 4π (4 * pi), qui est 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)LineStringCircularString Point de vue d’ensemble des types de données spatiales