CurvePolygon
Ein CurvePolygon ist eine von einem äußeren Begrenzungsring und null oder mehr inneren Ringe definierte topologisch geschlossene Fläche.
Wichtig |
---|
Laden Sie für eine ausführliche Beschreibung und Beispiele der neuen räumlichen Funktionen in dieser Version (z. B. der CurvePolygon-Untertyp) das Whitepaper Neue räumliche Funktionen in SQL Server 2012 herunter. |
Die Attribute einer CurvePolygon -Instanz werden durch folgende Kriterien definiert:
Die Begrenzung der CurvePolygon-Instanz wird durch den äußeren Ring und alle inneren Ringe definiert.
Das Innere der CurvePolygon-Instanz ist die Fläche zwischen dem äußeren Ring und allen inneren Ringen.
Eine CurvePolygon-Instanz unterscheidet sich von einer Polygon-Instanz darin, dass eine CurvePolygon-Instanz die folgenden Kreisbogensegmente enthalten kann: CircularString und CompoundCurve.
CompoundCurve-Instanzen
In der unten stehenden Abbildung werden gültige CurvePolygon-Instanzen dargestellt:
Akzeptierte Instanzen
Damit eine CurvePolygon-Instanz akzeptiert wird, muss sie entweder leer sein oder ausschließlich akzeptierte Kreisbogenringe enthalten. Ein akzeptierter Kreisbogenring erfüllt die folgenden Anforderungen.
Er stellt eine akzeptierte LineString-, CircularString- oder CompoundCurve-Instanz dar. Weitere Informationen zu akzeptierten Instanzen finden Sie unter LineString, CircularString und CompoundCurve.
Er enthält mindestens vier Punkte.
Die X- und Y-Koordinaten für den Ausgangspunkt und den Endpunkt sind identisch.
Hinweis Z- und M-Werte werden ignoriert.
Im folgenden Beispiel werden akzeptierte CurvePolygon-Instanzen veranschaulicht.
DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0, 0 0))';
DECLARE @g3 geometry = 'CURVEPOLYGON((0 0 1, 0 0 2, 0 0 3, 0 0 3))'
DECLARE @g4 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';
DECLARE @g5 geography = 'CURVEPOLYGON((-122.3 47, 122.3 -47, 125.7 -49, 121 -38, -122.3 47))';
@g3 wird akzeptiert, obwohl sich die Z-Werte des Ausgangspunkts und des Endpunkts voneinander unterscheiden, da Z-Werte ignoriert werden. @g5 wird akzeptiert, obwohl die geography-Typinstanz ungültig ist.
In den folgenden Beispielen wird System.FormatException ausgelöst.
DECLARE @g1 geometry = 'CURVEPOLYGON((0 5, 0 0, 0 0, 0 0))';
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0))';
@g1 wird nicht akzeptiert, da der Ausgangspunkt und der Endpunkt nicht denselben Y-Wert aufweisen. @g2 wird nicht akzeptiert, da der Ring nicht über eine ausreichende Anzahl von Punkten verfügt.
Gültige Instanzen
Eine CurvePolygon-Instanz ist gültig, wenn sowohl der äußere Ring als auch die inneren Ringe die folgenden Kriterien erfüllen:
Sie können sich nur an jeweils einem Tangentenpunkt berühren.
Sie können einander nicht schneiden.
Jeder Ring muss mindestens vier Punkte enthalten.
Jeder Ring muss ein akzeptabler Kurventyp sein.
Auch CurvePolygon-Instanzen müssen bestimmte Kriterien erfüllen, je nachdem, ob es sich dabei um einen geometry-Datentyp oder einen geography-Datentyp handelt.
geometry-Datentyp
Eine gültige geometry CurvePolygon-Instanz muss über die folgenden Attribute verfügen:
Alle inneren Ringe müssen im äußeren Ring enthalten sein.
Mehrere innere Ringe können vorhanden sein, ein innerer Ring darf jedoch keinen anderen inneren Ring enthalten.
Ringe dürfen weder sich selbst noch einen anderen Ring schneiden.
Ringe dürfen sich nur an einzelnen Tangentenpunkten berühren (wobei die Anzahl der Punkte, an denen Ringe einander berühren, endlich sein muss).
Der Innere des Polygons muss verbunden sein.
Im folgenden Beispiel werden gültige geometry CurvePolygon-Instanzen veranschaulicht.
DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';
DECLARE @g2 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';
SELECT @g1.STIsValid(), @g2.STIsValid();
Für CurvePolygon-Instanzen gelten dieselben Gültigkeitsregeln wie für Polygon-Instanzen. CurvePolygon-Instanzen können jedoch die neuen Kreisbogensegment-Typen akzeptieren. Weitere Beispiele für gültige oder nicht gültige Instanzen finden Sie unter Polygon.
geography-Datentyp
Eine gültige geography CurvePolygon-Instanz muss über die folgenden Attribute verfügen:
Der Innere des Polygons ist mit der linken Regel verbunden.
Ringe dürfen weder sich selbst noch einen anderen Ring schneiden.
Ringe dürfen sich nur an einzelnen Tangentenpunkten berühren (wobei die Anzahl der Punkte, an denen Ringe einander berühren, endlich sein muss).
Der Innere des Polygons muss verbunden sein.
Im folgenden Beispiel wird eine gültige CurvePolygon-geography-Instanz veranschaulicht.
DECLARE @g geography = 'CURVEPOLYGON((-122.3 47, 122.3 47, 125.7 49, 121 38, -122.3 47))';
SELECT @g.STIsValid();
Beispiele
A.Instanziieren einer geometry-Instanz mit einem leeren CurvePolygon
In diesem Beispiel wird veranschaulicht, wie eine leere CurvePolygon-Instanz erstellt wird:
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON EMPTY');
B.Deklarieren und Instanziieren einer geometry-Instanz mit einem CurvePolygon in derselben Anweisung
In diesem Codeausschnitt wird veranschaulicht, wie eine geometry-Instanz und ein CurvePolygon in derselben Anweisung deklariert und initialisiert werden:
DECLARE @g geometry = 'CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))'
C.Instanziieren einer geography-Instanz mit einem CurvePolygon
In diesem Codeausschnitt wird veranschaulicht, wie eine geography-Instanz mit einem CurvePolygon deklariert und initialisiert wird:
DECLARE @g geography = 'CURVEPOLYGON(CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';
D.Speichern eines CurvePolygon mit nur einem äußeren Begrenzungsring
In diesem Beispiel wird veranschaulicht, wie ein einfacher Kreis in einer CurvePolygon-Instanz gespeichert wird (wobei der Kreis lediglich durch einen äußeren Begrenzungsring definiert wird):
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');
SELECT @g.STArea() AS Area;
E.Speichern eines CurvePolygon mit inneren Ringen
In diesem Beispiel wird ein Rad in einer CurvePolygon-Instanz erstellt (das Rad wird durch einen äußeren Begrenzungsring und einen inneren Ring definiert):
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 4, 4 0, 8 4, 4 8, 0 4), CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');
SELECT @g.STArea() AS Area;
In diesem Beispiel werden eine gültige CurvePolygon-Instanz und eine ungültige Instanz für die Verwendung von inneren Ringen veranschaulicht:
DECLARE @g1 geometry, @g2 geometry;
SET @g1 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (-2 2, 2 2, 2 -2, -2 -2, -2 2))');
IF @g1.STIsValid() = 1
BEGIN
SELECT @g1.STArea();
END
SET @g2 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (0 5, 5 0, 0 -5, -5 0, 0 5))');
IF @g2.STIsValid() = 1
BEGIN
SELECT @g2.STArea();
END
SELECT @g1.STIsValid() AS G1, @g2.STIsValid() AS G2;
Sowohl @g1 als auch @g2 verwenden denselben äußeren Begrenzungsring (einen Kreis mit dem Radius 5), und für beide wird ein Quadrat als innerer Ring verwendet. Die Instanz @g1 ist jedoch gültig, während die Instanz @g2 ungültig ist. Der Grund für die Ungültigkeit von @g2 ist, dass der innere Ring die vom äußeren Ring begrenzte Fläche in vier separate Bereiche teilt. Dies wird in der folgenden Zeichnung verdeutlicht:
Siehe auch
Konzepte
geometry-Datentyp-Methodenverweis
Übersicht über räumliche Datentypen