Compartilhar via


CompoundCurve

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Uma CompoundCurve é uma coleção de zero ou mais instâncias CircularString ou LineString contínuas 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). Observe que os valores Z (elevação) e M (medida) do ponto também devem ser iguais. 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.

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. Criando uma instância de geometry com uma CompoundCurve vazia

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

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

B. Declarando e criando uma instância de geometry usando uma 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. Criando uma instância de geography com uma 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. Armazenando um quadrado em uma instância 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. Criando uma instância de geometry que usa uma CompoundCurve com várias 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 do 4?. 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. Usando uma 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. Armazenando várias instâncias CircularString e LineString em uma 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. Armazenando 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. Ilustrando por que as instâncias 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 de Circle Two é aproximadamente 4?, que é o valor real do perímetro. Porém, o perímetro de Circle One é significativamente inexato. A instância CompoundCurve de Circle One armazena um segmento de arco circular (ABC) e dois segmentos de linha (CD, DA). A instância CompoundCurve deve 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.

Confira também

STIsValid (tipo de dados geometry)
STLength (tipo de dados geometry)
STStartPoint (tipo de dados geometry)
STEndpoint (tipo de dados geometry)
LineString
CircularString
Visão geral de tipos de dados espaciais
Ponto