Condividi tramite


Poligono

Un Polygon è una superficie bidimensionale archiviata come sequenza di punti che definiscono un anello di delimitazione esterno e zero o più anelli interni.

Istanze poligono

Un'istanza Polygon può essere formata da un anello con almeno tre punti distinti. Un'istanza Polygon può anche essere vuota.

L'esterno e gli anelli interni di un Polygon definiscono il suo limite. Lo spazio all'interno degli anelli definisce l'interno dell'oggetto Polygon.

La figura seguente mostra esempi di Polygon istanze.

Esempi di istanze di geometria dei poligoni

Come illustrato nella figura:

  1. La figura 1 è un'istanza Polygon il cui limite è definito da un anello esterno.

  2. La figura 2 è un'istanza Polygon il cui limite è definito da un anello esterno e due anelli interni. L'area all'interno degli anelli interni fa parte dell'area esterna dell'istanza Polygon.

  3. La figura 3 è un'istanza valida Polygon perché i relativi anelli interni si intersecano in un singolo punto tangente.

Istanze accettate

Le istanze accettate Polygon sono istanze che possono essere archiviate in una geometry variabile o geography senza generare un'eccezione. Di seguito sono riportate le istanze accettate Polygon :

  • Istanza vuota Polygon

  • Polygon Istanza con un anello esterno accettabile e zero o più anelli interni accettabili

I criteri seguenti sono necessari affinché un anello sia accettabile.

  • L'istanza LineString deve essere accettata.

  • L'istanza LineString deve avere almeno quattro punti.

  • I punti iniziali e finali dell'istanza LineString devono essere uguali.

L'esempio seguente mostra le istanze accettate Polygon .

DECLARE @g1 geometry = 'POLYGON EMPTY';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 1))';
DECLARE @g3 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 3 3, 0 3, 0 0))';
DECLARE @g4 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(3 0, 6 0, 6 3, 3 3, 3 0))';
DECLARE @g5 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';

Come mostrano @g4 e @g5, un'istanza di Polygon accettata potrebbe non essere un'istanza valida di Polygon. @g5 mostra inoltre che un'istanza di Polygon deve contenere solo un anello con quattro punti qualsiasi per essere accettata.

Gli esempi seguenti generano un'eccezione System.FormatException perché le Polygon istanze non sono accettate.

DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';

@g1 non è accettato perché l'istanza LineString per l'anello esterno non contiene punti sufficienti. @g2 non è accettato perché il punto iniziale dell'istanza dell'anello LineString esterno non è uguale al punto finale. Nell'esempio seguente è presente un anello esterno accettabile, ma l'anello interno non è accettabile. Anche questo lancia una System.FormatException.

DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';

Istanze valide

Gli anelli interni di un Polygon possono toccare se stessi e l'un l'altro a singoli punti tangenti, ma se gli anelli interni di un Polygon si intersecano, l'istanza non è valida.

Nell'esempio seguente vengono illustrate istanze valide Polygon .

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, -5 -10, -10 0))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

@g3 è valido perché i due anelli interni toccano a un singolo punto e non si incrociano tra loro. L'esempio seguente mostra Polygon le istanze non valide.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (20 0, 0 10, 0 -20, 20 0))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (5 0, 1 5, 1 -5, 5 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, 0 -10, -10 0))';
DECLARE @g4 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 1 5, 0 -10, -10 0))';
DECLARE @g5 geometry = 'POLYGON((10 0, 0 10, 0 -10, 10 0), (-20 -20, -20 20, 20 20, 20 -20, -20 -20) )';
DECLARE @g6 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid(), @g6.STIsValid();

@g1 non è valido perché l'anello interno tocca l'anello esterno in due posizioni. @g2 non è valido perché il secondo anello interno si trova all'interno del primo anello interno. @g3 non è valido perché i due anelli interni toccano più punti consecutivi. @g4 non è valido perché le parti interne dei due anelli si sovrappongono. @g5 non è valido perché l'anello esterno non è il primo anello. @g6 non è valido perché l'anello non ha almeno tre punti distinti.

Esempi

L'esempio seguente crea un'istanza semplice geometry``Polygon con un buco e SRID 10.

DECLARE @g geometry;
SET @g = geometry::STPolyFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10);

Un'istanza non valida può essere immessa e convertita in un'istanza valida geometry . Nell'esempio seguente di , Polygongli anelli interni ed esterni si sovrappongono e l'istanza non è valida.

DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((1 0, 0 1, 1 2, 2 1, 1 0), (2 0, 1 1, 2 2, 3 1, 2 0))');

Nell'esempio seguente l'istanza non valida viene resa valida con MakeValid().

SET @g = @g.MakeValid();
SELECT @g.ToString();

L'istanza geometry restituita dall'esempio precedente è un oggetto MultiPolygon.

MULTIPOLYGON (((2 0, 3 1, 2 2, 1.5 1.5, 2 1, 1.5 0.5, 2 0)), ((1 0, 1.5 0.5, 1 1, 1.5 1.5, 1 2, 0 1, 1 0)))

Ecco un altro esempio di conversione di un'istanza non valida in un'istanza geometry valida. Nell'esempio seguente l'istanza Polygon è stata creata usando tre punti esattamente uguali:

DECLARE @g geometry
SET @g = geometry::Parse('POLYGON((1 3, 1 3, 1 3, 1 3))');
SET @g = @g.MakeValid();
SELECT @g.ToString()

L'istanza "geometry" restituita in precedenza è un oggetto Point(1 3). Se Polygon è POLYGON((1 3, 1 5, 1 3, 1 3)), allora MakeValid() restituirebbe LINESTRING(1 3, 1 5).

Vedere anche

STArea (tipo di dati geometry)STExteriorRing (tipo di dati geometry)STNumInteriorRing (tipo di dati geometry)STInteriorRingN (tipo di dati geometry)STCentroid (tipo di dati geometry)STPointOnSurface (tipo di dati geometry)MultiPolygonDati spaziali (SQL Server)STIsValid (tipo di dati geography)STIsValid (tipo di dati geometry)