Condividi tramite


CircularString

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL in Microsoft Fabric Warehouse nel database SQL di Microsoft Fabric in Microsoft Fabric

CircularString è una raccolta di zero o più segmenti di arco circolare continui. Un segmento di arco circolare è un segmento curvo definito da tre punti su un piano bidimensionale. Il primo punto non può corrispondere al terzo punto. Se tutti e tre i punti di un segmento di arco circolare sono collineari, il segmento di arco verrà gestito come un segmento di linea.

Istanze CircularString

Nel disegno seguente vengono illustrate le istanze CircularString valide:

Diagramma delle misurazioni spaziali di esempio CircularString.

Istanze accettate

Un’istanza CircularString viene accettata se è vuota o contiene un numero dispari di punti, n, dove n > 1. Le istanze CircularString seguenti vengono accettate.

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 indica che l'istanza CircularString potrebbe essere accettata, ma non valida. La dichiarazione dell'istanza CircularString seguente non viene accettata. Questa dichiarazione genera un'eccezione System.FormatException.

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

Istanze valide

Un'istanza CircularString valida deve essere vuota o disporre degli attributi seguenti:

  • Deve contenere almeno un segmento di arco circolare, cioè avere un minimo di tre punti.
  • L'ultimo endpoint per ogni segmento di arco circolare nella sequenza, a eccezione dell'ultimo segmento, deve essere il primo endpoint per il segmento successivo nella sequenza.
  • Deve contenere un numero di punti dispari.
  • Non deve sovrapporsi a un intervallo.
  • Anche se le istanze CircularString possono contenere segmenti di linea, questi segmenti di linea devono essere definiti da tre punti collineari.

Nell'esempio seguente vengono illustrate le istanze CircularString valide.

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

Un'istanza CircularString deve contenere almeno due segmenti di arco circolare per definire un cerchio completo. Un'istanza CircularString non può usare un singolo segmento di arco circolare, ad esempio (1 1, 3 1, 1 1), per definire un cerchio completo. Utilizzare (1 1, 2 2, 3 1, 2 0, 1 1) per definire il cerchio.

Nell'esempio seguente vengono illustrate le istanze CircularString non valide.

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

Istanze con punti collineari

Nei casi seguenti un segmento di arco circolare sarà considerato come un segmento di linea:

  • Quando tutti e i tre punti sono collineari, ad esempio, (1 3, 4 4, 7 5).
  • Quando il primo punto e il punto medio sono gli stessi, ma il terzo punto è diverso, ad esempio, (1 3, 1 3, 7 5).
  • Quando il punto medio e l'ultimo punto sono gli stessi, ma il primo punto è diverso, ad esempio, (1 3, 4 4, 4 4).

Esempi

R. Creare un'istanza Geometry con un elemento CircularString vuoto

In questo esempio viene illustrato come creare un'istanza CircularString vuota:

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

B. Creare un'istanza geometry usando un elemento CircularString con un segmento di arco circolare

L'esempio seguente mostra come creare un'istanza CircularString con un singolo segmento di arco circolare (mezzo cerchio):

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

C. Creare un'istanza geometry usando un elemento CircularString con più segmenti di arco circolare

L'esempio seguente mostra come creare un'istanza CircularString con più segmenti di arco circolare (cerchio completo):

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

Il set di risultati è il seguente.

Circumference = 6.28319  

Confrontare l'output quando viene utilizzata LineString anziché 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));  

Il set di risultati è il seguente.

Perimeter = 5.65685  

Il valore dell'esempio CircularString è vicino a 2∏, ovvero la circonferenza effettiva del cerchio.

D. Dichiarare e creare un'istanza Geometry con un elemento CircularString nella stessa istruzione

In questo frammento viene illustrato come dichiarare e creare un'istanza geometry con un'istanza CircularString nella stessa istruzione:

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

E. Creare un'istanza geography con circularString

Nell'esempio seguente viene illustrato come dichiarare e creare un'istanza geography con un'istanza 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. Creare un'istanza Geometry con un elemento CircularString che è una linea retta

Nell'esempio seguente viene illustrato come creare un'istanza CircularString che corrisponde a una linea retta:

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