CompoundCurve
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank in Microsoft Fabric SQL in Microsoft Fabric
Ein CompoundCurve ist eine Auflistung von null oder mehr fortlaufenden CircularString- oder LineString-Instanzen von Geometrie- oder Geografietypen.
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. Z(Elevation) und M(Measure)-Werte für den Punkt müssen ebenfalls identisch sein. 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 Geometrieinstanz mit einem leeren CompooundCurve
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 Geometrieinstanz mithilfe eines CompoundCurve in derselben Anweisung
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 geografischen Instanz mit einem 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 Geometrieinstanz mithilfe eines 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 Ausgabe12.5663706143592
, die dem 4 Pi 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. Verwenden eines CompoundCurve zum Speichern eines Halbkreiss
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 einem 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. Warum CircularString-Instanzen explizit deklariert werden müssen
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 Umkreis für Circle Two beträgt ca. 4Pi, also der tatsächliche Wert für den Umkreis. Der Umkreis für Circle One ist jedoch sehr ungenau. Circle One-Instanz CompoundCurve
speichert ein Kreisbogensegment (ABC
) und zwei Liniensegmente (CD
, DA
). Die CompoundCurve
Instanz muss zwei Kreisbogensegmente (ABC
, ) speichern, CDA
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.