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:
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). 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.
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. 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 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. 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
.