Polygon
Ein Polygon ist eine zweidimensionale Fläche, die als Sequenz von Punkten gespeichert wird, die einen äußeren Begrenzungsring und null oder mehrere innere Ringe definieren.
Polygoninstanzen
Eine Polygon-Instanz kann aus einem Ring gebildet werden, der wenigstens drei unterschiedliche Punkte besitzt. Eine Polygon-Instanz kann auch leer sein.
Der äußere und eventuelle innere Ring einer Polygon-Instanz definieren die Begrenzung. Der Raum innerhalb der Ringe definiert das Innere des Polygons.
Die nachfolgenden Abbildungen sind Beispiele für Polygon-Instanzen.
Folgendes wird dargestellt:
Abbildung 1 zeigt eine Polygon-Instanz, deren Begrenzung von einem äußeren Ring definiert wird.
Abbildung 2 zeigt eine Polygon-Instanz, deren Begrenzung von einem äußeren Ring und zwei inneren Ringen definiert wird. Der Bereich zwischen den inneren Ringen ist Teil des äußeren Rings der Polygon-Instanz.
Abbildung 3 ist eine gültige Polygon-Instanz, da sich seine inneren Ringe an einem einzelnen Tangentialpunkt schneiden.
Akzeptierte Instanzen
Akzeptierte Polygon-Instanzen sind Instanzen, die in einer geometry- oder geography-Variablen gespeichert werden können, ohne eine Ausnahme auszulösen. Nachfolgend sind akzeptierte Polygon-Instanzen für den geometry-Typ aufgeführt:
Eine leere Polygon-Instanz
Eine Polygon-Instanz, die über einen zulässigen äußeren Ring sowie über null oder mehr zulässige innere Ringe verfügt.
Die folgenden Kriterien müssen erfüllt werden, damit ein Ring zulässig ist.
Die LineString-Instanz muss akzeptiert sein.
Die LineString-Instanz muss mindestens vier Punkte aufweisen, die drei unterschiedliche Punkte beinhalten.
Der Ausgangs- und der Endpunkt der LineString-Instanz müssen die gleichen X- und Y-Werte aufweisen.
Hinweis Z- und M-Werte werden ignoriert.
Eine Polygoninstanz eines geography-Typs wird nur akzeptiert, wenn die Instanz gültig ist. Weitere Informationen finden Sie unter Valid Geography Polygon Instances.
Im folgenden Beispiel werden akzeptierte Polygon-Instanzen von geometry-Typen veranschaulicht.
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))';
Wie @g4 zeigt, kann eine akzeptierte Polygon-Instanz keine gültige Polygon-Instanz sein. In den folgenden Beispielen wird eine Ausnahme vom Typ System.FormatException ausgelöst, da die Polygon-Instanzen nicht akzeptiert werden.
DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';
@g1 wird nicht akzeptiert, da die LineString-Instanz für den äußeren Ring nicht genügend Punkte enthält. @g2 wird nicht akzeptiert, da der Startpunkt der LineString-Instanz des äußeren Rings nicht mit dem Endpunkt übereinstimmt. Das folgende Beispiel beinhaltet einen zulässigen äußeren Ring, der innere Ring ist jedoch nicht zulässig. Dadurch wird auch eine Ausnahme vom Typ System.FormatException ausgelöst.
DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';
Gültige Instanzen
Die Gültigkeit einer Polygoninstanz ist abhängig vom zugehörigen Variablentyp.
geometry-Datentyp
Damit eine Polygon-Instanz eines geometry-Typs gültig ist, müssen folgende Kriterien erfüllt sein:
Der erste Ring ist der äußere Ring.
Alle inneren Ringe liegen innerhalb des äußeren Rings.
Kein innerer Ring liegt innerhalb eines anderen inneren Rings.
Kein Ring überschneidet sich mit einem anderen Ring
Zwei Ringe dürfen nicht denselben Rand gemeinsam haben.
Das Innere eines inneren Rings darf das Innere eines anderen inneren Rings nicht überlappen.
Alle Ringe dürfen sich lediglich selbst oder einen anderen Ring an null oder einer endlichen Anzahl von Tangentialpunkten berühren.
Das Innere der Polygon-Instanz ist verbunden. Zwischen zwei beliebigen inneren Punkten der Instanz muss mindestens ein Pfad vorhanden sein, der sich vollständig innerhalb der Instanz befindet.
Im folgenden Beispiel werden gültige Polygon-Instanzen veranschaulicht.
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 ist gültig, da sich die beiden inneren Ringe an einem einzigen Punkt berühren und sich nicht überschneiden. Im folgenden Beispiel werden ungültige Polygon-Instanzen veranschaulicht.
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) )';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid();
@g1 ist nicht gültig, da der innere Ring den äußeren Ring an zwei Stellen berührt. @g2 ist nicht gültig, da sich der zweite innere Ring im Inneren des ersten inneren Rings befindet. @g3 ist nicht gültig, da sich die beiden inneren Ringe an mehreren aufeinanderfolgenden Punkten berühren. @g4 ist nicht gültig, da sich das Innere der beiden inneren Ringe überlappt. @g5 ist nicht gültig, da der erste Ring ein innerer Ring und der zweite Ring ein äußerer Ring ist.
geography-Datentyp
Damit eine Polygon-Instanz eines geography-Typs gültig ist, müssen folgende Kriterien erfüllt sein:
Die Instanz muss alle erforderlichen Regeln erfüllen, um eine akzeptierte Polygon-Instanz des geometry-Typs zu sein.
Das Innere der Instanz wird mithilfe einer Linke-Hand-Regel verbunden.
Die Instanz passt in eine Hemisphäre.
Kein Ring überschneidet sich selbst oder einen anderen Ring.
Alle Ringe dürfen sich lediglich selbst oder einen beliebigen anderen Ring an null oder einer endlichen Anzahl von Tangentialpunkten berühren.
Im folgenden Beispiel wird eine Ausnahme vom Typ Microsoft.SqlServer.Types.GLArgumentException ausgelöst, da die Polygon-Instanz eine Hemisphäre überschreitet.
DECLARE @g geography = 'POLYGON((-122.358 47.653, 122.348 47.649, 122.348 47.658, 122.358 47.658, -122.358 47.653))';
Im folgenden Beispiel wird eine gültige Polygon-Instanz für den geography-Typ veranschaulicht.
DECLARE @g geography = 'POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';
Beispiele
Im folgenden Beispiel wird eine einfache Polygon-Instanz des geometry-Typs mit einem Loch und dem SRID 0 erstellt.
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);
Eine Instanz, die nicht gültig ist, kann eingegeben und in eine gültige geometry-Instanz konvertiert werden. Im folgenden Beispiel für ein Polygon überlappen die inneren Ringe und der äußere Ring, weshalb die Instanz ungültig ist.
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))');
Im folgenden Beispiel wird die ungültige Instanz mit MakeValid() in eine gültige konvertiert.
SET @g = @g.MakeValid();
SELECT @g.ToString();
Die vom vorherigen erwähnten Beispiel zurückgegebene geometry-Instanz ist ein 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)))
Siehe auch