Condividi tramite


CurvePolygon

Un CurvePolygon è una superficie topologicamente chiusa definita da un anello di delimitazione esterno e zero o più anelli interni

Importante

Per una descrizione dettagliata ed esempi di funzionalità spaziali introdotte in SQL Server 2012, incluso il CurvePolygon sottotipo, scaricare il white paper Nuove funzionalità spaziali in SQL Server 2012.

I criteri seguenti definiscono gli attributi di un'istanza CurvePolygon :

  • Il limite dell'istanza è definito dall'anello CurvePolygon esterno e da tutti gli anelli interni.

  • L'interno dell'istanza CurvePolygon è lo spazio tra l'anello esterno e tutti gli anelli interni.

Un'istanza CurvePolygon è diversa da un'istanza Polygon in quanto un'istanza CurvePolygon può contenere i segmenti di arco circolare seguenti: CircularString e CompoundCurve.

Istanze CompoundCurve

La figura seguente mostra figure valide CurvePolygon :

Istanze accettate

Affinché un'istanza CurvePolygon venga accettata, deve essere vuota o contenere solo anelli di arco circolare accettati. Un anello di arco circolare accettato soddisfa i requisiti seguenti.

  1. È un'istanza accettata di LineString, CircularString o CompoundCurve. Per altre informazioni sulle istanze accettate, vedere LineString, CircularString e CompoundCurve.

  2. Ha almeno quattro punti.

  3. Il punto iniziale e finale ha le stesse coordinate X e Y.

    Annotazioni

    I valori Z e M vengono ignorati.

L'esempio seguente mostra le istanze accettate CurvePolygon .

DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';  
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0, 0 0))';  
DECLARE @g3 geometry = 'CURVEPOLYGON((0 0 1, 0 0 2, 0 0 3, 0 0 3))'  
DECLARE @g4 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';  
DECLARE @g5 geography = 'CURVEPOLYGON((-122.3 47, 122.3 -47, 125.7 -49, 121 -38, -122.3 47))';  

@g3 viene accettato anche se i punti iniziale e finale hanno valori Z diversi perché i valori Z vengono ignorati. @g5 viene accettato anche se l'istanza del geography tipo non è valida.

Gli esempi seguenti generano un'eccezione System.FormatException.

DECLARE @g1 geometry = 'CURVEPOLYGON((0 5, 0 0, 0 0, 0 0))';  
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0))';  

@g1 non è accettato perché i punti iniziale e finale non hanno lo stesso valore Y. @g2 non è accettato perché l'anello non dispone di punti sufficienti.

Istanze valide

Affinché un'istanza CurvePolygon sia valida, sia gli anelli esterni che quelli interni devono soddisfare i seguenti criteri:

  1. Possono toccare solo in corrispondenza di singoli punti tangenti.

  2. Non possono incrociarsi tra loro.

  3. Ogni anello deve contenere almeno quattro punti.

  4. Ogni anello deve essere di un tipo di curva accettabile.

CurvePolygon Anche le istanze devono soddisfare criteri specifici a seconda che siano geometry o geography tipi di dati.

Tipo di dati geometria

Un'istanza geometryCurvePolygon valida deve avere gli attributi seguenti:

  1. Tutti gli anelli interni devono essere contenuti all'interno dell'anello esterno.

  2. Può avere più anelli interni, ma un anello interno non può contenere un altro anello interno.

  3. Nessun anello può attraversare se stesso o un altro anello.

  4. Gli anelli possono toccare solo in corrispondenza di singoli punti tangenti (il numero di punti in cui gli anelli si toccano deve essere finito).

  5. L'interno del poligono deve essere connesso.

L'esempio seguente mostra istanze geometryCurvePolygon valide.

DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';  
DECLARE @g2 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';  
SELECT @g1.STIsValid(), @g2.STIsValid();  

Le istanze CurvePolygon hanno le stesse regole di validità delle istanze Polygon con l'eccezione che le istanze CurvePolygon possono accettare i nuovi tipi di segmento di arco circolare. Per altri esempi di istanze valide o non valide, vedere Polygon.

Tipo di dati geografia

Un'istanza geographyCurvePolygon valida deve avere gli attributi seguenti:

  1. L'interno del poligono è collegato usando la regola della mano sinistra.

  2. Nessun anello può attraversare se stesso o un altro anello.

  3. Gli anelli possono toccarsi solo in singoli punti tangenti (il numero di tali punti deve essere finito).

  4. L'interno del poligono deve essere connesso.

L'esempio seguente mostra un'istanza Geography CurvePolygon valida.

DECLARE @g geography = 'CURVEPOLYGON((-122.3 47, 122.3 47, 125.7 49, 121 38, -122.3 47))';  
SELECT @g.STIsValid();  

Esempi

Un. Istanziazione di un'istanza di geometria con un oggetto CurvePolygon vuoto

Questo esempio illustra come creare un'istanza vuota CurvePolygon :

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

B. Dichiarazione e istanziazione di un'istanza geometria con CurvePolygon nella stessa istruzione.

Questo frammento di codice illustra come dichiarare e inizializzare un'istanza di geometria con una CurvePolygon nella stessa istruzione.

DECLARE @g geometry = 'CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))'  

C. Creazione di un'istanza di geografia con un CurvePolygon

Questo frammento di codice mostra come dichiarare e inizializzare un'istanza geography con :CurvePolygon

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

D. Archiviazione di un poligono curvo con solo un anello di delimitazione esterno

Questo esempio mostra come archiviare un cerchio semplice in un'istanza CurvePolygon (viene usato solo un anello di delimitazione esterno per definire il cerchio):

DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');  
SELECT @g.STArea() AS Area;  

E. Archiviazione di un curvePolygon contenente anelli interni

Questo esempio crea una ciambella in un'istanza CurvePolygon (sia un anello di delimitazione esterno che un anello interno sono usati per definire la ciambella).

DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 4, 4 0, 8 4, 4 8, 0 4), CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');  
SELECT @g.STArea() AS Area;  

Questo esempio mostra sia un'istanza valida CurvePolygon che un'istanza non valida quando si usano anelli interni:

DECLARE @g1 geometry, @g2 geometry;  
SET @g1 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (-2 2, 2 2, 2 -2, -2 -2, -2 2))');  
IF @g1.STIsValid() = 1  
  BEGIN  
     SELECT @g1.STArea();  
  END  
SET @g2 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (0 5, 5 0, 0 -5, -5 0, 0 5))');  
IF @g2.STIsValid() = 1  
  BEGIN  
     SELECT @g2.STArea();  
  END  
SELECT @g1.STIsValid() AS G1, @g2.STIsValid() AS G2;  

Entrambi @g1 e @g2 usano lo stesso anello di delimitazione esterno: un cerchio con un raggio di 5 e entrambi usano un quadrato per un anello interno. Tuttavia, l'istanza @g1 è valida, ma l'istanza @g2 non è valida. Il motivo per cui @g2 non è valido è che l'anello interno divide lo spazio interno delimitato dall'anello esterno in quattro aree separate. Il disegno seguente mostra cosa si è verificato:

Vedere anche

Poligono
CircularString
CompoundCurve
Guida di riferimento ai metodi per il tipo di dati geometry
Guida di riferimento ai metodi per il tipo di dati geografici
Panoramica dei tipi di dati spaziali