Delen via


Polygon

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric Preview

Een veelhoek is een tweedimensionaal oppervlak dat is opgeslagen als een reeks punten die een buitenbegrenzingsring definiëren en nul of meer binnenringen.

Polygon instances

Een polygoonexemplaren kunnen worden gevormd uit een ring met ten minste drie afzonderlijke punten. Een veelhoekexemplaren kunnen ook leeg zijn.

De buitenkant en eventuele binnenringen van een Polygoon definiëren de grens. De ruimte binnen de ringen definieert het interieur van de Veelhoek.

In de volgende afbeelding ziet u voorbeelden van veelhoekexemplaren.

Voorbeelden van geometrie polygoonexemplaren.

Zoals wordt weergegeven in de afbeelding:

  1. Afbeelding 1 is een polygoonexemplaren waarvan de grens wordt gedefinieerd door een buitenring.

  2. Afbeelding 2 is een polygoonexemplaren waarvan de grens wordt gedefinieerd door een buitenring en twee binnenste ringen. Het gebied binnen de binnenste ringen maakt deel uit van de buitenkant van het polygoonexemplaren .

  3. Afbeelding 3 is een geldig polygoonexemplaren omdat de binnenste ringen elkaar snijden op één tangenspunt.

Accepted instances

Geaccepteerde veelhoekexemplaren zijn exemplaren die kunnen worden opgeslagen in een geometrie- of geografievariabele zonder een uitzondering te genereren. Hieronder worden polygoonexemplaren geaccepteerd:

  • Een leeg veelhoekexemplaren
  • Een polygoonexemplaren met een acceptabele buitenring (LineString) en nul of meer acceptabele binnenringen (LineStrings)

De volgende criteria zijn nodig om een ring (LineString) acceptabel te maken.

  • Het LineString-exemplaar moet worden geaccepteerd.
  • Het LineString-exemplaar moet ten minste vier punten hebben.
  • De begin- en eindpunten van het LineString-exemplaar moeten hetzelfde zijn.

In het volgende voorbeeld ziet u geaccepteerde polygoonexemplaren .

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

Het @g4 is mogelijk dat een geaccepteerd polygoonexemplaren geen geldig polygoonexemplaren zijn en @g5 weergeven. @g5 geeft ook aan dat een polygoonexemplaren alleen een ring moeten bevatten met vier punten die moeten worden geaccepteerd.

In de volgende voorbeelden wordt een System.FormatException fout weergegeven omdat de veelhoekexemplaren niet worden geaccepteerd.

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

@g1 wordt niet geaccepteerd omdat het LineString-exemplaar voor de buitenring niet voldoende punten bevat. @g2 wordt niet geaccepteerd omdat het beginpunt van het exemplaar van de buitenring LineString niet hetzelfde is als het eindpunt. Het volgende voorbeeld heeft een acceptabele buitenring, maar de binnenring is niet acceptabel. Dit gooit ook een 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 binnenringen van een veelhoek kunnen zowel zichzelf als elkaar aanraken op enkele tangenspunten, maar als de binnenringen van een polygonkruis , is het exemplaar niet geldig.

In het volgende voorbeeld ziet u geldige polygoonexemplaren .

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 is geldig omdat de twee binnenringen op één punt aanraken en elkaar niet kruisen. In het volgende voorbeeld ziet u Polygon exemplaren die niet geldig zijn.

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 is niet geldig omdat de binnenring de buitenring op twee plaatsen raakt. @g2 is niet geldig omdat de tweede binnenring binnen de binnenkant van de eerste binnenring niet geldig is. @g3 is niet geldig omdat de twee binnenringen op meerdere opeenvolgende punten aanraken. @g4 is niet geldig omdat de binnenkanten van de twee binnenringen elkaar overlappen. @g5 is niet geldig omdat de buitenring niet de eerste ring is. @g6 is niet geldig omdat de ring niet ten minste drie afzonderlijke punten heeft.

Oriëntatie van ruimtelijke gegevens

De ringstand van een veelhoek is geen belangrijke factor in het planaire systeem. De OGC Simple Features for SQL Specification bepaalt geen ringvolgorde en SQL Server dwingt geen ringvolgorde af.

In een ellipsoïdaal systeem heeft een veelhoek zonder oriëntatie geen betekenis of is dubbelzinnig. Beschrijft een ring rond de evenaar bijvoorbeeld het noordelijke of zuidelijke halfrond? Als we de geografie gegevenstype gebruiken om het ruimtelijke exemplaar op te slaan, moeten we de richting van de ring opgeven en de locatie van het exemplaar nauwkeurig beschrijven.

Het interieur van de veelhoek in een ellipsoïdaal systeem wordt gedefinieerd door de "linkerregel": als u zich voorstelt dat u langs de ring van een geografische veelhoek loopt, de punten volgend in de volgorde waarin ze worden vermeld, wordt het gebied aan de linkerkant behandeld als het interieur van de polygoon en het gebied aan de rechterkant als het exterieur van de veelhoek.

Counter-clockwise

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

Visualisatie van links-handregel linksom richting.

Clockwise

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

Visualisatie van 'linkerregel' met de klok mee.

Wanneer het compatibiliteitsniveau 100 of lager is in SQL Server, heeft het gegevenstype geografie de volgende beperkingen:

  • Elke geografie instantie moet binnen één halfrond passen. Er kunnen geen ruimtelijke objecten worden opgeslagen die groter zijn dan een halfrond.

  • Elk geografisch exemplaar van een OPEN Georuimtelijk Consortium (OGC) Well-Known Text (WKT) of Well-Known Binaire weergave (WKB) die een object produceert dat groter is dan een halfrond genereert een ArgumentException.

  • De methoden voor geografiegegevenstypen waarvoor de invoer van twee geografieinstanties (zoals STIntersection()STUnion(), STDifference()en STSymDifference()) is vereist, retourneren null als de resultaten van de methoden niet binnen één halfrond passen. STBuffer() retourneert ook null als de uitvoer een enkel halfrond overschrijdt.

De afdrukstand kan worden omgekeerd met behulp van de uitgebreide methode ReorientObject (geografiegegevenstype).

Examples

Example A.

In het volgende voorbeeld wordt een eenvoudig geometry Polygon exemplaar gemaakt met een hiaat en 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.

Een exemplaar dat niet geldig is, kan worden ingevoerd en geconverteerd naar een geldig exemplaar geometry . In het volgende voorbeeld van een Polygonoverlapping overlappen de binnen- en buitenringen en is het exemplaar niet geldig.

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.

In het volgende voorbeeld wordt het ongeldige exemplaar geldig gemaakt met MakeValid().

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

Het geometry exemplaar dat uit het vorige voorbeeld is geretourneerd, is een 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.

Dit is een ander voorbeeld van het converteren van een ongeldig exemplaar naar een geldig geometrie-exemplaar. In het volgende voorbeeld is het Polygon exemplaar gemaakt met drie punten die precies hetzelfde zijn:

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

Het geometrieexemplaren dat eerder is geretourneerd, is een Point(1 3). Als de Polygon opgegeven waarde wordt MakeValid()POLYGON((1 3, 1 5, 1 3, 1 3)) geretourneerdLINESTRING(1 3, 1 5).