CircularString

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

En CircularString är en samling med noll eller fler kontinuerliga cirkulära bågsegment. Ett cirkulärt bågsegment är ett kurvsegment som definieras av tre punkter i ett tvådimensionellt plan. den första punkten får inte vara samma som den tredje punkten. Om alla tre punkterna i ett cirkulärt bågsegment är kollinära behandlas bågsegmentet som ett linjesegment.

CircularString-instanser

Ritningen nedan visar giltiga CircularString-instanser :

Diagram över CircularString-exempel på rumsliga mätningar.

Godkända instanser

En CircularString-instans accepteras om den antingen är tom eller innehåller ett udda antal punkter, n, där n > 1. Följande CircularString-instanser accepteras.

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

@g3 visar att CircularString-instansen kan accepteras, men inte giltig. Följande CircularString-instansdeklaration accepteras inte. Den här deklarationen genererar en System.FormatException.

DECLARE @g geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 1 1)';  

Giltiga instanser

En giltig CircularString-instans måste vara tom eller ha följande attribut:

  • Det måste innehålla minst ett cirkulärt bågsegment (det vill: ha minst tre punkter).
  • Den sista slutpunkten för varje cirkulärt arc-segment i sekvensen, förutom det sista segmentet, måste vara den första slutpunkten för nästa segment i sekvensen.
  • Det måste ha ett udda antal punkter.
  • Det kan inte överlappa sig själv över ett intervall.
  • Även om CircularString-instanser kan innehålla linjesegment måste dessa linjesegment definieras med tre kollinära punkter.

I följande exempel visas giltiga CircularString-instanser .

DECLARE @g1 geometry = 'CIRCULARSTRING EMPTY';  
DECLARE @g2 geometry = 'CIRCULARSTRING(1 1, 2 0, -1 1)';  
DECLARE @g3 geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 1 1, 0 1)';  
DECLARE @g4 geometry = 'CIRCULARSTRING(1 1, 2 2, 2 2)';  
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(),@g4.STIsValid();  

En CircularString-instans måste innehålla minst två cirkulära bågsegment för att definiera en fullständig cirkel. En CircularString-instans kan inte använda ett enda cirkulärt bågsegment (till exempel (1 1, 3 1, 1 1)) för att definiera en fullständig cirkel. Använd (1 1, 2 2, 3 1, 2 0, 1 1) för att definiera cirkeln.

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

DECLARE @g1 geometry = 'CIRCULARSTRING(1 1, 2 0, 1 1)';  
DECLARE @g2 geometry = 'CIRCULARSTRING(0 0, 0 0, 0 0)';  
SELECT @g1.STIsValid(), @g2.STIsValid();  

Instanser med kollineära punkter

I följande fall behandlas ett cirkulärt bågsegment som ett linjesegment:

  • När alla tre punkterna är kollinära (till exempel (1 3, 4 4, 7 5)).
  • När den första och den mellersta punkten är densamma, men den tredje punkten är annorlunda (till exempel (1 3, 1 3, 7 5)).
  • När den mellersta och sista punkten är densamma, men den första punkten är annorlunda (till exempel (1 3, 4 4, 4 4)).

Examples

A. Instansiera en geometrisk instans med ett tomt CircularString

Det här exemplet visar hur du skapar en tom CircularString-instans :

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

B. Instansiera en geometriinstans med hjälp av en CircularString med ett cirkulärt arc-segment

I följande exempel visas hur du skapar en CircularString-instans med ett enda cirkulärt bågsegment (halvcirkel):

DECLARE @g geometry;  
SET @g = geometry:: STGeomFromText('CIRCULARSTRING(2 0, 1 1, 0 0)', 0);  
SELECT @g.ToString();  

C. Instansiera en geometriinstans med hjälp av en CircularString med flera cirkelbågesegment

I följande exempel visas hur du skapar en CircularString-instans med mer än ett cirkelbågssegment (full cirkel):

DECLARE @g geometry;  
SET @g = geometry::Parse('CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1)');  
SELECT 'Circumference = ' + CAST(@g.STLength() AS NVARCHAR(10));    

Här är resultatet.

Circumference = 6.28319  

Jämför utdata när LineString används i stället för CircularString:

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('LINESTRING(2 1, 1 2, 0 1, 1 0, 2 1)', 0);  
SELECT 'Perimeter = ' + CAST(@g.STLength() AS NVARCHAR(10));  

Här är resultatet.

Perimeter = 5.65685  

Värdet för CircularString-exemplet är nära 2∏, vilket är cirkelns faktiska omkrets.

D. Deklarera och instansiera en geometriinstans med en CircularString i samma instruktion

Det här kodfragmentet visar hur du deklarerar och instansierar en geometriinstans med en CircularString i samma instruktion:

DECLARE @g geometry = 'CIRCULARSTRING(0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)';  

E. Instansiera en geografiinstans med en CircularString (cirkulär sträng)

I följande exempel visas hur du deklarerar och instansierar en geografiinstans med en CircularString:

DECLARE @g geography = 'CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653)';  

F. Instansiera en geometriinstans med en CircularString som är en rät linje

I följande exempel visas hur du skapar en CircularString-instans som är en rak linje:

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('CIRCULARSTRING(0 0, 1 2, 2 4)', 0);