Dela via


Polygon

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

En Polygon är en tvådimensionell yta som lagras som en sekvens av punkter som definierar en yttre avgränsningsring och noll eller fler inre ringar.

Polygon instances

En Polygon-instans kan bildas från en ring som har minst tre distinkta punkter. En Polygon-instans kan också vara tom.

Utsidan och alla inre ringar i en Polygon definierar dess gräns. Utrymmet i ringarna definierar polygonens inre.

Följande bild visar exempel på Polygon-instanser .

Exempel på polygoninstanser med geometri.

Som du ser i bilden:

  1. Bild 1 är en Polygon-instans vars gräns definieras av en yttre ring.

  2. Bild 2 är en Polygon-instans vars gräns definieras av en yttre ring och två inre ringar. Området inuti de inre ringarna är en del av utsidan av Polygon-instansen .

  3. Bild 3 är en giltig Polygon-instans eftersom dess inre ringar korsar en enda tangenspunkt.

Accepted instances

Accepterade Polygon-instanser är instanser som kan lagras i en geometri - eller geografivariabel utan att utlösa ett undantag. Följande är godkända Polygon-instanser :

  • En tom Polygon-instans
  • En Polygon-instans som har en acceptabel yttre ring (LineString) och noll eller fler acceptabla innerringar (LineStrings)

Följande kriterier krävs för att en ring (LineString) ska vara acceptabel.

  • LineString-instansen måste godkännas.
  • LineString-instansen måste ha minst fyra punkter.
  • Start- och slutpunkterna för LineString-instansen måste vara desamma.

I följande exempel visas accepterade Polygon-instanser .

DECLARE @g1 geometry = 'POLYGON EMPTY';  
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 1))';  
DECLARE @g3 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 3 3, 0 3, 0 0))';  
DECLARE @g4 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(3 0, 6 0, 6 3, 3 3, 3 0))';  
DECLARE @g5 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';  

Som @g4 och @g5 visar en accepterad Polygon-instans kanske inte är en giltig Polygon-instans . @g5 visar också att en Polygon-instans bara behöver innehålla en ring med fyra punkter som ska accepteras.

Följande exempel genererar en System.FormatException eftersom Polygon-instanserna inte accepteras.

DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';  
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';  

@g1 accepteras inte eftersom LineString-instansen för den yttre ringen inte innehåller tillräckligt med punkter. @g2 accepteras inte eftersom startpunkten för den yttre ringen LineString-instansen inte är samma som slutpunkten. Följande exempel har en acceptabel yttre ring, men den inre ringen är inte acceptabel. Detta genererar också en System.FormatException.

DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';  

Valid instances

De inre ringarna i en Polygon kan röra både sig själva och varandra vid enstaka tangentpunkter, men om de inre ringarna i ett Polygon-kors är instansen inte giltig.

I följande exempel visas giltiga Polygon-instanser .

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20))';  
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0))';  
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, -5 -10, -10 0))';  
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();  

@g3 är giltig eftersom de två inre ringarna rör vid en enda punkt och inte korsar varandra. I följande exempel visas Polygon instanser som inte är giltiga.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (20 0, 0 10, 0 -20, 20 0))';  
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (5 0, 1 5, 1 -5, 5 0))';  
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, 0 -10, -10 0))';  
DECLARE @g4 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 1 5, 0 -10, -10 0))';  
DECLARE @g5 geometry = 'POLYGON((10 0, 0 10, 0 -10, 10 0), (-20 -20, -20 20, 20 20, 20 -20, -20 -20) )';  
DECLARE @g6 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';  
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid(), @g6.STIsValid();  

@g1 är inte giltig eftersom den inre ringen rör vid den yttre ringen på två ställen. @g2 är inte giltig eftersom den andra inre ringen i det inre av den första inre ringen. @g3 är inte giltig eftersom de två inre ringarna rör vid flera på varandra följande punkter. @g4 är inte giltig eftersom inredningen i de två inre ringarna överlappar varandra. @g5 är inte giltig eftersom den yttre ringen inte är den första ringen. @g6 är inte giltig eftersom ringen inte har minst tre distinkta punkter.

Orientering av rumsliga data

Ringorienteringen för en polygon är inte en viktig faktor i planarsystemet. OGC Simple Features for SQL Specification anger inte en ringordning, och SQL Server har inte någon ringordning.

I ett ellipsoidsystem har en polygon utan orientering ingen betydelse eller är tvetydig. Beskriver till exempel en ring runt ekvatorn norra eller södra halvklotet? Om vi använder geografi datatyp för att lagra den rumsliga instansen måste vi ange ringens orientering och korrekt beskriva platsen för instansen.

Polygonens inre i ett ellipsoidsystem definieras av "vänsterregeln": om du föreställer dig att du går längs ringen i en geografi Polygon, följer punkterna i den ordning de listas, behandlas området till vänster som polygonens inre och området till höger som polygonens yttre.

Counter-clockwise

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;

Visualisering av

Clockwise

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;

Visualisering av

När kompatibilitetsnivån är 100 eller lägre i SQL Server har geografidatatypen följande begränsningar:

  • Varje geografi instans måste få plats på en enda halvklot. Inga rumsliga objekt som är större än en halvklot kan lagras.

  • Alla geografiska instanser från en Open Geospatial Consortium (OGC) Well-Known Text (WKT) eller Well-Known Binary (WKB) representation som producerar ett objekt större än en halvklot genererar en ArgumentException.

  • Metoderna för geografidatatyp som kräver indata från två geografiska instanser, (till STIntersection()exempel , STUnion(), STDifference()och STSymDifference()), returnerar null om resultaten från metoderna inte får plats på en enda halvklot. STBuffer() returnerar också null om utdata överstiger ett enda halvklot.

Orienteringen kan vändas med hjälp av den utökade metoden ReorientObject (geografidatatyp).

Examples

Example A.

I följande exempel skapas en enkel geometry Polygon instans med ett mellanrum och SRID 10.

DECLARE @g geometry;  
SET @g = geometry::STPolyFromText(
    'POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))',
    10);

Example B.

En instans som inte är giltig kan anges och konverteras till en giltig geometry instans. I följande exempel överlappar Polygonde inre och yttre ringarna och instansen är inte giltig.

DECLARE @g geometry;  
SET @g = geometry::Parse(
    'POLYGON((1 0, 0 1, 1 2, 2 1, 1 0), (2 0, 1 1, 2 2, 3 1, 2 0))'
    );  

Example C.

I följande exempel är den ogiltiga instansen giltig med MakeValid().

SET @g = @g.MakeValid();  
SELECT @g.ToString();  

Den geometry instans som returnerades från föregående exempel är en MultiPolygon.

MULTIPOLYGON (((2 0, 3 1, 2 2, 1.5 1.5, 2 1, 1.5 0.5, 2 0)),
              ((1 0, 1.5 0.5, 1 1, 1.5 1.5, 1 2, 0 1, 1 0)))

Example D.

Det här är ett annat exempel på hur du konverterar en ogiltig instans till en giltig geometriinstans. I följande exempel har instansen Polygon skapats med tre punkter som är exakt desamma:

DECLARE @g geometry  
SET @g = geometry::Parse('POLYGON((1 3, 1 3, 1 3, 1 3))');  
SET @g = @g.MakeValid();  
SELECT @g.ToString()  

Geometriinstansen som returnerades tidigare är en Point(1 3). Om angivet Polygon är POLYGON((1 3, 1 5, 1 3, 1 3)) returnerar MakeValid()LINESTRING(1 3, 1 5).