Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance
Azure SQLKoncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Polygon je dvourozměrná plocha uložená jako posloupnost bodů definujících vnější ohraničující prstenec a nula nebo více vnitřních kroužků.
Polygonové instance
Instanci Mnohoúhelníku lze vytvořit z kruhu, který má aspoň tři odlišné body. Instance Mnohoúhelníku může být také prázdná.
Vnější a vnitřní kroužky Polygonu definují hranici. Prostor uvnitř prstenců definuje vnitřní prostor Polygonu.
Následující obrázek ukazuje příklady instancí Mnohoúhelníku .
Jak je znázorněno na obrázku:
Obrázek 1 je polygonová instance, jejíž hranice je definována vnějším kroužkem.
Obrázek 2 je polygonová instance, jejíž hranice je definována vnějším kroužkem a dvěma vnitřními kroužky. Oblast uvnitř vnitřních kroužků je součástí vnějšího objektu Polygon instance.
Obrázek 3 je platná instance Polygonu, protože jeho vnitřní kružnice se protínají v jednom tečném bodě.
Akceptované instance
Akceptované instance Mnohoúhelníku jsou instance, které lze uložit v geometrii nebo geografické proměnné bez vyvolání výjimky. Následující jsou akceptované instance Mnohoúhelníku :
- Prázdná instance mnohoúhelníku
- Polygon instance, která má přijatelný vnější prstenec (LineString) a nulu nebo více přijatelných vnitřních kružnic (LineStrings)
Aby byl okruh (LineString) přijatelný, jsou potřeba následující kritéria.
- Instance LineString musí být přijata.
- Instance LineString musí mít alespoň čtyři body.
- Počáteční a koncové body instance LineString musí být stejné.
Následující příklad ukazuje akceptované instance Polygonu .
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))';
Jako @g4 a @g5 ukazují, přijatá instance Mnohoúhelníku nemusí být platná instance Mnohoúhelníku.
@g5 také ukazuje, že instance Polygonu musí obsahovat pouze prstenec s libovolnými čtyřmi body, které mají být přijaty.
Následující příklady vyvolají System.FormatException, protože instance Polygon nejsou přijaty.
DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';
@g1 není přijata, protože instance LineString pro vnější kroužek neobsahuje dostatek bodů.
@g2 není přijata, protože výchozí bod vnějšího kruhu LineString instance není stejný jako koncový bod. Následující příklad má přijatelný vnější kroužek, ale vnitřní kroužek není přijatelný. To také vyvolá System.FormatException.
DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';
Platné instance
Vnitřní kroužky Mnohoúhelníku se mohou dotýkat sebe navzájem v jednom bodě dotyku, ale pokud se vnitřní kroužky Mnohoúhelníku kříží, instance není platná.
Následující příklad ukazuje platné instance Polygonu .
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 je platný, protože dva vnitřní kroužky se dotýkají v jediném bodě a neprotínají se navzájem. Následující příklad ukazuje Polygon instance, které nejsou platné.
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 není platný, protože vnitřní kroužek se dotkne vnějšího kroužku na dvou místech.
@g2 není platný, protože druhý vnitřní kroužek se nachází uvnitř vnitřku prvního vnitřního kroužku.
@g3 není platný, protože dva vnitřní kroužky se dotýkají ve více po sobě následujících bodech.
@g4 není platný, protože vnitřní prostory dvou vnitřních kroužků se překrývají.
@g5 není platný, protože vnější kroužek není prvním kroužkem.
@g6 není platný, protože kružnice nemá alespoň tři odlišné body.
Orientace prostorových dat
Orientace prstence mnohoúhelníku není důležitým faktorem v planárním systému. jednoduché funkce OGC pro specifikaci SQL nediktují pořadí prstenců a SQL Server nevynucuje pořadí prstenců.
V elipsoidálním systému nemá mnohoúhelník bez orientace žádný význam nebo je nejednoznačný. Popisuje například prsten kolem rovníku severní nebo jižní polokouli? Pokud k uložení prostorové instance použijeme zeměpisný typ, musíme určit orientaci okruhu a přesně popsat umístění instance.
Vnitřní část mnohoúhelníku v elipsoidovém systému je definována „pravidlem levé ruky“: jestliže si představíte, že jdete po okruhu zeměpisného mnohoúhelníku a následujete body podle pořadí, oblast vlevo je považována za vnitřní část mnohoúhelníku a oblast vpravo za jeho vnější část.
Proti směru hodinových ručiček
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;
Ve směru hodinových ručiček
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;
Pokud je úroveň kompatibility v SQL Serveru 100 nebo nižší, má zeměpisný datový typ následující omezení:
Každá geografická instance se musí vejít do jedné polokoule. Nesmí být uloženy žádné prostorové objekty větší než polokoule.
Jakákoli geografická instance z Open Geospatial Consortium (OGC) Well-Known Text (WKT) nebo Well-Known Binary (WKB) reprezentace, která vytvoří objekt větší než polokoule, vyvolá ArgumentException.
Metody zeměpisného datového typu, které vyžadují vstup dvou zeměpisných instancí (například
STIntersection(),STUnion(),STDifference()aSTSymDifference()) vrátí hodnotu null, pokud se výsledky z metod nevejdou do jedné polokoule.STBuffer()vrátí také hodnotu null, pokud výstup překročí jednu polokouli.
Orientaci lze obrátit pomocí rozšířené metody ReorientObject (zeměpisný datový typ).
Examples
Příklad A.
Následující příklad vytvoří jednoduchou geometry Polygon instanci s mezerou a 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);
Příklad B.
Instanci, která není platná, lze zadat a převést na platnou geometry instanci. V následujícím příkladu Polygonse vnitřní a vnější kroužky překrývají a instance není platná.
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))'
);
Příklad C.
V následujícím příkladu je neplatná instance platná s MakeValid().
SET @g = @g.MakeValid();
SELECT @g.ToString();
Instance vrácená geometry z předchozího příkladu je 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)))
Příklad D.
Toto je další příklad převodu neplatné instance na platnou instanci geometrie. V následujícím příkladu Polygon byla instance vytvořena pomocí tří bodů, které jsou úplně stejné:
DECLARE @g geometry
SET @g = geometry::Parse('POLYGON((1 3, 1 3, 1 3, 1 3))');
SET @g = @g.MakeValid();
SELECT @g.ToString()
Instance geometrie vrácená dříve je Point(1 3). Pokud je daná hodnota Polygon, pak POLYGON((1 3, 1 5, 1 3, 1 3)) vrátí MakeValid().
Související obsah
- STArea (datový typ geometrie)
- STExteriorRing (datový typ geometrie)
- STNumInteriorRing (datový typ geometrie)
- STInteriorRingN (datový typ geometrie)
- STCentroid (datový typ geometrie)
- STPointOnSurface (datový typ geometrie)
- MultiPolygon
- Prostorová data
- StIsValid (zeměpisný datový typ)
- STIsValid (datový typ geometrie)