Curva composta
Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azureponto de extremidade de análise SQL no Microsoft FabricWarehouse no Microsoft Fabricbanco de dados SQL no Microsoft Fabric
Um CompoundCurve
Uma instância de CompoundCurve vazia de
Ele deve conter pelo menos uma instância de CircularString ou LineString.
A sequência de instâncias de CircularString ou de LineString deve ser contínua.
Se um CompoundCurve contiver uma sequência de várias instâncias de CircularString e LineString, o ponto de extremidade final para cada instância, exceto para a última instância, deverá ser o ponto de extremidade inicial para a próxima instância na sequência. Isto significa que, se o ponto final de uma instância anterior na sequência for (4 3 7 2), o ponto de partida para a próxima instância na sequência deve ser (4 3 7 2). Os valores Z(elevação) e M(medida) para o ponto também devem ser os mesmos. Se houver uma diferença entre os dois pontos, uma System.FormatException
é lançada. Os pontos em um CircularString não precisam ter um valor Z ou M. Se nenhum valor Z ou M for fornecido 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 de partida para a sequência seguinte deve ser (4 3); não pode ser (4, 3, 7, 2). Todos os pontos em uma instância de CompoundCurve
Instâncias de Curva Composta
A seguinte ilustração mostra tipos válidos de CompoundCurve.
Instâncias aceites
instância de CompoundCurve será aceita se for uma instância vazia ou atender aos seguintes critérios.
Todas as instâncias contidas na instância de CompoundCurve são aceites como instâncias de segmento de arco circular. Para obter mais informações sobre instâncias de segmento de arco circular aceitas, consulte LineString e CircularString.
Todos os segmentos de arco circular na instância de CompoundCurve estão conectados. O primeiro ponto para cada segmento de arco circular subsequente é o mesmo que o último ponto no segmento de arco circular precedente.
Observação
Isso inclui as coordenadas Z e M. Assim, todas as quatro coordenadas X, Y, Z e M devem ser as mesmas.
Nenhuma das instâncias contidas é uma instância vazia.
O exemplo a seguir mostra instâncias aceitas de CompoundCurve.
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 CompoundCurve instâncias que não são aceitas. Estes casos 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 de CompoundCurve é válida se atender aos seguintes critérios.
A instância CompoundCurve é aceite.
Todas as instâncias de segmento de arco circular contidas pela instância CompoundCurve
são instâncias válidas.
O exemplo a seguir mostra instâncias válidas de CompoundCurve .
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álido porque a instância de CircularString é válida. Para obter mais informações sobre a validade da instância de
O exemplo a seguir mostra instâncias de 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 LineString válida.
@g2
não é válido porque a instância de LineString não é válida.
@g3
não é válido porque a instância de CircularString não é válida. Para obter mais informações sobre instâncias válidas de CircularString e LineString, consulte CircularString e LineString.
Exemplos
Um. Instanciar uma instância de geometria com um CompoundCurve vazio
O exemplo a seguir mostra como criar uma instância de CompoundCurve
vazia:
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE EMPTY');
B. Declarar e instanciar uma instância de geometria usando um CompoundCurve na mesma instrução
O exemplo a seguir 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 de geografia com um CompoundCurve
O exemplo a seguir mostra como declarar e inicializar uma instância de geografia 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 a seguir usa duas maneiras diferentes de usar uma instância CompoundCurve
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 para @g1
e @g2
são os mesmos. Observe no exemplo que uma instância de CompoundCurve
E. Instanciar uma instância de geometria usando um CompoundCurve com várias CircularStrings
O exemplo a seguir mostra como usar duas instâncias de CircularString
diferentes para inicializar um 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();
Isto produz a saída 12.5663706143592
que é o equivalente a 4pi. A CompoundCurve
instância no exemplo armazena um círculo com um raio de 2. Ambos os exemplos de código anteriores não precisavam usar um CompoundCurve
. Para o primeiro exemplo, uma LineString
instância teria sido mais simples, e uma CircularString
instância teria sido mais simples para o segundo exemplo. No entanto, o próximo exemplo mostra onde um CompoundCurve
fornece uma alternativa melhor.
F. Utilize 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 CircularString e LineString em um CompoundCurve
O exemplo a seguir mostra como várias instâncias CircularString
e LineString
podem ser armazenadas usando um 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 CircularString devem ser declaradas explicitamente
O exemplo a seguir mostra porque instâncias CircularString
devem ser declaradas explicitamente. O programador está a tentar armazenar um círculo numa 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
Aqui está o conjunto de resultados.
Circle One11.940039...
Circle Two12.566370...
O perímetro para o Círculo Dois é de aproximadamente 4pi, que é o valor real para o perímetro. No entanto, o perímetro do Círculo Um é significativamente impreciso. A instância CompoundCurve
do Circle One armazena um segmento de arco circular (ABC
) e dois segmentos de linha (CD
, DA
). A CompoundCurve
instância tem que armazenar dois segmentos de arco circular (ABC
, CDA
) para definir um círculo. A instância LineString
define o segundo conjunto de pontos (4 2, 2 4, 0 2) na instância CompoundCurve
do Circle One. Você precisa declarar explicitamente uma instância CircularString
dentro de um CompoundCurve
.