Compartilhar via


CircularString

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

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.

Instâncias CircularString

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

Exemplos de CircularString

Instâncias aceitas

Uma instância CircularString será aceita se estiver vazia ou contiver um número ímpar de pontos, n, em que 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 a 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

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

Esse 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 seguinte exemplo 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 seguinte exemplo 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));    

Veja a seguir o conjunto de resultados.

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));  

Veja a seguir o conjunto de resultados.

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 snippet 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);  

Confira também

Visão geral de tipos de dados espaciais
CompoundCurve
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)
LineString