Compartir a través de


CompoundCurve

es-ES: CompoundCurve es una colección de cero o más instancias continuas de tipos de geometría o geografía CircularString o LineString.

Importante

Para obtener una descripción detallada y ejemplos de las nuevas características espaciales de esta versión, incluido el CompoundCurve subtipo, descargue el documento técnico titulado Nuevas características espaciales en SQL Server 2012.

Se puede crear una instancia vacía CompoundCurve , pero para CompoundCurve que sea válido, debe cumplir los criterios siguientes:

  1. Debe contener al menos una instancia de CircularString o una de LineString.

  2. La secuencia de instancias de CircularString o LineString debe ser continua.

Si un CompoundCurve contiene una secuencia de varias instancias de CircularString y LineString, el punto final de cada instancia excepto la última instancia debe ser el punto de inicio para la siguiente instancia de la secuencia. Esto significa que si el punto final de una instancia anterior de la secuencia es (4 3 7 2), el punto inicial de la siguiente instancia de la secuencia debe ser (4 3 7 2). Tenga en cuenta que los valores Z(elevation) y M(measure) del punto también deben ser los mismos. Si hay una diferencia en los dos puntos, se lanza una System.FormatException excepción. Los puntos de un CircularString no tienen que tener un valor Z o M. Si no se proporcionan valores Z o M para el punto final de la instancia anterior, el punto inicial de la siguiente instancia no puede incluir valores Z o M. Si el punto final de la secuencia anterior es (4 3), el punto inicial de la siguiente secuencia debe ser (4 3); no puede ser (4 3 7 2). Todos los puntos de una instancia de CompoundCurve deben tener o bien ningún valor Z o bien el mismo valor Z.

Instancias de curva compuesta

En la ilustración siguiente se muestran los tipos válidos CompoundCurve .

Instancias aceptadas

CompoundCurve Se acepta la instancia si es una instancia vacía o cumple el siguiente criterio.

  1. Todas las instancias contenidas por CompoundCurve instancia son instancias de segmento de arco circular aceptadas. Para obtener más información sobre las instancias de segmento de arco circular aceptadas, consulte LineString y CircularString.

  2. Todos los segmentos de arco circular de la CompoundCurve instancia están conectados. El primer punto de cada segmento de arco circular sucesivo es el mismo que el último punto del segmento de arco circular precedente.

    Nota:

    Esto incluye las coordenadas Z y M. Por lo tanto, las cuatro coordenadas X, Y, Z y M deben ser las mismas.

  3. Ninguna de las instancias contenidas son instancias vacías.

En el ejemplo siguiente se muestran instancias aceptadas CompoundCurve .

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

En el ejemplo siguiente se muestran CompoundCurve instancias que no se aceptan. Estas instancias lanzan System.FormatException.

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

Instancias válidas

Una CompoundCurve instancia es válida si cumple los siguientes criterios.

  1. La CompoundCurve instancia se acepta.

  2. Todas las instancias de segmento de arco circular contenidas por la CompoundCurve instancia son instancias válidas.

En el ejemplo siguiente se muestran instancias válidas 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 es válido porque la CircularString instancia es válida. Para obtener más información sobre la validez de la CircularString instancia, consulte CircularString.

En el ejemplo siguiente se muestran CompoundCurve instancias que no son válidas.

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 no es válido porque la segunda instancia no es una instancia de LineString válida. @g2 no es válido porque la LineString instancia no es válida. @g3 no es válido porque la CircularString instancia no es válida. Para obtener más información sobre instancias válidas de CircularString y LineString, consulte CircularString y LineString.

Ejemplos

A. Instanciando una instancia de geometría con CompoundCurve vacío

En el ejemplo siguiente se muestra cómo crear una instancia vacía CompoundCurve :

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

B. Declaración e instancia de una geometría usando CompoundCurve en la misma instrucción

En el ejemplo siguiente se muestra cómo declarar e inicializar una geometry instancia con en CompoundCurvela misma instrucción:

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. Creación de instancias de una instancia de geography con compoundCurve

En el ejemplo siguiente se muestra cómo declarar e inicializar una geography instancia 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. Almacenamiento de un cuadrado en una instancia de CompoundCurve

En el ejemplo siguiente se usan dos maneras diferentes de usar una CompoundCurve instancia para almacenar un cuadrado.

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

Las longitudes para @g1 y @g2 son las mismas. Observe en el ejemplo que una CompoundCurve instancia puede almacenar una o varias instancias de LineString.

E. Creación de una instancia de geometría usando una CompoundCurve con varias CircularStrings

En el ejemplo siguiente se muestra cómo usar dos instancias diferentes CircularString para inicializar 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();

Esto genera la siguiente salida: 12.566370... que es el equivalente de 4π (4 * pi). La CompoundCurve instancia del ejemplo almacena un círculo con un radio de 2. Ambos ejemplos de código anteriores no tenían que usar CompoundCurve. En el primer ejemplo, una LineString instancia habría sido más sencilla y una CircularString instancia habría sido más sencilla para el segundo ejemplo. Sin embargo, en el ejemplo siguiente se muestra dónde CompoundCurve proporciona una alternativa mejor.

F. Usar un CompoundCurve para almacenar un semicírculo

En el ejemplo siguiente se usa una CompoundCurve instancia para almacenar un semicircular.

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

G. Almacenamiento de varias instancias de CircularString y LineString en compoundCurve

En el ejemplo siguiente se muestra cómo se pueden almacenar varias instancias de CircularString y LineString utilizando 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. Almacenamiento de instancias con valores Z y M

En el ejemplo siguiente se muestra cómo usar una instancia `CompoundCurve` para almacenar una secuencia de instancias `CircularString` y `LineString` con valores Z y 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. Ilustración del motivo por el que las instancias de CircularString deben declararse explícitamente

En el ejemplo siguiente se muestra por qué CircularString las instancias deben declararse explícitamente. El programador está intentando almacenar un círculo en una CompoundCurve instancia de .

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 salida es la siguiente:

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

El perímetro del círculo dos es aproximadamente 4π (4 * pi), que es el valor real del perímetro. Sin embargo, el perímetro de Circle One es significativamente inexacto. La instancia de CompoundCurve Circle One almacena un segmento de arco circular (ABC) y dos segmentos de línea (CD, DA). La CompoundCurve instancia tiene que almacenar dos segmentos de arco circular (ABC, CDA) para definir un círculo. Una LineString instancia define el segundo conjunto de puntos (4 2, 2 4, 0 2) en la instancia CompoundCurve de Circle One. Debe declarar explícitamente una instancia CircularString dentro de un CompoundCurve.

Véase también

STIsValid (tipo de datos geometry)STLength (tipo de datos geometry)STStartPoint (tipo de datos geometry)STEndpoint (tipo de datos geometry)LineStringCircularStringDescripción general de tipos de datos espacialesPunto