CompoundCurve
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
Eine CompoundCurve ist eine Auflistung von 0 (null) oder mehr fortlaufenden CircularString - oder LineString -Instanzen von geometry- oder geography-Typen.
Eine leere CompoundCurve -Instanz kann instanziiert werden. Damit eine CompoundCurve gültig ist, muss sie jedoch die folgenden Kriterien erfüllen:
Sie muss mindestens eine CircularString - oder LineString -Instanz enthalten.
Die Sequenz von CircularString - oder LineString -Instanzen muss fortlaufend sein.
Wenn eine CompoundCurve eine Sequenz von mehreren CircularString - und LineString -Instanzen enthält, muss der abschließende Endpunkt für jede Instanz (mit Ausnahme der letzten Instanz) der beginnende Endpunkt für die nächste Instanz in der Sequenz sein. Wenn also der Endpunkt der vorhergehenden Instanz in der Sequenz (4 3 7 2) ist, muss der Anfangspunkt für die nächste Instanz in der Sequenz (4 3 7 2) sein. Beachten Sie, dass die Z-Werte (Höhe) und die M-Werte (Measure) für den Punkt ebenfalls gleich sein müssen. Wenn sich die beiden Punkte unterscheiden, wird ein System.FormatException
ausgelöst. Punkte in einer CircularString -Instanz müssen nicht über einen Z-Wert oder M-Wert verfügen. Wenn keine Z- oder M-Werte für den Endpunkt der vorherigen Instanz angegeben sind, kann der Anfangspunkt der nächsten Instanz keine Z- oder M-Werte einschließen. Wenn der Endpunkt für die vorherige Sequenz (4 3) ist, muss der Anfangspunkt für die nächste Sequenz (4 3) sein; (4 3 7 2) ist hingegen nicht möglich. Alle Punkte in einer CompoundCurve -Instanz dürfen entweder keinen Z-Wert haben oder müssen denselben Z-Wert aufweisen.
CompoundCurve-Instanzen
In der folgenden Abbildung sind gültige CompoundCurve -Typen dargestellt.
Akzeptierte Instanzen
DieCompoundCurve -Instanz wird akzeptiert, wenn sie leer ist bzw. die folgenden Kriterien erfüllt.
Alle in der CompoundCurve -Instanz enthaltenen Instanzen sind akzeptierte Kreisbogensegment-Instanzen. Weitere Informationen zu akzeptierten Kreisbogensegment-Instanzen finden Sie unter LineString und CircularString.
Alle Kreisbogensegmente in der CompoundCurve -Instanz sind verbunden. Der erste Punkt jedes nachfolgenden Kreisbogensegments entspricht dem letzten Punkt des jeweils vorgehenden Kreisbogensegments.
Hinweis
Dies schließt die Z- und M-Koordinaten ein. Daher müssen alle vier Koordinaten X, Y, Z und M identisch sein.
Bei keiner der enthaltenen Instanzen handelt es sich um leere Instanzen.
Im folgenden Beispiel werden akzeptierte CompoundCurve -Instanzen veranschaulicht.
DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';
Im folgenden Beispiel werden nicht akzeptierte CompoundCurve -Instanzen veranschaulicht. Diese Instanzen lösen eine System.FormatException
aus.
DECLARE @g1 geometry = 'COMPOUNDCURVE(CIRCULARSTRING EMPTY)';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (1 0, 2 0))';
Gültige Instanzen
Eine CompoundCurve -Instanz ist gültig, wenn sie die folgenden Kriterien erfüllt.
Die CompoundCurve -Instanz wird akzeptiert.
Alle in der CompoundCurve -Instanz enthaltenen Kreisbogensegment-Instanzen sind gültige Instanzen.
Im folgenden Beispiel werden gültige CompoundCurve -Instanzen veranschaulicht.
DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';
DECLARE @g3 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 1 1, 1 1), (1 1, 3 5, 5 4))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();
@g3
ist gültig, da die CircularString -Instanz gültig ist. Weitere Informationen zur Gültigkeit der CircularString -Instanz finden Sie unter CircularString.
Im folgenden Beispiel werden nicht gültige CompoundCurve -Instanzen veranschaulicht.
DECLARE @g1 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 1 1, 1 1), (1 1, 3 5, 5 4, 3 5))';
DECLARE @g2 geometry = 'COMPOUNDCURVE((1 1, 1 1))';
DECLARE @g3 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 2 3, 1 1))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();
@g1
ist ungültig, da die zweite Instanz keine gültige LineString-Instanz ist. @g2
ist ungültig, da die LineString -Instanz ungültig ist. @g3
ist ungültig, da die CircularString -Instanz ungültig ist. Weitere Informationen zu gültigen CircularString - und LineString -Instanzen finden Sie unter CircularString bzw. LineString.
Beispiele
A. Instanziieren einer geometry-Instanz mit einer leeren CompoundCurve
Im folgenden Beispiel wird veranschaulicht, wie eine leere CompoundCurve
-Instanz erstellt wird:
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE EMPTY');
B. Deklarieren und Instanziieren einer geometry-Instanz, die eine CompoundCurve in derselben Anweisung verwendet
Im folgenden Beispiel wird veranschaulicht, wie eine geometry
-Instanz mit einer CompoundCurve
in derselben Anweisung deklariert und instanziiert wird:
DECLARE @g geometry = 'COMPOUNDCURVE ((2 2, 0 0),CIRCULARSTRING (0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0))';
C. Instanziieren einer geography-Instanz mit einer CompoundCurve
Im folgenden Beispiel wird veranschaulicht, wie eine geography -Instanz mit einer CompoundCurve
deklariert und initialisiert wird:
DECLARE @g geography = 'COMPOUNDCURVE(CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';
D: Speichern eines Quadrats in einer CompoundCurve-Instanz
Im folgenden Beispiel werden zwei verschiedene Möglichkeiten gezeigt, wie mithilfe einer CompoundCurve
-Instanz ein Quadrat gespeichert werden kann.
DECLARE @g1 geometry, @g2 geometry;
SET @g1 = geometry::Parse('COMPOUNDCURVE((1 1, 1 3), (1 3, 3 3),(3 3, 3 1), (3 1, 1 1))');
SET @g2 = geometry::Parse('COMPOUNDCURVE((1 1, 1 3, 3 3, 3 1, 1 1))');
SELECT @g1.STLength(), @g2.STLength();
Die Länge von @g1
und die Länge von @g2
sind identisch. Anhand des Beispiels können Sie feststellen, dass eine CompoundCurve -Instanz eine oder mehrere Instanzen von LineString
speichern kann.
E. Instanziieren einer geometry-Instanz mithilfe einer CompoundCurve mit mehreren CircularStrings
Im folgenden Beispiel wird gezeigt, wie mithilfe von zwei verschiedenen CircularString
-Instanzen eine CompoundCurve
initialisiert werden kann.
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), CIRCULARSTRING(4 2, 2 4, 0 2))');
SELECT @g.STLength();
Dies erzeugt die Ausgabe 12.5663706143592
, was 4? entspricht. Von der CompoundCurve
-Instanz im Beispiel wird ein Kreis mit dem Radius 2 gespeichert. In den beiden vorherigen Codebeispielen musste keine CompoundCurve
verwendet werden. Für das erste Beispiel wäre eine LineString
-Instanz einfacher gewesen, während sich für das zweite Beispiel eher eine CircularString
-Instanz empfiehlt. Im nächsten Beispiel wird jedoch verdeutlich, in welchen Fällen eine CompoundCurve
eine bessere Alternative darstellt.
F. Speichern eines Halbkreises mithilfe einer CompoundCurve
Im folgenden Beispiel wird ein Halbkreis mithilfe einer CompoundCurve
-Instanz gespeichert.
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 0 2))');
SELECT @g.STLength();
G. Speichern mehrerer CircularString- und LineString-Instanzen in einer CompoundCurve
Im folgenden Beispiel wird gezeigt, wie mehrere CircularString
-Instanzen und LineString
-Instanzen mit einer CompoundCurve
gespeichert werden können.
DECLARE @g geometry
SET @g = geometry::Parse('COMPOUNDCURVE((3 5, 3 3), CIRCULARSTRING(3 3, 5 1, 7 3), (7 3, 7 5), CIRCULARSTRING(7 5, 5 7, 3 5))');
SELECT @g.STLength();
H. Speichern von Instanzen mit Z- und M-Werten
Im folgenden Beispiel wird veranschaulicht, wie mithilfe einer CompoundCurve
-Instanz eine Sequenz von CircularString
-Instanzen und LineString
-Instanzen mit Z- und M-Werten gespeichert wird.
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(7 5 4 2, 5 7 4 2, 3 5 4 2), (3 5 4 2, 8 7 4 2))');
I. Gründe für die explizite Deklaration von CircularString-Instanzen
Im folgenden Beispiel wird erläutert, weshalb CircularString
-Instanzen explizit deklariert werden müssen. Der Programmierer versucht, in einer CompoundCurve
-Instanz einen Kreis zu speichern.
DECLARE @g1 geometry;
DECLARE @g2 geometry;
SET @g1 = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 2 4, 0 2))');
SELECT 'Circle One', @g1.STLength() AS Perimeter; -- gives an inaccurate amount
SET @g2 = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), CIRCULARSTRING(4 2, 2 4, 0 2))');
SELECT 'Circle Two', @g2.STLength() AS Perimeter; -- now we get an accurate amount
Hier sehen Sie das Ergebnis.
Circle One11.940039...
Circle Two12.566370...
Der Umfang für Circle Two beträgt annähernd 4?. Dies ist der tatsächliche Wert für den Umfang. Der Umkreis für Circle One ist jedoch sehr ungenau. Durch die CompoundCurve
-Instanz von Circle One werden ein Kreisbogensegment (ABC) und zwei Liniensegmente (CD, DA) gespeichert. Von der CompoundCurve
-Instanz müssen zwei Kreisbogensegmente (ABC, CDA) gespeichert werden, um einen Kreis zu definieren. Eine LineString
-Instanz definiert die zweite Punktmenge (4 2, 2 4, 0 2) in der CompoundCurve
-Instanz von Circle One. Sie müssen in einer CircularString
explizit eine CompoundCurve
-Instanz deklarieren.
Weitere Informationen
STIsValid (geometry-Datentyp)
STLength (geometry-Datentyp)
STStartPoint (geometry-Datentyp)
STEndpoint (geometry-Datentyp)
LineString
CircularString
Übersicht über räumliche Datentypen
Point