Compartilhar via


CircularString

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse no Microsoft Fabric Banco de dados SQL no Microsoft Fabric

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:

Diagrama de medidas espaciais de exemplo 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 as instâncias de CircularString possam conter segmentos de linha, esses segmentos de linha 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. Instanciar uma instância de geometria com um CircularString vazio

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

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

B. Instanciar uma instância de geometria usando um 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. Instanciar uma instância de geometria usando um 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  

O valor do exemplo CircularString é próximo de 2∏, que é a circunferência real do círculo.

D. Declare e instancie uma instância de geometry com um 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. Instanciar uma instância de geografia com um 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. Instanciar uma instância de Geometry com um 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);