CompoundCurve
Uma CompoundCurve
é uma coleção de zero ou mais instâncias CircularString
ou LineString
contínuas dos tipos geometry ou geography.
Importante
Para obter uma descrição detalhada e exemplos dos novos recursos espaciais nesta versão, incluindo o CompoundCurve
subtipo, baixe o white paper Novos Recursos Espaciais no SQL Server 2012.
Pode ser criada uma instância CompoundCurve
vazia, mas para que CompoundCurve
seja válida, ela deve atender aos seguintes critérios:
Deve conter pelo menos uma instância
CircularString
ouLineString
.A sequência de instâncias
CircularString
ouLineString
deve ser contínua.
Se um CompoundCurve
contiver uma sequência de várias CircularString
instâncias e LineString
, o ponto de extremidade final para cada instância, exceto a última instância, deverá ser o ponto de extremidade inicial para a 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
. Os 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 de CompoundCurve
válidos.
Instâncias aceitas
A instância CompoundCurve
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álido porque a instância CircularString
é válida. Para obter mais informações sobre a validade da CircularString
instância, consulte 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 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 CircularString
e LineString
, consulte CircularString e LineString.
Exemplos
a. 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 exemplo a seguir mostra como declarar e inicializar uma instância de geography
com uma 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 seguinte saída: 12,566370... que é o equivalente a 4π (4 * pi). 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
A saída é da seguinte maneira:
Circle One11.940039...
Circle Two12.566370...
O perímetro do Círculo Dois é de aproximadamente 4π (4 * pi), que é o valor real para o 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
.
Consulte Também
STIsValid (tipo de dados geometry)STLength (tipo de dados geometry)STStartPoint (tipo de dados geometry)STEndpoint (tipo de dados geometry)LineStringCircularStringPonto de visão geral dos tipos de dados espaciais