Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Förhandsversion av Microsoft Fabric
En CurvePolygon är en topologiskt sluten yta som definieras av en yttre avgränsningsring och noll eller fler inre ringar i SQL Database Engine spatiala data.
Important
För en detaljerad beskrivning och exempel på rumsliga funktioner som introducerades i SQL Server 2012 (11.x), inklusive undertypen CurvePolygon , laddar du ned vitboken, Nya rumsliga funktioner i SQL Server 2012.
Följande villkor definierar attribut för en CurvePolygon-instans :
Gränsen för CurvePolygon-instansen definieras av den yttre ringen och alla inre ringar.
Det inre av CurvePolygon-instansen är utrymmet mellan den yttre ringen och alla inre ringar.
En CurvePolygon-instans skiljer sig från en Polygon-instans eftersom en CurvePolygon-instans kan innehålla följande cirkulära bågesegment: CircularString och CompoundCurve.
CompoundCurve instances
Bilden nedan visar giltiga CurvePolygon-figurer :
Accepted instances
För att en CurvePolygon-instans ska accepteras måste den antingen vara tom eller innehålla endast cirkulära bågeringar som accepteras. En godkänd cirkelbåge uppfyller följande krav.
Är en godkänd LineString-, CircularString- eller CompoundCurve-instans . Mer information om godkända instanser finns i LineString, CircularString och CompoundCurve.
Har minst fyra poäng.
Start- och slutpunkten har samma X- och Y-koordinater.
Note
Z- och M-värden ignoreras.
I följande exempel visas accepterade CurvePolygon-instanser .
DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';  
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0, 0 0))';  
DECLARE @g3 geometry = 'CURVEPOLYGON((0 0 1, 0 0 2, 0 0 3, 0 0 3))'  
DECLARE @g4 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';  
DECLARE @g5 geography = 'CURVEPOLYGON((-122.3 47, 122.3 -47, 125.7 -49, 121 -38, -122.3 47))';  
              @g3 accepteras även om start- och slutpunkterna har olika Z-värden eftersom Z-värden ignoreras. 
              @g5 accepteras även om instansen av geografityp inte är giltig.
Följande exempel genererar System.FormatException.
DECLARE @g1 geometry = 'CURVEPOLYGON((0 5, 0 0, 0 0, 0 0))';  
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0))';  
              @g1 accepteras inte eftersom start- och slutpunkterna inte har samma Y-värde. 
              @g2 accepteras inte eftersom ringen inte har tillräckligt med punkter.
Valid instances
För att en CurvePolygon-instans ska vara giltig måste både yttre och inre ringar uppfylla följande kriterier:
- De kan bara röra vid enstaka tangentpunkter.
 - De kan inte korsa varandra.
 - Varje ring måste innehålla minst fyra punkter.
 - Varje ring måste vara en acceptabel kurvtyp.
 
CurvePolygon-instanser måste också uppfylla specifika kriterier beroende på om de är geometri - eller geografidatatyper .
Datatyp för geometri
En giltig geometriCurvePolygon-instans måste ha följande attribut:
- Alla invändiga ringar måste vara inneslutna i ytterringen.
 - Kan ha flera inre ringar, men en inre ring kan inte innehålla en annan inre ring.
 - Ingen ring kan korsa sig själv eller en annan ring.
 - Ringarna kan bara röra vid enstaka tangentpunkter (antalet punkter där ringarna rör vid varandra måste vara ändligt).
 - Polygonens insida måste vara ansluten.
 
I följande exempel visas giltiga geometriCurvePolygon-instanser .
DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';  
DECLARE @g2 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';  
SELECT @g1.STIsValid(), @g2.STIsValid();  
CurvePolygon-instanser har samma giltighetsregler som Polygon-instanser med undantaget att CurvePolygon-instanser kan acceptera de nya typerna av cirkulära bågsegment. Fler exempel på instanser som är giltiga eller inte giltiga finns i Polygon.
Datatyp för geografi
En giltig geographyCurvePolygon-instans måste ha följande attribut:
- Polygonens inre är anslutet med hjälp av den vänstra regeln.
 - Ingen ring kan korsa sig själv eller en annan ring.
 - Ringar kan bara röra vid enstaka tangenspunkter (antalet punkter där ringarna rör vid varandra måste vara ändligt).
 - Polygonens insida måste vara ansluten.
 
I följande exempel visas en giltig CurvePolygon-instans inom geografi.
DECLARE @g geography = 'CURVEPOLYGON((-122.3 47, 122.3 47, 125.7 49, 121 38, -122.3 47))';  
SELECT @g.STIsValid();  
Examples
A. Instansiera en geometriinstans med en tom Kurvpolygon
Det här exemplet visar hur du skapar en tom CurvePolygon-instans :
DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON EMPTY');  
B. Deklarera och instansiera en geometriinstans med en CurvePolygon i samma instruktion
Det här kodfragmentet visar hur du deklarerar och initierar en geometriinstans med en CurvePolygon i samma instruktion:
DECLARE @g geometry = 'CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))'  
C. Instansiera en geografiinstans med en CurvePolygon
Det här kodfragmentet visar hur du deklarerar och initierar en geografiinstans med en CurvePolygon:
DECLARE @g geography = 'CURVEPOLYGON(CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';  
D. Lagra en CurvePolygon med endast en yttre avgränsningsring
Det här exemplet visar hur du lagrar en enkel cirkel i en CurvePolygon-instans (endast en yttre avgränsningsring används för att definiera cirkeln):
DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');  
SELECT @g.STArea() AS Area;  
E. Lagra en kurva polygon som innehåller inre ringar
I det här exemplet skapas en donutform i en CurvePolygon-instans (både en yttre begränsningsring och en inre ring används för att definiera donutformen):
DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 4, 4 0, 8 4, 4 8, 0 4), CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');  
SELECT @g.STArea() AS Area;  
Det här exemplet visar både en giltig CurvePolygon-instans och en ogiltig instans när du använder invändiga ringar:
DECLARE @g1 geometry, @g2 geometry;  
SET @g1 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (-2 2, 2 2, 2 -2, -2 -2, -2 2))');  
IF @g1.STIsValid() = 1  
  BEGIN  
     SELECT @g1.STArea();  
  END  
SET @g2 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (0 5, 5 0, 0 -5, -5 0, 0 5))');  
IF @g2.STIsValid() = 1  
  BEGIN  
     SELECT @g2.STArea();  
  END  
SELECT @g1.STIsValid() AS G1, @g2.STIsValid() AS G2;  
Både @g1 och @g2 använder samma yttre avgränsningsring: en cirkel med en radie på 5 och de båda använder en kvadrat för en inre ring.  Instansen @g1 är dock giltig, men instansen @g2 är ogiltig. Anledningen till att @g2 är ogiltig är att den inre ringen delar det inre utrymmet avgränsas av den yttre ringen i fyra separata regioner. Följande ritning visar vad som hände: