Freigeben über


CompoundCurve

Eine CompoundCurve ist eine Auflistung von 0 (null) oder mehr fortlaufenden CircularString-Instanzen oder LineString-Instanzen von geometry- oder geography-Typen.

Wichtiger HinweisWichtig

Laden Sie für eine ausführliche Beschreibung und Beispiele der neuen räumlichen Funktionen in dieser Version (z. B. der CompoundCurve-Untertyp) das Whitepaper Neue räumliche Funktionen in SQL Server 2012 herunter.

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-Instanz oder LineString-Instanz enthalten.

  2. Die Sequenz von CircularString-Instanzen oder LineString-Instanzen muss fortlaufend sein.

Wenn eine CompoundCurve eine Sequenz von mehrerem 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 müssen über keinen 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 über keinen Z-Wert verfügen, oder sie müssen denselben Z-Wert aufweisen.

CompoundCurve-Instanzen

In der folgenden Abbildung sind gültige CompoundCurve-Typen dargestellt.

f278742e-b861-4555-8b51-3d972b7602bf

Akzeptierte Instanzen

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

  1. Alle von 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.

    HinweisHinweis

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

  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 CompoundCurve-Instanzen veranschaulicht, die nicht gültig sind.

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-Instanzen und gültigen LineString-Instanzen finden Sie unter CircularString und 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 von einer CompoundCurve-Instanz eine oder mehrere Instanzen von LineString gespeichert werden können.

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 folgende Ausgabe: 12.566370… Dies ist die Entsprechung von 4∏. 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

Es wird folgende Ausgabe erhalten:

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 CompoundCurve explizit eine CircularString-Instanz deklarieren.

Siehe auch

Verweis

STIsValid (geometry-Datentyp)

STLength (geometry-Datentyp)

STStartPoint (geometry-Datentyp)

STEndpoint (geometry-Datentyp)

Konzepte

LineString

CircularString

Übersicht über räumliche Datentypen

Point