Polygon

Gilt für:SQL ServerAzure SQL-DatenbankAzure 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.

Examples of geometry Polygon instances

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 ein System.FormatException Fehler ausgelöst, da die Polygoninstanzen 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. @g2wird nicht akzeptiert, da der Ausgangspunkt der Außenring-LineString-Instanz nicht mit dem Endpunkt übereinstimmt. Im folgenden Beispiel ist ein akzeptabler Außenring vorhanden, der Innenring ist jedoch 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 Innenringe eines Polygons können sich selbst und einander an einzelnen Tangentenpunkten berühren, aber wenn die Innenringe eines Polygonkreuzes nicht gültig sind.

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. 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 im Inneren des ersten inneren Ringes angezeigt wird. @g3 ist ungültig, da 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.

Ausrichtung von räumlichen Daten

Die Ringausrichtung eines Polygons ist kein wichtiger Faktor im Planarsystem. Die einfachen OGC-Features für die SQL-Spezifikation diktieren keine Ringbestellung, und SQL Server erzwingt keine Ringbestellung.

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;

Visualization of 'left-hand rule' counter-clockwise orientation

Im uhrzeigersinn

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

Visualization of 'left-hand rule' clockwise orientation

Wenn die Kompatibilitätsstufe 100 oder darunter in SQL Server liegt, weist der Geografiedatentyp 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 geografischen Datentyps, die die Eingabe von zwei geografischen Instanzen erfordern (z. B. STIntersection(), STUnion(), STDifference() und STSymDifference()), geben NULL zurück, wenn die Ergebnisse aus den Methoden nicht in eine einzelne Hemisphäre passen. 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-Instanz des Typs Polygon mit einem Abstand 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);

Beispiel B.

Eine ungültige Instanz kann eingegeben und in eine gültige geometry Instanz konvertiert 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))'
    );  

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)