Megosztás a következőn keresztül:


CurvePolygon

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

A CurvePolygon egy topológiailag zárt felület, amelyet egy külső határoló gyűrű és nulla vagy több belső gyűrű határoz meg az SQL Database Engine térbeli adataiban.

Fontos

Az SQL Server 2012-ben (11.x) bevezetett térbeli funkciók részletes leírásáért és példáiért, beleértve a CurvePolygon altípust, töltse le az SQL Server 2012 Új térbeli funkciói című tanulmányt.

A CurvePolygon-példány attribútumait a következő feltételek határozzák meg:

  • A CurvePolygon-példány határát a külső gyűrű és az összes belső gyűrű határozza meg.

  • A CurvePolygon példány belső tere a külső gyűrű és az összes belső gyűrű közötti hely.

A CurvePolygon-példányok abban különböznek a sokszögpéldányoktól , hogy a CurvePolygon-példányok a következő körívszegmenseket tartalmazhatják: CircularString és CompoundCurve.

CompoundCurve-példányok

Az alábbi ábrán érvényes CurvePolygon-ábrák láthatók:

Elfogadott esetek

Ahhoz, hogy egy CurvePolygon-példányt elfogadjon, üresnek kell lennie, vagy csak elfogadott körkörös ívgyűrűket kell tartalmaznia. Az elfogadott körívgyűrű megfelel az alábbi követelményeknek.

  1. Elfogadott LineString-, CircularString- vagy CompoundCurve-példány. Az elfogadott példányokról további információért lásd a LineString, CircularString és CompoundCurve elemeket.

  2. Legalább négy ponttal rendelkezik.

  3. A kezdő és a végpont azonos X és Y koordinátákkal rendelkezik.

    Megjegyzés:

    A Z és az M értékek figyelmen kívül lesznek hagyva.

Az alábbi példa az elfogadott CurvePolygon-példányokat mutatja be.

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 akkor is elfogadott, ha a kezdő és a végpont eltérő Z értékkel rendelkezik, mert a Z értékek figyelmen kívül maradnak. @g5 akkor is elfogadott, ha a földrajzi típuspéldány érvénytelen.

Az alábbi példák dobnak 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 nem fogadható el, mert a kezdő és a végpont nem ugyanazzal az Y értékkel rendelkezik. @g2 nem fogadható el, mert a gyűrű nem rendelkezik elegendő ponttal.

Érvényes példányok

Ahhoz, hogy egy CurvePolygon-példány érvényes legyen, mind a külső, mind a belső gyűrűknek meg kell felelniük a következő feltételeknek:

  1. Csak egyetlen érintési ponton érinthetik egymást.
  2. Nem tudják keresztezni egymást.
  3. Minden gyűrűnek legalább négy pontot kell tartalmaznia.
  4. Minden gyűrűnek elfogadható görbetípusnak kell lennie.

A CurvePolygon-példányoknak adott feltételeknek is meg kell felelniük attól függően, hogy geometriai vagy földrajzi adattípusokról van-e szó.

Geometriai adattípus

Egy érvényes GeometryCurvePolygon-példánynak a következő attribútumokkal kell rendelkeznie:

  1. Minden belső gyűrűnek a külső gyűrűn belül kell lennie.
  2. Több belső gyűrű is lehet, de egy belső gyűrű nem tartalmazhat másik belső gyűrűt.
  3. Egyetlen gyűrű sem keresztezheti önmagát vagy egy másik gyűrűt.
  4. A gyűrűk csak egyedi érintési pontokon érinthetnek (azoknak a pontoknak a száma, ahol a gyűrűk érintkeznek, véges kell, hogy legyen).
  5. A sokszög belső részét össze kell kapcsolni.

Az alábbi példa érvényes geometriaCurvePolygon-példányokat mutat be.

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

A CurvePolygon-példányok érvényességi szabályai megegyeznek a sokszögpéldányokkal, azzal a kivétellel, hogy a CurvePolygon-példányok elfogadhatják az új körívszegmens-típusokat. Az érvényes vagy érvénytelen példányokra további példákat a Sokszög című témakörben talál.

Földrajzi adattípus

Egy érvényes geographyCurvePolygon-példánynak a következő attribútumokkal kell rendelkeznie:

  1. A sokszög belső része a bal oldali szabály használatával csatlakozik.
  2. Egyetlen gyűrű sem keresztezheti önmagát vagy egy másik gyűrűt.
  3. A gyűrűk csak egyetlen érintőponton érintkezhetnek (a gyűrűk érintkezési pontjainak száma véges kell, hogy legyen).
  4. A sokszög belső részét össze kell kapcsolni.

Az alábbi példa egy érvényes földrajzi Görbepolygon-példányt mutat be.

DECLARE @g geography = 'CURVEPOLYGON((-122.3 47, 122.3 47, 125.7 49, 121 38, -122.3 47))';  
SELECT @g.STIsValid();  

Példák

A. Geometriai példány létrehozása üres CurvePolygonnal

Ez a példa egy üres CurvePolygon-példány létrehozását mutatja be:

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

B. Geometriai példány deklarálása és példányosítása egy CurvePolygonnal ugyanabban az utasításban

Ez a kódrészlet bemutatja, hogyan deklarálhat és inicializálhat geometriai példányokat egy CurvePolygonnal ugyanabban az utasításban:

DECLARE @g geometry = 'CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))'  

C. Földrajzi példány létrehozása CurvePolygonnal

Ez a kódrészlet bemutatja, hogyan deklarálhat és inicializálhat földrajzi példányokat CurvePolygonnal:

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. Csak külső határológyűrűvel rendelkező CurvePolygon tárolása

Ez a példa bemutatja, hogyan tárolhat egy egyszerű kört egy CurvePolygon-példányban (a kör meghatározásához csak külső határológyűrűt használunk):

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. Belső gyűrűket tartalmazó "CurvePolygon" tárolása

Ez a példa létrehoz egy fánkot egy CurvePolygon-példányban (a külső határoló gyűrű és a belső gyűrű is a fánk meghatározására szolgál):

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;  

Ebben a példában egy érvényes CurvePolygon-példány és egy érvénytelen példány is látható belső gyűrűk használatakor:

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;  

Mindkettő @g1 és @g2 ugyanazt a külső határoló gyűrűt használja: egy 5 sugarú kör, és mindkettő négyzetet használ egy belső gyűrűhöz. A példány @g1 azonban érvényes, de a példány @g2 érvénytelen. A @g2 azért érvénytelen, mert a belső gyűrű négy különálló régióra osztja a külső gyűrű által határolt belső teret. Az alábbi rajz a történteket mutatja be: