Freigeben über


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:

  1. Sie muss mindestens eine CircularString - oder LineString -Instanz enthalten.

  2. 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.

Diagramm von CompoundCurve-Beispielen.

Akzeptierte Instanzen

DieCompoundCurve -Instanz wird akzeptiert, wenn sie leer ist bzw. die folgenden Kriterien erfüllt.

  1. Alle in der CompoundCurve -Instanz enthaltenen Instanzen sind akzeptierte Kreisbogensegment-Instanzen. Weitere Informationen zu akzeptierten Kreisbogensegment-Instanzen finden Sie unter LineString und CircularString.

  2. 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.

  3. 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.FormatExceptionaus.

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.

  1. Die CompoundCurve -Instanz wird akzeptiert.

  2. 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 CompoundCurvein 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 CompoundCurvedeklariert 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 LineStringspeichern kann.

E. Instanziieren einer Geometrieinstanz mithilfe eines CompoundCurve mit mehreren CircularStrings

Im folgenden Beispiel wird gezeigt, wie mithilfe von zwei verschiedenen CircularString -Instanzen eine CompoundCurveinitialisiert 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 CompoundCurveverwendet 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 CompoundCurvegespeichert 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, CDAum 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.