Dela via


CompoundCurve

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft FabricSQL-databas i Microsoft Fabric

En CompoundCurve är en samling med noll eller fler kontinuerliga CircularString eller LineString instanser av antingen geometry eller geography typer.

En tom CompoundCurve instans kan instansieras, men för att en CompoundCurve vara giltig måste den uppfylla följande kriterier:

  1. Den måste innehålla minst en CircularString- eller LineString instans.

  2. Sekvensen av CircularString eller LineString instanser måste vara kontinuerlig.

Om en CompoundCurve- innehåller en sekvens med flera CircularString- och LineString-instanser, måste slutpunkten för varje instans förutom den sista instansen vara startslutpunkten för nästa instans i sekvensen. Det innebär att om slutpunkten för en tidigare instans i sekvensen är (4 3 7 2) måste startpunkten för nästa instans i sekvensen vara (4 3 7 2). Värdena Z(elevation) och M(measure) för punkten måste också vara desamma. Om det finns en skillnad mellan de två punkterna utlöses en System.FormatException. Punkter i en CircularString- behöver inte ha ett Z- eller M-värde. Om inga Z- eller M-värden anges för slutpunkten för den tidigare instansen kan startpunkten för nästa instans inte innehålla Z- eller M-värden. Om slutpunkten för den tidigare sekvensen är (4 3) måste startpunkten för nästa sekvens vara (4 3); det kan inte vara (4 3 7 2). Alla punkter i en CompoundCurve--instans måste ha antingen inget Z-värde eller samma Z-värde.

CompoundCurve-instanser

Följande bild visar giltiga CompoundCurve- typer.

diagram över CompoundCurve-exempel.

Godkända instanser

CompoundCurve instans accepteras om det är en tom instans eller uppfyller följande villkor.

  1. Alla instanser som ingår i CompoundCurve är accepterade cirkulära bågsegmentinstanser. Mer information om accepterade instanser av cirkulära bågsegment finns i LineString och CircularString.

  2. Alla cirkulära bågsegment i instansen CompoundCurve är anslutna. Den första punkten för varje efterföljande cirkulärt bågsegment är samma som den sista punkten i det föregående cirkulära arc-segmentet.

    Notera

    Detta inkluderar Z- och M-koordinaterna. Så alla fyra koordinaterna X, Y, Z och M måste vara desamma.

  3. Ingen av de inneslutna instanserna är tomma instanser.

I följande exempel visas accepterade CompoundCurve- instanser.

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

I följande exempel visas CompoundCurve instanser som inte accepteras. Dessa instanser genererar System.FormatException.

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

Giltiga instanser

En CompoundCurve- instans är giltig om den uppfyller följande villkor.

  1. Instansen CompoundCurve blir accepterad.

  2. Alla instanser av cirkulära arc-segment som finns i CompoundCurve- instans är giltiga instanser.

I följande exempel visas giltiga CompoundCurve- instanser.

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 är giltig eftersom instansen CircularString är giltig. Mer information om giltigheten för instansen CircularString finns i CircularString.

I följande exempel visas CompoundCurve instanser som inte är giltiga.

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 är ogiltig eftersom den andra instansen inte är en giltig LineString-instans. @g2 är inte giltigt eftersom LineString-instansen inte är giltig. @g3 är inte giltigt eftersom instansen CircularString inte är giltig. Mer information om giltiga CircularString-- och LineString--instanser finns i CircularString och LineString.

Exempel

A. Instansiera en geometriinstans med en tom compoundkurva

I följande exempel visas hur du skapar en tom CompoundCurve instans:

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

B. Deklarera och instansiera en geometriinstans med hjälp av en CompoundCurve i samma instruktion

I följande exempel visas hur du deklarerar och initierar en geometry-instans med en CompoundCurvei samma instruktion:

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. Instansiera en geografi-instans med en CompoundCurve

I följande exempel visas hur du deklarerar och initierar en geografi instans med en 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. Lagra en fyrkant i en CompoundCurve-instans

I följande exempel används två olika sätt att använda en CompoundCurve-instans för att lagra en fyrkant.

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

Längderna för både @g1 och @g2 är desamma. Observera från exemplet att en CompoundCurve- instans kan lagra en eller flera instanser av LineString.

E. Instansiera en geometriinstans med hjälp av en CompoundCurve med flera CircularStrings

I följande exempel visas hur du använder två olika CircularString instanser för att initiera en 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();  

Detta ger utdata 12.5663706143592 vilket motsvarar 4pi. Den CompoundCurve instansen i exemplet lagrar en cirkel med en radie på 2. Båda de föregående kodexemplen behövde inte använda en CompoundCurve. I det första exemplet skulle en LineString instans ha varit enklare och en CircularString instans hade varit enklare för det andra exemplet. Nästa exempel visar dock var en CompoundCurve ger ett bättre alternativ.

F. Använd en CompoundCurve för att lagra en halvcirkel

I följande exempel används en CompoundCurve instans för att lagra en halvcirkel.

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

G. Lagra flera CircularString- och LineString-instanser i en CompoundCurve

I följande exempel visas hur flera CircularString och LineString instanser kan lagras med hjälp av en 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. Lagra instanser med Z- och M-värden

I följande exempel visas hur du använder en CompoundCurve-instans för att lagra en sekvens med CircularString och LineString instanser med både Z- och M-värden.

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

Jag. Varför CircularString-instanser måste deklareras uttryckligen

I följande exempel visas varför CircularString instanser måste deklareras explicit. Programmeraren försöker lagra en cirkel i en CompoundCurve instans.

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  

Här är resultatet.

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

Perimetern för Circle Two är cirka 4pi, vilket är det faktiska värdet för perimetern. Perimetern för Circle One är dock betydligt felaktig. Circle Ones CompoundCurve-instans lagrar ett cirkulärt bågsegment (ABC) och två linjesegment (CD, DA). Den CompoundCurve instansen måste lagra två cirkulära bågsegment (ABC, CDA) för att definiera en cirkel. En LineString-instans definierar den andra uppsättningen punkter (4 2, 2 4, 0 2) i Circle Ones CompoundCurve-instans. Du måste uttryckligen deklarera en CircularString-instans i en CompoundCurve.