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.

Polygon-Instanzen

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 nachfolgende Abbildung enthält Beispiele für Polygon-Instanzen.

Beispiele von Geometrie-Polygon-Instanzen

Folgendes wird dargestellt:

  1. Abbildung 1 zeigt eine Polygon-Instanz, deren Begrenzung von einem äußeren Ring definiert wird.

  2. 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.

  3. Abbildung 3 ist eine gültige Polygon-Instanz, da sich die inneren Ringe an einem einzelnen Tangentenpunkt schneiden.

Akzeptierte Instanzen

Akzeptierte Polygon-Instanzen sind Instanzen, die in einer geometry- oder geography-Variable gespeichert werden können, ohne dass eine Ausnahme ausgelöst wird. Die folgenden Polygon-Instanzen werden für den geometry-Typ akzeptiert:

  • Eine leere Polygon-Instanz

  • Eine Polygon-Instanz, die einen zulässigen äußeren Ring und 0 oder mehr zulässige innere Ringe hat

Damit ein Ring zulässig ist, müssen die folgenden Kriterien erfüllt werden.

  • Die LineString-Instanz muss akzeptiert werden.

  • Die LineString-Instanz muss mindestens vier Punkte haben, die drei unterschiedliche Punkte einschließen.

  • Die Ausgangs- und Endpunkte der LineString-Instanz müssen dieselben X- und Y-Werte haben.

    HinweisHinweis

    Z- und M-Werte werden ignoriert.

Eine Polygon-Instanz eines geography-Typs wird nur akzeptiert, wenn die Instanz gültig ist. Weitere Informationen zu gültigen Polygon-Instanzen für den geography-Typ finden Sie unter BkmkValidGeographyPolygons.

Im folgenden Beispiel werden akzeptierte Polygon-Instanzen gezeigt.

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, ist es möglich, dass eine akzeptierte Polygon-Instanz keine gültige Polygon-Instanz ist. In den folgenden Beispielen wird eine 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 Ausgangspunkt der LineString-Instanz des äußeren Rings nicht mit dem Endpunkt identisch ist. Im folgenden Beispiel ist der äußere Ring zulässig, der innere Ring jedoch nicht. Hierdurch wird ebenfalls eine 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 inneren Ringe eines Polygons können sich selbst und einander an einzelnen Tangentenpunkten berühren; überkreuzen sich die inneren Ringe eines Polygons jedoch, ist die Instanz ungültig.

Im folgenden Beispiel werden gültige Polygon-Instanzen gezeigt.

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 die zwei inneren Ringe sich an einem einzelnen Punkt berühren und einander nicht schneiden. Das folgende Beispiel zeigt ungültige Polygon-Instanzen.

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))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid();

@g1 ist ungültig, da der innere Ring den äußeren Ring an zwei Stellen berührt. @g2 ist ungültig, da der zweite innere Ring sich im Inneren des ersten inneren Rings befindet. @g3 ist ungültig, da sich die zwei inneren Ringe an mehreren aufeinander folgenden Punkten berühren. @g4 ist ungültig, da sich die Innenbereiche der zwei inneren Ringe überschneiden.

geometry-Datentyp

Damit eine Polygon-Instanz eines geometry-Typs gültig ist, muss sie die folgenden Kriterien erfüllen:

  1. Der erste Ring ist der äußere Ring.

  2. Alle inneren Ringe befinden sich innerhalb des äußeren Rings.

  3. In einem inneren Ring befindet sich kein weiterer innerer Ring.

  4. Kein Ring schneidet sich selbst oder einen anderen Ring.

  5. Keine zwei Ringe haben denselben Rand.

  6. Der Innenbereich eines inneren Rings darf nicht mit dem Innenbereich eines anderen inneren Rings überlappen.

  7. Alle Ringe dürfen nur sich selbst oder einen anderen Ring bei 0 oder bei einer endlichen Anzahl von Tangentenpunkten berühren.

  8. Der Innenbereich der Polygon-Instanz ist verbunden. Es muss mindestens einen Pfad zwischen zwei beliebigen inneren Punkten der Instanz geben, der sich vollständig innerhalb der Instanz befindet.

Im folgenden Beispiel werden gültige Polygon-Instanzen gezeigt.

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 die zwei inneren Ringe sich an einem einzelnen Punkt berühren und einander nicht schneiden. Das folgende Beispiel zeigt ungültige Polygon-Instanzen.

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 ungültig, da der innere Ring den äußeren Ring an zwei Stellen berührt. @g2 ist ungültig, da der zweite innere Ring sich im Inneren des ersten inneren Rings befindet. @g3 ist ungültig, da sich die zwei inneren Ringe an mehreren aufeinander folgenden Punkten berühren. @g4 ist ungültig, da sich die Innenbereiche der zwei inneren Ringe überschneiden. @g5 ist ungü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, muss sie die folgenden Kriterien erfüllen:

  1. Die Instanz muss alle Anforderungen erfüllen, die erforderlich sind, um eine akzeptierte Polygon-Instanz des geometry-Typs zu sein.

  2. Der Innenbereich der Instanz ist mit einer Linke-Hand-Regel verbunden.

  3. Die Instanz passt in eine Hemisphäre.

  4. Kein Ring schneidet sich selbst oder einen anderen Ring.

  5. Alle Ringe dürfen nur sich selbst oder einen anderen Ring bei 0 oder bei einer endlichen Anzahl von Tangentenpunkten berühren.

Im folgenden Beispiel wird eine Microsoft.SqlServer.Types.GLArgumentException ausgelöst, da die Polygon-Instanz größer als eine Hemisphäre ist.

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 gezeigt.

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 10 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 ungültigeInstanz 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 oben 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)))