Sdílet prostřednictvím


CompoundCurve

platí pro:SQL ServerAzure SQL Databasekoncový bod služby Azure SQL Managed InstanceSQL Analytics v Microsoft FabricWarehouse v Microsoft Fabricdatabázi SQL v Microsoft Fabric

CompoundCurve je kolekce žádné nebo více souvislých instancí CircularString nebo LineString typu geometrie nebo geografie.

Je možné vytvořit instanci prázdného CompoundCurve, ale aby byl CompoundCurve platný, musí splňovat následující kritéria:

  1. Musí obsahovat alespoň jednu instanci CircularString nebo LineString.

  2. Sekvence instancí CircularString nebo LineString musí být souvislé.

Pokud CompoundCurve obsahuje posloupnost více instancí CircularString a LineString, koncový bod pro každou instanci s výjimkou poslední instance musí být počáteční bod pro další instanci v posloupnosti. To znamená, že pokud je koncový bod předchozí instance v sekvenci (4 3 7 2), musí být výchozí bod pro další instanci v sekvenci (4 3 7 2). Hodnoty Z (zvýšení) a M (měření) pro bod musí být stejné. Pokud je mezi těmito dvěma body rozdíl, je vyvolán System.FormatException. Body v Kruhovém řetězci nemusí mít hodnotu Z nebo M. Pokud nejsou pro koncový bod předchozí instance zadané žádné hodnoty Z nebo M, nemůže výchozí bod další instance obsahovat hodnoty Z nebo M. Pokud je koncový bod pro předchozí sekvenci (4 3), musí být výchozí bod pro další sekvenci (4 3); nemůže být (4 3 7 2). Všechny body v instanci CompoundCurve nesmí mít žádnou hodnotu Z nebo stejnou hodnotu Z.

Instance CompoundCurve

Následující obrázek ukazuje platné typy CompoundCurve.

diagram příkladů CompoundCurve

Akceptované instance

CompoundCurve instance je přijata, pokud se jedná o prázdnou instanci nebo splňuje následující kritéria.

  1. Všechny instance obsažené v instanci CompoundCurve jsou přijímané jako obloukové segmenty kružnice. Další informace o akceptovaných instancích kruhového obloukového segmentu viz LineString a CircularString.

  2. Všechny kruhové obloukové segmenty v instanci CompoundCurve jsou propojeny. První bod každého následujícího segmentu kruhového oblouku je stejný jako poslední bod na předchozím segmentu kruhového oblouku.

    Poznámka

    To zahrnuje souřadnice Z a M. Všechny čtyři souřadnice X, Y, Z a M tedy musí být stejné.

  3. Žádná z obsažených instancí není prázdná instance.

Následující příklad ukazuje akceptované CompoundCurve instance.

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

Následující příklad ukazuje CompoundCurve instance, které nejsou přijaty. Tyto instance vyvolají System.FormatException.

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

Platné instance

Instance CompoundCurve je platná, pokud splňuje následující kritéria.

  1. Je přijata instance CompoundCurve.

  2. Všechny instance úseku kruhového oblouku obsažené v instanci CompoundCurve jsou platné instance.

Následující příklad ukazuje platné instance 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 je platný, protože instance CircularString je platná. Další informace o platnosti instance CircularString naleznete v tématu CircularString.

Následující příklad ukazuje CompoundCurve instance, které nejsou platné.

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 není platný, protože druhá instance není platnou instancí LineString. @g2 není platný, protože instance LineString není platná. není platný, protože instance CircularString není platná. Další informace o platných instancích CircularString a LineString viz CircularString a LineString.

Příklady

A. Instancujte geometrickou instanci s prázdnou složenou křivkou

Následující příklad ukazuje, jak vytvořit prázdnou instanci CompoundCurve:

DECLARE @g geometry;  
SET @g = geometry::Parse('COMPOUNDCURVE EMPTY');  

B. Deklarace a vytvoření instance geometrie pomocí compoundCurve ve stejném příkazu

Následující příklad ukazuje, jak deklarovat a inicializovat instanci geometry s CompoundCurveve stejném příkazu:

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. Vytvoření instance geografie se složenou křivkou

Následující příklad ukazuje, jak deklarovat a inicializovat geografickou instanci s 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. Uložení čtverce v instanci CompoundCurve

Následující příklad používá dva různé způsoby použití CompoundCurve instance k uložení čtverce.

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élky @g1 i @g2 jsou stejné. Všimněte si z příkladu, že instance CompoundCurve může ukládat jednu nebo více instancí LineString.

E. Vytvoření instance geometrie pomocí CompoundCurve s několika kruhovými stringy

Následující příklad ukazuje, jak použít dvě různé CircularString instance k inicializaci 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();  

Tím se vytvoří výstup 12.5663706143592, což je ekvivalent 4o π. Instance CompoundCurve v příkladu ukládá kruh s poloměrem 2. Oba předchozí příklady kódu nemusely používat CompoundCurve. V prvním příkladu by byla instance LineString jednodušší a CircularString instance by byla pro druhý příklad jednodušší. Následující příklad ale ukazuje, kde CompoundCurve nabízí lepší alternativu.

F. Použijte CompoundCurve k uložení polokruhu

Následující příklad používá instanci CompoundCurve k uložení polokruhu.

DECLARE @g geometry;  
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 0 2))');  
SELECT @g.STLength();  

G. Uložte více instancí CircularString a LineString do složené křivky.

Následující příklad ukazuje, jak lze ukládat více instancí CircularString a LineString pomocí 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. Ukládání instancí s hodnotami Z a M

Následující příklad ukazuje, jak použít instanci CompoundCurve k uložení posloupnosti CircularString a LineString instancí s hodnotami 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. Proč musí být instance CircularString explicitně deklarovány

Následující příklad ukazuje, proč CircularString instance musí být explicitně deklarovány. Programátor se pokouší uložit kruh do CompoundCurve instance.

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  

Zde jsou výsledky.

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

Obvod kruhu Dvě je přibližně 4, což je skutečná hodnota obvodu. Obvod kruhu 1 je však výrazně nepřesný. Instance kruhu One CompoundCurve ukládá jeden kruhový segment oblouku (ABC) a dva segmenty přímky (CD, DA). Instance CompoundCurve musí ukládat dva kruhové obloukové segmenty (ABC, CDA) k definování kruhu. Instance LineString definuje druhou sadu bodů (4 2, 2 4, 0 2) v instanci CompoundCurve Circle One. Musíte explicitně deklarovat instanci CircularString uvnitř CompoundCurve.