Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A CompoundCurve é uma coleção de zero ou mais instâncias contínuas CircularString ou LineString de tipos de geometria ou geografia.
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.
Uma instância vazia CompoundCurve pode ser instanciada, mas para CompoundCurve ser válida, ela deve atender aos seguintes critérios:
Ele deve conter pelo menos uma
CircularStringouLineStringinstância.A sequência de instâncias
CircularStringouLineStringdeve ser contínua.
Se uma CompoundCurve contiver uma sequência de várias instâncias de CircularString e LineString, o ponto de extremidade final de cada instância, exceto da última instância, 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 de partida para a próxima instância na sequência deverá ser (4 3 7 2). Observe que os valores de Z(elevação) e M(measure) para o ponto também devem ser os mesmos. Se houver uma diferença nos dois pontos, um System.FormatException é lançado. 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 próxima sequência deverá ser (4 3); não pode ser (4 3 7 2). Todos os pontos em uma CompoundCurve instância não devem ter nenhum valor Z ou o mesmo valor Z.
Instâncias de CompoundCurve
A ilustração a seguir mostra tipos válidos CompoundCurve .
Instâncias aceitas
CompoundCurve a instância será aceita se for uma instância vazia ou atender aos critérios a seguir.
Todas as instâncias de segmento de arco circular contidas pela instância
CompoundCurvesão aceitas. 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
CompoundCurveinstância estão conectados. O primeiro ponto de cada segmento de arco circular seguinte é igual ao último ponto do segmento de arco circular anterior.Observação
Isso inclui as coordenadas Z e M. Portanto, 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 as 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 abaixo mostra casos CompoundCurve que não são aceitos. 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 CompoundCurve instância será válida se atender aos critérios a seguir.
A
CompoundCurveinstância é aceita.Todas as instâncias de segmento de arco circular contidas na
CompoundCurveinstância 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 CircularString instância é válida. Para obter mais informações sobre a validade da CircularString instância, consulte CircularString.
O exemplo a seguir mostra CompoundCurve instâncias 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 LineString instância não é válida.
@g3 não é válido porque a CircularString instância não é válida. Para obter mais informações sobre CircularString e LineString instâncias válidas, consulte CircularString e LineString.
Exemplos
Um. Instanciando uma instância de geometria com um CompooundCurve vazio
O exemplo a seguir mostra como criar uma instância vazia CompoundCurve :
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE EMPTY');
B. Declarando e instanciando uma instância de geometria usando um CompoundCurve na mesma instrução
O exemplo a seguir mostra como declarar e inicializar uma geometry instância com uma CompoundCurvena 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. Instanciando uma instância de geografia com um CompoundCurve
O exemplo a seguir mostra como declarar e inicializar uma geography instância 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 a seguir usa duas maneiras diferentes de usar uma CompoundCurve instância 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 ambos @g1 e @g2 são os mesmos. Observe no exemplo que uma CompoundCurve instância pode armazenar uma ou mais instâncias de LineString.
E. Instanciando uma instância de geometria usando um CompoundCurve com várias CircularStrings
O exemplo a seguir mostra como usar duas instâncias diferentes CircularString 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 CompoundCurve instância no exemplo armazena um círculo com um raio de 2. Ambos os exemplos de código anteriores não tinham que 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 uma CompoundCurve alternativa é melhor.
F. Usando um CompoundCurve para armazenar um semicírculo
O exemplo a seguir usa uma CompoundCurve instância 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 um CompoundCurve
O exemplo a seguir mostra como várias instâncias de CircularString e LineString podem ser armazenadas ao usar 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. Armazenando instâncias com valores Z e M
O exemplo a seguir mostra como usar uma instância de CompoundCurve para armazenar uma sequência de instâncias de 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))');
Eu. Ilustrando por que as instâncias de CircularString devem ser declaradas explicitamente
O exemplo a seguir mostra por que CircularString as instâncias devem ser declaradas explicitamente. O programador está tentando armazenar um círculo em uma CompoundCurve instância.
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 é a seguinte:
Circle One11.940039...
Circle Two12.566370...
O perímetro do Círculo Dois é aproximadamente 4π (4 * pi), que é o valor real para o perímetro. No entanto, o perímetro do Círculo Um é significativamente impreciso. A instância do CompoundCurve Circle One armazena um abc (segmento de arco circular) 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 LineString instância define o segundo conjunto de pontos (4 2, 2 4, 0 2) na instância do CompoundCurve Círculo Um. Você precisa declarar explicitamente uma CircularString instância dentro de um CompoundCurve.
Consulte Também
STIsValid (tipo de dados geometry)STLength (tipo de dados geometry)STStartPoint (tipo de dados geometry)STEndpoint (tipo de dados geometry)LinhaString CircularVisão Geral sobre Tipos de Dados EspaciaisPonto