Compartir a través de


CompoundCurve

Se aplica a: Sql Server Azure SQL Database Azure SQL Instancia administrada punto de conexión de SQL Analytics en Microsoft Fabric Warehouse en la base de datos SQL de Microsoft Fabric en Microsoft Fabric

CompoundCurve es una colección de cero o más instancias de CircularString o LineString continuas de tipos geometry o geography.

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

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

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

Si una CompoundCurve contiene una secuencia de varias instancias de CircularString y LineString , el extremo final de cada instancia, salvo la última, debe ser el extremo inicial de 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 para la instancia siguiente de la secuencia debe ser (4 3 7 2). Los valores Z(elevation) y M(measure) para el punto también deben ser los mismos. Si hay diferencia entre ambos puntos, se produce una excepción System.FormatException . Los puntos de una CircularString no tienen que tener 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 instancia siguiente no puede incluir valores Z o M. Si el punto final para la secuencia anterior es (4 3), el punto inicial para la secuencia siguiente debe ser (4 3); no puede ser (4 3 7 2). Todos los puntos de una instancia CompoundCurve deben tener el mismo valor Z, o bien, ningún valor Z.

Instancias de CompoundCurve

La siguiente ilustración muestra tipos válidos de CompoundCurve .

Diagrama de ejemplos de CompoundCurve.

Instancias aceptadas

Se acepta la instanciaCompoundCurve si es una instancia vacía o cumple los siguientes criterios.

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

  2. Todos los segmentos de arco circulares contenidos en la instancia CompoundCurve están conectados. El primer punto de cada segmento de arco circular siguiente coincide con el último punto del segmento de arco circular precedente.

    Nota:

    Esto incluye las coordenadas Z y M. Por tanto, las cuatro coordenadas X, Y, Z y M deben coincidir para ambos puntos.

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

El siguiente ejemplo muestra instancias aceptadas de CompoundCurve .

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

El siguiente ejemplo muestra instancias de CompoundCurve no aceptadas. Estas instancias producen una excepción 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 instancia de CompoundCurve es válida si cumple los siguientes criterios.

  1. La instancia de CompoundCurve es aceptada.

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

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

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

Ejemplos

A Creación de instancias de una instancia de geometry con un compooundCurve vacío

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

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

B. Declarar e crear instancias de una instancia de geometry mediante compoundCurve en la misma instrucción

En el siguiente ejemplo, se muestra cómo declarar e inicializar una instancia de geometry con una CompoundCurveen la 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 siguiente ejemplo se muestra cómo declarar e inicializar una instancia geography con un elemento 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. Almacenar un cuadrado en una instancia de CompoundCurve

En el siguiente ejemplo, se muestran dos maneras diferentes de utilizar una instancia CompoundCurve 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 de @g1 y @g2 son iguales. Observe en el ejemplo que una instancia de CompoundCurve puede almacenar una o más instancias de LineString.

E. Creación de instancias de una instancia de geometry mediante CompoundCurve con varias CircularStrings

En el siguiente ejemplo, se muestra cómo utilizar dos instancias CircularString diferentes para inicializar una 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 produce la salida 12.5663706143592 que es el equivalente de 4pi. La instancia de CompoundCurve del ejemplo almacena un círculo de radio 2. Ambos ejemplos de código anteriores no tuvieron que utilizar una CompoundCurve. Para el primer ejemplo, habría sido más fácil utilizar una instancia de LineString , mientras que para el segundo ejemplo habría sido más fácil una instancia de CircularString . Sin embargo, el ejemplo siguiente muestra un caso donde CompoundCurve proporciona una mejor alternativa.

F. Usar compoundCurve para almacenar un semicircular

En el siguiente ejemplo, se utiliza una instancia de CompoundCurve para almacenar un semicírculo.

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

G. Almacenar varias instancias de CircularString y LineString en compoundCurve

En el siguiente ejemplo, se muestra cómo se pueden almacenar varias instancias de CircularString y LineString mediante una 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 siguiente ejemplo, se muestra cómo utilizar 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. Por qué las instancias de CircularString deben declararse explícitamente

En el siguiente ejemplo, se muestra por qué se deben declarar explícitamente las instancias de CircularString . El programador está intentando almacenar un círculo en una instancia de 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  

Este es el conjunto de resultados.

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

El perímetro de Circle Two es de aproximadamente 4pi, que es el valor real del perímetro. Sin embargo, el perímetro para el círculo uno 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 instancia LineString define el segundo conjunto de puntos (4 2, 2 4, 0 2) en la instancia CompoundCurve del círculo uno. Es necesario declarar explícitamente una instancia CircularString dentro de una CompoundCurve.