Partilhar via


CircularString

Um CircularString é uma coleção de zero ou mais segmentos de arco circulares contínuos. Um segmento de arco circular é um segmento curvado definido por três pontos em um plano bidimensional; o primeiro ponto não pode ser igual ao terceiro ponto. Se todos os três pontos de um segmento de arco circular forem colineares, o segmento de arco será tratado como um segmento de linha.

Observação importanteImportante

Para obter uma descrição detalhada e exemplos dos novos recursos espaciais nesta versão, incluindo o subtipo CircularString, baixe o white paper sobre Novos recursos espaciais no SQL Server 2012.

Instâncias CircularString

O desenho seguinte mostra instâncias CircularString válidas:

5ff17e34-b578-4873-9d33-79500940d0bc

Instâncias aceitas

Uma instância CircularString será aceita se estiver vazia ou contiver um número ímpar de pontos, n, onde n > 1. As instâncias CircularString a seguir são aceitas.

DECLARE @g1 geometry = 'CIRCULARSTRING EMPTY';
DECLARE @g2 geometry = 'CIRCULARSTRING(1 1, 2 0, -1 1)';
DECLARE @g3 geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 2 0, 1 1)';

@g3 mostra que uma instância CircularString pode ser aceita, mas não válida. A declaração da instância CircularString a seguir não é aceita. Esta declaração lança uma System.FormatException.

DECLARE @g geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 1 1)';

Instâncias válidas

Uma instância CircularString válida deve estar vazia ou ter os seguintes atributos:

  • Deve conter, pelo menos, um segmento de arco circular (ou seja, que tenha um mínimo de três pontos).

  • O último ponto de extremidade para cada segmento de arco circular na sequência, com exceção do último segmento, deve ser o primeiro ponto de extremidade para o próximo segmento na sequência.

  • Deve ter um número ímpar de pontos.

  • Não pode se sobrepor a um intervalo.

  • Embora instâncias CircularString possam conter segmentos de linha, esses segmentos devem ser definidos por três pontos colineares.

O exemplo a seguir mostra instâncias CircularString válidas.

DECLARE @g1 geometry = 'CIRCULARSTRING EMPTY';
DECLARE @g2 geometry = 'CIRCULARSTRING(1 1, 2 0, -1 1)';
DECLARE @g3 geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 1 1, 0 1)';
DECLARE @g4 geometry = 'CIRCULARSTRING(1 1, 2 2, 2 2)';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(),@g4.STIsValid();

Uma instância CircularString deve conter, pelo menos, dois segmentos de arco circulares para definir um círculo completo. Uma instância CircularString não pode usar um único segmento de arco circular (como (1 1, 3 1, 1 1)) para definir um círculo completo. Use (1 1, 2 2, 3 1, 2 0, 1 1) para definir o círculo.

O exemplo a seguir mostra instâncias CircularString que não são válidas.

DECLARE @g1 geometry = 'CIRCULARSTRING(1 1, 2 0, 1 1)';
DECLARE @g2 geometry = 'CIRCULARSTRING(0 0, 0 0, 0 0)';
SELECT @g1.STIsValid(), @g2.STIsValid();

Instâncias com pontos colineares

Nos casos a seguir, um segmento de arco circular será tratado como um segmento de linha:

  • Quando todos os três pontos são colineares (por exemplo, (1 3, 4 4, 7 5)).

  • Quando o primeiro ponto e o ponto mediano são os mesmos, mas o terceiro ponto é diferente (por exemplo, (1 3, 1 3, 7 5)).

  • Quando o primeiro e o último pontos são os mesmos, mas o primeiro ponto é diferente (por exemplo, (1 3, 4 4, 4 4)).

Exemplos

A.Criando uma instância de geometry com uma CircularString vazia

Este exemplo mostra como criar uma instância CircularString vazia:

DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING EMPTY');

B.Criando uma instância de geometry usando uma CircularString com um segmento de arco circular

O exemplo a seguir mostra como criar uma instância CircularString com um único segmento de arco circular (meio-círculo):

DECLARE @g geometry;
SET @g = geometry:: STGeomFromText('CIRCULARSTRING(2 0, 1 1, 0 0)', 0);
SELECT @g.ToString();

C.Criando uma instância de geometry usando uma CircularString com vários segmentos de arco circular

O exemplo a seguir mostra como criar uma instância CircularString com mais de um segmento de arco circular (círculo cheio):

DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1)');
SELECT 'Circumference = ' + CAST(@g.STLength() AS NVARCHAR(10));  

Isso gera a saída a seguir:

Circumference = 6.28319

Compare a saída quando LineString é usada em vez de CircularString:

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(2 1, 1 2, 0 1, 1 0, 2 1)', 0);
SELECT 'Perimeter = ' + CAST(@g.STLength() AS NVARCHAR(10));

Isso gera a saída a seguir:

Perimeter = 5.65685

Observe que o valor do exemplo de CircularString está perto de 2∏, que é a circunferência real do círculo.

D.Declarando e criando uma instância de geometry com uma CircularString na mesma instrução

Este trecho mostra como declarar e criar uma instância de geometry com uma CircularString na mesma instrução:

DECLARE @g geometry = 'CIRCULARSTRING(0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)';

E.Criando uma instância de geography com uma CircularString

O exemplo a seguir mostra como declarar e criar uma instância de geography com uma CircularString:

DECLARE @g geography = 'CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653)';

F.Criando uma instância de geometry com uma CircularString que é uma linha reta

O exemplo a seguir mostra como criar uma instância CircularString que é uma linha reta:

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('CIRCULARSTRING(0 0, 1 2, 2 4)', 0);

Consulte também

Referência

MakeValid (tipos de dados de geografia)

MakeValid (tipo de dados geometry)

STIsValid (tipo de dados geometry)

STIsValid (tipo de dados geography)

STLength (tipo de dados geometry)

STStartPoint (tipo de dados geometry)

STEndpoint (tipo de dados geometry)

STPointN (tipo de dados geometry)

STNumPoints (tipo de dados geometry)

STIsRing (tipo de dados geometry)

STIsClosed (tipo de dados geometry)

STPointOnSurface (tipo de dados geometry)

Conceitos

Visão geral de tipos de dados espaciais

CompoundCurve

LineString