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:
Deve conter, pelo menos, uma instância CircularString ou LineString .
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.
Instâncias aceitas
A instânciaCompoundCurve será aceita se for uma instância vazia ou se atender aos critérios a seguir.
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.
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.
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.
A instância CompoundCurve é aceita.
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 CompoundCurve
na 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