Polygon
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance SQL Analysen-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric
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 folgende Abbildung zeigt Beispiele für Polygoninstanzen .
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 -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))';
Als @g4
und @g5
anzeigen einer akzeptierten Polygoninstanz ist möglicherweise keine gültige Polygoninstanz . @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.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 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;
Im Uhrzeigersinn
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;
Wenn die Kompatibilitätsebene in SQL Server 100 oder niedriger ist, weist der Datentyp "Geographie " 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 Geografie-Datentypmethoden , die die Eingabe von zwei geografischen Instanzen erfordern (z
STIntersection()
. B. , ,STUnion()
,STDifference()
undSTSymDifference()
), geben NULL zurück, wenn die Ergebnisse aus den Methoden nicht in eine einzelne Hemisphäre passen.STBuffer()
gibt auch NULL zurück, wenn die Ausgabe eine einzelne Hemisphäre überschreitet.
Die Ausrichtung kann mithilfe der erweiterten Methode ReorientObject (Geography Data Type) umgekehrt werden.
Beispiele
Beispiel A.
Im folgenden Beispiel wird eine einfache geometry Polygon
-Instanz des Typs 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 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 geometry
vom vorherigen Beispiel zurückgegebene 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 zuvor zurückgegebene Geometrieinstanz 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.