Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric
Een veelhoek is een tweedimensionaal oppervlak dat is opgeslagen als een reeks punten die een buitenbegrenzingsring definiëren en nul of meer binnenringen.
Veelhoekexemplaren
Een polygoon kan worden gevormd uit een ring met ten minste drie afzonderlijke punten. Een Polygon-instantie kan 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 veelhoekinstanties.
Zoals wordt weergegeven in de afbeelding:
De afbeelding 1 is een polygoonexemplaar waarvan de grens wordt gedefinieerd door een buitenring.
Afbeelding 2 is een polygooninstantie waarvan de begrenzing wordt gedefinieerd door een buitenring en twee interne ringen. Het gebied dat binnen de binnenringen ligt maakt deel uit van het exterieur van de Polygon instantie.
Afbeelding 3 is een valide Polygon omdat de binnenste ringen elkaar ontmoeten op een enkel tangentieel punt.
Geaccepteerde exemplaren
Geaccepteerde veelhoekexemplaren zijn exemplaren die kunnen worden opgeslagen in een geometrie- of geografievariabele zonder een uitzondering te genereren. Hieronder worden polygoonexemplaren geaccepteerd:
- Een lege Polygon-instantie
- Een polygooninstantie 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))';
@g4 en @g5 laten zien dat een geaccepteerd polygoon exemplaar mogelijk geen geldig polygoon is.
@g5 geeft ook aan dat een polygoonexemplaar alleen een ring hoeft te bevatten met vier willekeurige punten om te worden geaccepteerd.
In de volgende voorbeelden verschijnt een System.FormatException omdat de Polygon-instanties 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 levert ook een System.FormatException op.
DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';
Geldige exemplaren
De binnenringen van een veelhoek kunnen zowel zichzelf als elkaar aanraken op enkele tangentpunten, maar als de binnenringen van een polygon elkaar kruisen, is de instantie 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 instanties 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 zich binnen het interieur van de eerste binnenring bevindt.
@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.
Linksom
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;
Rechtsom
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;
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()enSTSymDifference()) 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 oriëntatie kan worden omgekeerd met behulp van de uitgebreide functie ReorientObject (geografiegegevenstype).
Examples
Voorbeeld 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);
Voorbeeld B.
Een exemplaar dat niet geldig is, kan worden ingevoerd en geconverteerd naar een geldig exemplaar geometry . In het volgende voorbeeld van een Polygon, overlappen de binnen- en buitenringen elkaar en is de instantie 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))'
);
Voorbeeld 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)))
Voorbeeld 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 geometrie-exemplaar dat eerder is geretourneerd, is een Point(1 3). Als de Polygon waarde is opgegeven, dan zou POLYGON((1 3, 1 5, 1 3, 1 3))MakeValid() retourneren.
Verwante inhoud
- STArea (geometriegegevenstype)
- STExteriorRing (geometriegegevenstype)
- STNumInteriorRing (geometriegegevenstype)
- STInteriorRingN (geometriegegevenstype)
- STCentroid (geometriegegevenstype)
- STPointOnSurface (geometriegegevenstype)
- MultiPolygon
- Ruimtelijke gegevens
- STIsValid (geografiegegevenstype)
- STIsValid (geometriegegevenstype)