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 SQL no Microsoft Fabric Warehouse 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 geometry com um CompooundCurve 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. Ilustrar 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
.