Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Magazyn w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric
CompoundCurve to kolekcja zera lub więcej ciągłych wystąpień typu CircularString lub LineString, dla typów geometrii lub geografii.
Można utworzyć wystąpienie pustego CompoundCurve, ale aby CompoundCurve było prawidłowe, musi spełniać następujące warunki:
Musi zawierać co najmniej jedno wystąpienie CircularString lub LineString.
Sekwencja wystąpień CircularString lub LineString musi być ciągła.
Jeśli CompoundCurve zawiera sekwencję wielu CircularString i LineString, końcowy punkt dla każdego wystąpienia z wyjątkiem ostatniego musi być punktem początkowym dla następnego wystąpienia w sekwencji. Oznacza to, że jeśli punkt końcowy poprzedniego wystąpienia w sekwencji to (4 3 7 2), punkt początkowy dla następnego wystąpienia w sekwencji musi wynosić (4 3 7 2). Wartości Z(elevation) i M(measure) dla punktu również muszą być takie same. Jeśli istnieje różnica w dwóch punktach, zostanie zgłoszony System.FormatException. Punkty w CircularString nie muszą mieć wartości Z ani M. Jeśli dla punktu końcowego poprzedniego wystąpienia nie podano żadnych wartości Z lub M, punkt początkowy następnego wystąpienia nie może zawierać wartości Z lub M. Jeśli punkt końcowy dla poprzedniej sekwencji to (4 3), punkt początkowy następnej sekwencji musi wynosić (4 3); nie może być (4 3 7 2). Wszystkie punkty w wystąpieniu CompoundCurve muszą mieć albo brak wartości Z, albo tę samą wartość Z.
Instancje CompoundCurve
Poniższa ilustracja przedstawia poprawne typy CompoundCurve.
Zaakceptowane wystąpienia
CompoundCurve instancja jest akceptowana, jeśli jest pustą instancją lub spełnia następujące kryteria.
Wszystkie wystąpienia zawarte w wystąpieniu CompoundCurve są akceptowane jako wystąpienia segmentu łuku kołowego. Aby uzyskać więcej informacji na temat akceptowanych wystąpień segmentu łuku okręgowego, zobacz LineString i CircularString.
Wszystkie segmenty łuku cyklicznego w wystąpieniu CompoundCurve są połączone. Pierwszy punkt dla każdego następującego segmentu łuku cyklicznego jest taki sam jak ostatni punkt w poprzednim segmencie łuku cyklicznego.
Note
Obejmuje to współrzędne Z i M. Tak więc wszystkie cztery współrzędne X, Y, Z i M muszą być takie same.
Żadne z zawartych wystąpień nie są pustymi wystąpieniami.
W poniższym przykładzie przedstawiono zaakceptowane wystąpienia CompoundCurve.
DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';
Na poniższym przykładzie pokazano przypadki CompoundCurve, które nie są akceptowane. Te wystąpienia rzucają System.FormatException.
DECLARE @g1 geometry = 'COMPOUNDCURVE(CIRCULARSTRING EMPTY)';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (1 0, 2 0))';
Prawidłowe wystąpienia
Wystąpienie CompoundCurve jest prawidłowe, jeśli spełnia następujące kryteria.
Instancja CompoundCurve została zaakceptowana.
Wszystkie wystąpienia segmentu łuku okrągłego zawarte w wystąpieniu CompoundCurve są prawidłowymi wystąpieniami.
W poniższym przykładzie przedstawiono prawidłowe wystąpienia CompoundCurve.
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 jest prawidłowa, ponieważ instancja CircularString jest prawidłowa. Aby uzyskać więcej informacji na temat ważności wystąpienia CircularString, zobacz CircularString.
W poniższym przykładzie przedstawiono przypadki CompoundCurve, które są nieprawidłowe.
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 jest nieprawidłowa, ponieważ drugie wystąpienie nie jest prawidłowym wystąpieniem LineString.
@g2 jest nieprawidłowa, ponieważ wystąpienie LineString jest nieprawidłowe.
@g3 nie jest prawidłowa, ponieważ instancja CircularString jest nieprawidłowa. Aby uzyskać więcej informacji na temat prawidłowych wystąpień CircularString i LineString, zobacz CircularString i LineString.
Examples
A. Utwórz instancję geometrii z pustą krzywą złożoną (CompoundCurve)
W poniższym przykładzie pokazano, jak utworzyć puste wystąpienie CompoundCurve:
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE EMPTY');
B. Deklarowanie i tworzenie wystąpienia geometrii przy użyciu klasy CompoundCurve w tej samej instrukcji
W poniższym przykładzie pokazano, jak zadeklarować i zainicjować wystąpienie geometry za pomocą CompoundCurve w tej samej instrukcji:
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. Utwórz instancję geograficzną z CompoundCurve
W poniższym przykładzie pokazano, jak zadeklarować i zainicjować instancję obszaru geograficznego przy użyciu CompoundCurve:
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. Przechowaj kwadrat w instancji CompoundCurve
W poniższym przykładzie użyto dwóch różnych sposobów użycia wystąpienia CompoundCurve do przechowywania kwadratu.
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();
Długości @g1 i @g2 są takie same. Zwróć uwagę na przykład, że wystąpienie CompoundCurve może przechowywać jedno lub więcej wystąpień LineString.
E. Utworzenie instancji geometrii przy użyciu CompoundCurve z wieloma CircularStrings
W poniższym przykładzie pokazano, jak za pomocą dwóch różnych wystąpień CircularString zainicjować CompoundCurve.
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();
Spowoduje to wygenerowanie wyniku 12.5663706143592, który jest równoważny 4pi. Wystąpienie CompoundCurve w przykładzie przechowuje okrąg z promieniem 2. Oba poprzednie przykłady kodu nie musiały używać CompoundCurve. W pierwszym przykładzie wystąpienie LineString byłoby prostsze, a wystąpienie CircularString byłoby prostsze w drugim przykładzie. Jednak w następnym przykładzie pokazano, gdzie CompoundCurve zapewnia lepszą alternatywę.
F. Użyj CompoundCurve do przechowywania półokręgu
W poniższym przykładzie użyto wystąpienia CompoundCurve do przechowywania półokręgu.
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 0 2))');
SELECT @g.STLength();
G. Przechowuj wiele wystąpień CircularString i LineString w obiekcie CompoundCurve
W poniższym przykładzie pokazano, jak można przechowywać wiele wystąpień CircularString i LineString przy użyciu CompoundCurve.
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. Przechowywanie wystąpień z wartościami Z i M
W poniższym przykładzie pokazano, jak używać instancji CompoundCurve do przechowywania sekwencji instancji CircularString i LineString z wartościami Z i M.
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. Dlaczego wystąpienia usługi CircularString muszą być jawnie zadeklarowane
W poniższym przykładzie pokazano, dlaczego instancje CircularString muszą być jawnie zadeklarowane. Programista próbuje zapisać okrąg w instancji o nazwie CompoundCurve.
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
Oto zestaw wyników.
Circle One11.940039...
Circle Two12.566370...
Obwód Okręgu Dwa wynosi około 4π, co jest rzeczywistą długością obwodu. Jednak obwód circle one jest znacznie niedokładny. Wystąpienie Circle One CompoundCurve przechowuje jeden odcinek łuku (ABC) i dwa odcinki liniowe (CD, DA). Wystąpienie CompoundCurve musi przechowywać dwa cykliczne segmenty łuku (ABC, CDA) w celu zdefiniowania okręgu. Instancja LineString definiuje drugi zestaw punktów (4 2, 2 4, 0 2) w instancji CompoundCurve Kółka Pierwszego. Należy jawnie zadeklarować wystąpienie CircularString wewnątrz CompoundCurve.