Compartilhar via


CompoundCurve

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse no Microsoft Fabric Bancode dados SQL no Microsoft Fabric

Um CompoundCurve é uma coleção de zero ou mais instâncias contínuas de CircularString ou LineString dos tipos geometry ou geography .

Pode ser criada uma instância CompoundCurve vazia, mas para que CompoundCurve seja válida, ela deverá atender aos seguintes critérios:

  1. Deve conter, pelo menos, uma instância CircularString ou LineString .

  2. A sequência das instâncias CircularString ou LineString deve ser contínua.

Se uma CompoundCurve contiver uma sequência de várias instâncias CircularString e LineString , o ponto de extremidade final de cada instância, exceto a última, deverá ser o ponto de extremidade inicial da próxima instância na sequência. Isso significa que, se o ponto final de uma instância anterior na sequência for (4 3 7 2), o ponto inicial da próxima instância na sequência deverá ser (4 3 7 2). Os valores de Z (elevação) e M (medida) para o ponto também devem ser os mesmos. Se houver uma diferença nos dois pontos, será lançada uma System.FormatException . Pontos em uma CircularString não precisam ter um valor Z ou M. Se não forem fornecidos valores Z ou M para o ponto final da instância anterior, o ponto inicial da próxima instância não poderá incluir valores Z ou M. Se o ponto final da sequência anterior for (4 3), o ponto inicial da próxima sequência deverá ser (4 3); ele não poderá ser (4 3 7 2). Todos os pontos em uma instância CompoundCurve não devem ter nenhum valor Z ou devem ter o mesmo valor Z.

Instâncias CompoundCurve

A ilustração a seguir mostra tipos CompoundCurve válidos.

Diagrama de exemplos de CompoundCurve.

Instâncias aceitas

A instânciaCompoundCurve será aceita se for uma instância vazia ou se atender aos critérios a seguir.

  1. Todas as instâncias contidas na instância CompoundCurve são instâncias de segmento de arco circular aceitas. Para obter mais informações sobre instâncias de segmento de arco circular aceitas, veja LineString e CircularString.

  2. Todos os segmentos de arco circular na instância CompoundCurve estão conectados. O primeiro ponto de cada segmento de arco circular sucessivo é igual ao último ponto no segmento de arco circular anterior.

    Observação

    Isso inclui as coordenadas Z e M. Assim, as quatro coordenadas X, Y, Z e M devem ser iguais.

  3. Nenhuma das instâncias contidas é uma instância vazia.

O exemplo a seguir mostra instâncias CompoundCurve aceitas.

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

O exemplo a seguir mostra instâncias CompoundCurve que não são aceitas. Essas instâncias lançam System.FormatException.

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

Instâncias válidas

Uma instância CompoundCurve será válida se atender aos critérios a seguir.

  1. A instância CompoundCurve é aceita.

  2. Todas as instâncias de segmento de arco circular contidas na instância CompoundCurve são instâncias válidas.

O exemplo a seguir mostra instâncias CompoundCurve válidas.

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 é válida, pois a instância CircularString é válida. Para obter mais informações sobre a validade da instância CircularString , veja CircularString.

O exemplo a seguir mostra instâncias CompoundCurve que não são 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 não é válido porque a segunda instância não é uma instância de LineString válida. @g2 não é válido porque a instância LineString não é válida. @g3 não é válida, pois a instância CircularString não é válida. Para obter mais informações sobre instâncias CircularString e LineString válidas, veja CircularString e LineString.

Exemplos

R. Instanciar uma instância de geometria com um CompoundCurve vazio

O exemplo a seguir mostra como criar uma instância CompoundCurve vazia:

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

B. Declarar e instanciar uma instância de geometry usando um CompoundCurve na mesma instrução

O seguinte exemplo mostra como declarar e inicializar uma instância geometry com um CompoundCurvena mesma instrução:

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. Instanciar uma instância geography com um CompoundCurve

O seguinte exemplo mostra como declarar e inicializar uma instância geography com um 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. Armazenar um quadrado em uma instância de CompoundCurve

O exemplo seguinte usa uma instância CompoundCurve de duas maneiras diferentes para armazenar um quadrado.

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

Os comprimentos de @g1 e @g2 são iguais. Observe que, no exemplo, uma instância CompoundCurve pode armazenar uma ou mais instâncias LineString.

E. Instanciar uma instância de geometria usando um CompoundCurve com vários CircularStrings

O exemplo a seguir mostra como usar duas instâncias CircularString diferentes para inicializar uma 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();  

Isso produz a saída 12.5663706143592 que é o equivalente a 4pi. A instância CompoundCurve do exemplo armazena um círculo com raio 2. Os dois exemplos de código anteriores não precisavam usar uma CompoundCurve. Teria sido mais simples usar uma instância LineString no primeiro exemplo e uma instância CircularString no segundo exemplo. Porém, o próximo exemplo mostra onde uma CompoundCurve oferece uma alternativa melhor.

F. Usar um CompoundCurve para armazenar um semicírculo

O exemplo a seguir usa uma instância CompoundCurve para armazenar um 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. Armazene várias instâncias de CircularString e LineString em um CompoundCurve

O exemplo a seguir mostra como várias instâncias CircularString e LineString podem ser armazenadas usando uma 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. Armazenar instâncias com valores Z e M

O exemplo a seguir mostra como usar uma instância CompoundCurve para armazenar uma sequência de instâncias CircularString e LineString com valores 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))');  

I. Por que as instâncias de CircularString devem ser declaradas explicitamente

O exemplo a seguir mostra por que as instâncias CircularString devem ser declaradas explicitamente. O programador está tentando armazenar um círculo em uma instância 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  

Veja a seguir o conjunto de resultados.

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

O perímetro do Círculo Dois é de aproximadamente 4pi, que é o valor real do perímetro. Porém, o perímetro de Circle One é significativamente inexato. A instância do CompoundCurve Circle One armazena um segmento de arco circular (ABC) e dois segmentos de linha (CD, DA). A CompoundCurve instância precisa armazenar dois segmentos de arco circular (ABC, CDA) para definir um círculo. Uma instância LineString define o segundo conjunto de pontos (4 2, 2 4, 0 2) na instância CompoundCurve de Circle One. Você deve declarar uma instância CircularString explicitamente dentro de uma CompoundCurve.