Freigeben über


Vieleck

A Polygon ist eine zweidimensionale Oberfläche, die als Abfolge von Punkten gespeichert wird, die einen äußeren Begrenzungsring und null oder mehr Innenringe definieren.

Polygoninstanzen

Eine Polygon Instanz kann aus einem Ring gebildet werden, der mindestens drei unterschiedliche Punkte aufweist. Eine Polygon Instanz kann auch leer sein.

Die Äußeren und alle Innenringe eines Polygon definieren ihre Grenze. Der Raum innerhalb der Ringe definiert das Innere des Polygon.

Die folgende Abbildung zeigt Beispiele für Polygon Instanzen.

Beispiele für Geometrie-Polygoninstanzen

Wie in der Abbildung gezeigt:

  1. Abbildung 1 ist eine Polygon Instanz, deren Begrenzung durch einen Außenring definiert wird.

  2. Abbildung 2 ist eine Polygon Instanz, deren Begrenzung durch einen Außenring und zwei Innenringe definiert ist. Der Bereich innerhalb der Innenringe ist Teil des Äußeren der Polygon Instanz.

  3. Abbildung 3 ist eine gültige Polygon Instanz, da sich die Innenringe an einem einzelnen Tangenspunkt schneiden.

Akzeptierte Vorkommen

Akzeptierte Polygon Instanzen sind Instanzen, die in einer geometry oder geography einer Variablen gespeichert werden können, ohne eine Ausnahme zu auslösen. Es folgen akzeptierte Polygon Instanzen:

  • Eine leere Polygon Instanz

  • Eine Polygon Instanz mit einem akzeptablen Außenring und null oder mehr akzeptablen Innenringen

Die folgenden Kriterien sind erforderlich, damit ein Ring akzeptabel ist.

  • Die LineString Instanz muss akzeptiert werden.

  • Die LineString Instanz muss mindestens vier Punkte aufweisen.

  • Die Anfangs- und Endpunkte der LineString Instanz müssen identisch sein.

Das folgende Beispiel zeigt akzeptierte Polygon Instanzen.

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

Als @g4 und @g5 eine anerkannte Polygon-Instanz anzeigen, ist diese möglicherweise keine gültige Polygon-Instanz. @g5 zeigt auch, dass eine Polygoninstanz nur einen Ring mit allen vier Punkten enthalten muss, die akzeptiert werden müssen.

In den folgenden Beispielen wird ein 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 Außenring nicht genügend Punkte enthält. @g2 wird nicht akzeptiert, da der Ausgangspunkt der Außenringinstanz LineString nicht mit dem Endpunkt übereinstimmt. Im folgenden Beispiel ist ein akzeptabler Außenring vorhanden, der Innenring ist jedoch nicht akzeptabel. Dies löst auch ein System.FormatException aus.

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

Gültige Instanzen

Die Innenringe einer Polygon können sowohl sich selbst als auch einander an einem einzigen Tangentenpunkt berühren, aber wenn die Innenringe innerhalb eines Polygon überkreuzen, ist der Fall ungültig.

Das folgende Beispiel zeigt gültige Polygon Instanzen.

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 beiden Innenringe sich an einem einzigen Punkt berühren und keinen Schnittpunkt haben. Das folgende Beispiel zeigt Polygon Instanzen, die ungültig sind.

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 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 innerhalb des ersten inneren Rings liegt. @g3 ist ungültig, da sich die beiden inneren Ringe an mehreren aufeinander folgenden Punkten berühren. @g4 ist ungültig, da sich die Innenräume der beiden inneren Ringe überlappen. @g5 ist ungültig, da der Außenring nicht der erste Ring ist. @g6 ist ungültig, da der Ring nicht mindestens drei unterschiedliche Punkte hat.

Beispiele

Im folgenden Beispiel wird eine einfache geometry``Polygon Instanz mit einem Loch und 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ültige Instanz kann eingegeben und in eine gültige geometry Instanz umgewandelt werden. Im folgenden Beispiel eines Polygon überlappen sich die Innen- und Außenringe, und die Instanz ist ungültig.

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() gültig gemacht.

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

Die geometry instanz, die aus dem obigen Beispiel zurückgegeben wird, 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)))

Nachfolgend sehen Sie ein weiteres Beispiel für die Konvertierung einer ungültigen Instanz in eine gültige Geometrieinstanz. Im folgenden Beispiel wurde die Polygon Instanz mit drei Punkten erstellt, die identisch sind:

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

Die oben zurückgegebene Geometrieinstanz ist eine Point(1 3). Wenn Polygon gegeben ist, dann würde MakeValid()LINESTRING(1 3, 1 5) zurückgeben.

Siehe auch

STArea (Geometry Data Type)STExteriorRing (Geometry Data Type)STNumInteriorRing (Geometry Data Type)STInteriorRingN (Geometry Data Type)STCentroid (Geometry Data Type)STPointOnSurface (Geometry Data Type)MultiPolygonSpatial Data (SQL Server)STIsValid (Geography Data Type)STIsValid (Geometry Data Type)