Polygon

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

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 Polygon-Geometrieinstanzen

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 seine inneren Ringe an einem einzelnen Tangentialpunkt schneiden.

Akzeptierte Instanzen

Akzeptierte Polygon -Instanzen sind Instanzen, die in einer geometry -Variablen oder einer geography -Variablen gespeichert werden können, ohne dass eine Ausnahme ausgelöst wird. Bei den folgenden Polygon -Instanzen handelt es sich um akzeptierte Instanzen:

  • Eine leere Polygon -Instanz
  • Eine Polygon-Instanz, die einen akzeptablen äußeren Ring (LineString) und null (0) oder mehr akzeptable innere Ringe (LineStrings) aufweist.

Die folgenden Kriterien müssen erfüllt sein, damit ein Ring (LineString) akzeptabel ist.

  • Die LineString -Instanz muss akzeptiert sein.
  • Die LineString -Instanz muss über mindestens vier Punkte verfügen.
  • Der Anfangspunkt und der Endpunkt der LineString -Instanz müssen identisch sein.

Im folgenden Beispiel werden akzeptierte Polygon -Instanzen 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))';  
DECLARE @g5 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';  

Wie @g4 und @g5 zeigen, ist es möglich, dass eine akzeptierte Polygon -Instanz keine gültige Polygon -Instanz ist. @g5 zeigt auch, dass eine Polygon-Instanz nur einen Ring mit vier beliebigen Punkten enthalten muss, um akzeptiert zu werden.

In den folgenden Beispielen wird eine System.FormatException ausgelöst, weil 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, weil die LineString-Instanz für den äußeren Ring nicht genug Punkte enthält. @g2 wird nicht akzeptiert, weil der Ausgangspunkt der LineString-Instanz des äußeren Rings nicht gleich dem Endpunkt ist. Im folgenden Beispiel ist ein akzeptabler äußerer Ring enthalten, der innere Ring hingegen ist nicht akzeptabel. Dadurch wird auch eine System.FormatExceptionausgelö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 Tangentialpunkten berühren; überkreuzen sich die inneren Ringe eines Polygons jedoch, ist die Instanz ungültig.

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 die zwei inneren Ringe einen einzigen Punkt berühren und einander nicht schneiden. Im folgenden Beispiel werden Polygon-Instanzen veranschaulicht, die nicht gü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 im Inneren des ersten inneren Rings liegt. @g3 ist ungültig, da sich die zwei inneren Ringe an mehreren aufeinander folgenden Punkten berühren. @g4 ist ungültig, da sich das Innere der zwei inneren Ringe überlappt. @g5 ist ungültig, da der äußere Ring nicht der erste Ring ist. @g6 ist ungültig, da der Ring nicht mindestens drei unterschiedliche Punkte aufweist.

Ausrichtung von räumlichen Daten

Im planaren System ist die Ringausrichtung eines Polygons kein wichtiger Faktor. Die OGC Simple Features for SQL-Spezifikation schreibt keine Ringreihenfolge vor, und SQL Server erzwingt keine Ringreihenfolge.

In einem ellipsenförmigen System hat ein Polygon ohne Ausrichtung keine Bedeutung bzw. ist mehrdeutig. Beschreibt beispielsweise ein Ring um den Äquator die nördliche oder die südliche Hemisphäre? Wenn wir den geography -Datentyp zum Speichern von räumlichen Daten verwenden, müssen wir die Ausrichtung des Rings angeben und die Position der Instanz genau beschreiben.

Das Innere des Polygons in einem ellipsoidischen System wird über die „Linksregel“ definiert: Wenn Sie sich vorstellen, dass Sie auf dem Ring eines geography-Polygons die Punkte in der Reihenfolge ablaufen, in der sie aufgeführt sind, wird der Bereich links als das Innere des Polygons und der Bereich rechts als das Äußere des Polygons behandelt.

Gegen den Uhrzeigersinn

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;

Visualisierung der „Linke-Hand-Regel“ gegen den Uhrzeigersinn

Im Uhrzeigersinn

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;

Visualisierung der „Linke-Hand-Regel“ im Uhrzeigersinn

Wenn der Kompatibilitätsgrad in SQL Server 100 oder niedriger ist, weist der Geografie-Datentyp die folgenden Einschränkungen auf:

  • Jede geography -Instanz muss in genau eine Hemisphäre passen. Es können keine räumlichen Objekte gespeichert werden, die größer als eine Hemisphäre sind.

  • Jede geography -Instanz aus einer OGC-Darstellung (Open Geospatial Consortium) des Typs „Well-Known Text (WKT)“ oder „Well-Known Binary (WKB), die ein Objekt ergibt, das größer als eine Hemisphäre ist, führt zu einer Ausnahme des Typs ArgumentException“.

  • Die Methoden des geography-Datentyps, die Eingaben von zwei geography-Instanzen (wie STIntersection(), STUnion(), STDifference(), and STSymDifference()) geben NULL zurück, wenn das Ergebnis der Methode nicht in eine Hemisphäre passt. STBuffer() gibt ebenfalls NULL zurück, wenn die Ausgabe eine Hemisphäre überschreitet.

Die Ausrichtung kann mithilfe der erweiterten Methode ReorientObject umgekehrt werden.

Beispiele

Beispiel A.

Im folgenden Beispiel wird eine einfache geometry-Polygon-Instanz mit einem Zwischenraum und der 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);

Beispiel B.

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

Beispiel C.

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

Beispiel D:

Ein weiteres Beispiel zum Konvertieren einer ungültigen Instanz in eine gültige geometry-Instanz. 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 geometry-Instanz ist ein Point(1 3). Wenn das angegebene Polygon gleich POLYGON((1 3, 1 5, 1 3, 1 3)) ist, gibt MakeValid()LINESTRING(1 3, 1 5)zurück.

Weitere Informationen

STArea (geometry-Datentyp)
STExteriorRing (geometry-Datentyp)
STNumInteriorRing (geometry-Datentyp)
STInteriorRingN (geometry-Datentyp)
STCentroid (geometry-Datentyp)
STPointOnSurface (geometry-Datentyp)
MultiPolygon
Räumliche Daten (SQL Server)
STIsValid (geography-Datentyp)
STIsValid (geometry-Datentyp)