Freigeben über


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:

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

CompoundCurve-Beispiele

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 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 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 geography-Instanz mit einer 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 geometry-Instanz mithilfe einer 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 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 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. 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 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. 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