Freigeben über


CompoundCurve

Ein CompoundCurve ist eine Sammlung von null oder mehr aufeinanderfolgenden CircularString- oder LineString-Instanzen entweder von Geometrie- oder Geografie-Typen.

Von Bedeutung

Laden Sie das Whitepaper "Neue räumliche Features in SQL Server 2012" herunter für eine ausführliche Beschreibung und Beispiele der neuen räumlichen Funktionen in dieser Version, einschließlich des CompoundCurve Untertyps.

Eine leere CompoundCurve Instanz kann instanziiert werden, aber damit eine CompoundCurve gültige Instanz gültig ist, muss sie die folgenden Kriterien erfüllen:

  1. Es muss mindestens eine Instanz von CircularString oder LineString enthalten.

  2. Die Abfolge der CircularString- oder LineString-Instanzen muss fortlaufend sein.

Wenn eine CompoundCurve Sequenz von mehreren CircularString Und LineString Instanzen enthält, muss der Endendpunkt für jede Instanz außer der letzten Instanz der Startendpunkt für die nächste Instanz in der Sequenz sein. Dies bedeutet: Wenn der Endpunkt einer vorherigen Instanz in der Sequenz (4 3 7 2) lautet, muss der Ausgangspunkt für die nächste Instanz in der Sequenz sein (4 3 7 2). Beachten Sie, dass die Werte Z(Elevation) und M(measure) für den Punkt ebenfalls identisch sein müssen. Wenn es einen Unterschied bei den beiden Punkten gibt, wird ein System.FormatException geworfen. Punkte in einem CircularString Müssen keinen Z- oder M-Wert aufweisen. Wenn für den Endpunkt der vorherigen Instanz keine Z- oder M-Werte angegeben werden, kann der Ausgangspunkt der nächsten Instanz keine Z- oder M-Werte enthalten. Wenn der Endpunkt für die vorherige Sequenz (4 3) lautet, muss der Ausgangspunkt für die nächste Sequenz (4 3) sein; es kann nicht sein (4 3 7 2). Alle Punkte in einer CompoundCurve Instanz müssen entweder keinen Z-Wert oder denselben Z-Wert aufweisen.

CompoundCurve-Instanzen

Die folgende Abbildung zeigt gültige CompoundCurve Typen.

Akzeptierte Vorkommen

CompoundCurve wird akzeptiert, wenn es sich um eine leere Instanz handelt oder die folgenden Kriterien erfüllt.

  1. Alle Instanzen, die von der CompoundCurve enthaltenen Instanz akzeptiert werden, sind kreisförmige Bogensegmentinstanzen. Weitere Informationen zu akzeptierten Kreisbogensegmentinstanzen finden Sie unter LineString und CircularString.

  2. Alle Kreisbogensegmente in der CompoundCurve Instanz sind verbunden. Der erste Punkt für jeden nachfolgenden Kreisbogenabschnitt ist derselbe wie der letzte Punkt des vorhergehenden Kreisbogenabschnitts.

    Hinweis

    Dazu gehören die Z- und M-Koordinaten. Daher müssen alle vier Koordinaten X, Y, Z und M identisch sein.

  3. Keine der enthaltenen Instanzen sind leere Instanzen.

Das folgende Beispiel zeigt akzeptierte CompoundCurve Instanzen.

DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';

Das folgende Beispiel zeigt CompoundCurve Vorfälle, die nicht akzeptiert werden. Diese Instanzen lösen aus System.FormatException.

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 Zirkelbogensegmentinstanzen sind gültige Instanzen.

Das folgende Beispiel zeigt gültige CompoundCurve Instanzen.

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.

Das folgende Beispiel zeigt CompoundCurve Instanzen, die ungü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 LineString Instanzen finden Sie unter CircularString und LineString.

Beispiele

Ein. Instanziieren einer Geometrieinstanz mit einem leeren CompooundCurve

Das folgende Beispiel zeigt, 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

Das folgende Beispiel zeigt, wie eine Instanz mit einer geometryCompoundCurvein derselben Anweisung deklariert und initialisiert 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 Geografieinstanz mit einem CompoundCurve

Das folgende Beispiel zeigt, 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 Methoden verwendet, um eine CompoundCurve Instanz zum Speichern eines Quadrats zu verwenden.

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ängen für beide @g1 und @g2 sind identisch. Beachten Sie aus dem Beispiel, dass eine CompoundCurve Instanz eine oder mehrere Instanzen von LineString speichern kann.

E. Instanziieren einer Geometrieinstanz mithilfe eines CompoundCurve mit mehreren CircularStrings

Das folgende Beispiel zeigt, wie zwei verschiedene CircularString Instanzen verwendet werden, um eine CompoundCurve zu initialisieren.

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... das entspricht 4π (4 * pi). Die CompoundCurve Instanz im Beispiel speichert einen Kreis mit einem Radius von 2. Beide der vorherigen Codebeispiele mussten CompoundCurve nicht verwenden. Für das erste Beispiel wäre eine LineString Instanz einfacher gewesen, und eine CircularString Instanz wäre für das zweite Beispiel einfacher gewesen. Im nächsten Beispiel wird jedoch gezeigt, wo eine CompoundCurve bessere Alternative zur Verfügung steht.

F. Verwenden einer CompoundCurve zur Speicherung eines Halbkreises

Im folgenden Beispiel wird eine CompoundCurve Instanz verwendet, um einen Semikreis zu speichern.

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

Das folgende Beispiel zeigt, wie mehrere CircularString- und LineString-Instanzen mithilfe 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

Das folgende Beispiel zeigt, wie Sie eine CompoundCurve Instanz verwenden, um eine Sequenz von CircularString und LineString Instanzen mit Z- und M-Werten zu speichern.

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))');

Ich. Veranschaulichen, warum CircularString-Instanzen explizit deklariert werden müssen

Das folgende Beispiel zeigt, warum CircularString Instanzen explizit deklariert werden müssen. Der Programmierer versucht, einen Kreis in einer CompoundCurve Instanz 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

Die Ausgabe lautet wie folgt:

Circle One11.940039...
Circle Two12.566370...

Der Umkreis für Circle Two beträgt ca. 4π (4 * pi), was der tatsächliche Wert für den Umkreis ist. Der Umkreis für Circle One ist jedoch deutlich ungenau. Die Instanz von CompoundCurve Circle One speichert ein Kreisbogensegment (ABC) und zwei Liniensegmente (CD, DA). Die CompoundCurve Instanz muss zwei Kreisbogensegmente (ABC, CDA) speichern, um einen Kreis zu definieren. Eine LineString Instanz definiert den zweiten Satz von Punkten (4 2, 2 4, 0 2) in der Instanz von CompoundCurve Circle One. Sie müssen eine Instanz ausdrücklich innerhalb einer CircularStringCompoundCurve deklarieren.

Siehe auch

STIsValid (Geometriedatentyp)STLength (Geometriedatentyp)STStartPoint (Geometriedatentyp)STEndpoint (Geometriedatentyp)LineStringCircularStringÜberblick über räumliche DatentypenPunkt