Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Magazyn w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric
Wielokąt to dwuwymiarowa powierzchnia przechowywana jako sekwencja punktów definiująca zewnętrzny pierścień granic i zero lub więcej pierścieni wewnętrznych.
Wystąpienia wielokątne
Instancję Polygona można utworzyć z pierścienia, który ma co najmniej trzy różne punkty. Wystąpienie Polygon może być również puste.
Zewnętrzne i wewnętrzne pierścienie wielokąta definiują jego granicę. Przestrzeń w pierścieniach definiuje wnętrze wielokąta.
Na poniższej ilustracji przedstawiono przykłady wystąpień Polygon.
Jak pokazano na ilustracji:
Rysunek 1 to obiekt wielokąt, którego granica jest zdefiniowana przez pierścień zewnętrzny.
Rysunek 2 to wystąpienie wielokąta , którego granica jest zdefiniowana przez pierścień zewnętrzny i dwa pierścienie wewnętrzne. Obszar wewnątrz pierścieni wewnętrznych jest częścią zewnętrznej części wystąpienia Polygon .
Rysunek 3 jest prawidłowym wystąpieniem wielokąta , ponieważ jego pierścienie wewnętrzne przecinają się w jednym punkcie tangensowym.
Zaakceptowane wystąpienia
Zaakceptowane wystąpienia wielokąta to wystąpienia, które mogą być przechowywane w zmiennej geometrycznej lub geograficznej bez zgłaszania wyjątku. Akceptowane są następujące wystąpienia Polygon:
- Pusta instancja wielokąta
- Instancja Polygon, która ma akceptowalny pierścień zewnętrzny (LineString) i zero lub więcej akceptowalnych pierścieni wewnętrznych (LineStrings)
Aby pierścień (LineString) był akceptowalny, potrzebne są następujące kryteria.
- Wystąpienie LineString musi zostać zaakceptowane .
- Wystąpienie LineString musi mieć co najmniej cztery punkty.
- Początkowe i końcowe punkty wystąpienia LineString muszą być takie same.
W poniższym przykładzie przedstawiono zaakceptowane wystąpienia Polygon.
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))';
Jak pokazano w @g4 i @g5, zaakceptowana instancja wielokąta może nie być prawidłową instancją wielokąta.
@g5 Pokazuje również, że instancja wielokąta musi zawierać co najmniej jeden pierścień z dowolnymi czterema punktami, aby zostać zaakceptowana.
Poniższe przykłady zgłaszają wyjątek System.FormatException , ponieważ wystąpienia wielokąta nie są akceptowane.
DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';
@g1 nie jest akceptowane, ponieważ wystąpienie LineString dla pierścienia zewnętrznego nie zawiera wystarczającej liczby punktów.
@g2 nie jest akceptowane, ponieważ punkt początkowy wystąpienia linestring pierścienia zewnętrznego nie jest taki sam jak punkt końcowy. Poniższy przykład ma akceptowalny pierścień zewnętrzny, ale pierścień wewnętrzny nie jest akceptowalny. Spowoduje to również zgłoszenie System.FormatException.
DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';
Prawidłowe wystąpienia
Wewnętrzne pierścienie wielokąta mogą dotykać siebie i nawzajem w pojedynczych punktach stycznych, ale jeśli wewnętrzne pierścienie wielokąta przecinają się, wystąpienie nie jest prawidłowe.
W poniższym przykładzie przedstawiono prawidłowe wystąpienia Wielokąta.
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 jest prawidłowy, ponieważ dwa pierścienie wewnętrzne dotykają jednego punktu i nie przecinają się nawzajem. W poniższym przykładzie pokazano Polygon wystąpienia, które nie są prawidłowe.
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 nie jest prawidłowa, ponieważ pierścień wewnętrzny dotyka pierścienia zewnętrznego w dwóch miejscach.
@g2 nie jest prawidłowy, ponieważ drugi pierścień wewnętrzny znajduje się we wnętrzu pierwszego pierścienia wewnętrznego.
@g3 nie jest prawidłowy, ponieważ dwa wewnętrzne pierścienie dotykają się w wielu kolejnych punktach.
@g4 nie jest prawidłowa, ponieważ wnętrza dwóch pierścieni wewnętrznych nakładają się na siebie.
@g5 jest nieprawidłowy, ponieważ pierścień zewnętrzny nie jest pierwszym pierścieniem.
@g6 nie jest prawidłowy, ponieważ okrąg nie ma co najmniej trzech odrębnych punktów.
Orientacja danych przestrzennych
Orientacja pierścienia wielokąta nie jest ważnym czynnikiem w układzie planarnym. OGC Simple Features for SQL Specification nie wymusza kolejności pierścienia, a program SQL Server nie wymusza porządkowania pierścienia.
W systemie elipsoidalnym wielokąt bez orientacji nie ma znaczenia lub jest niejednoznaczny. Czy na przykład pierścień wokół równika opisuje półkulę północną lub południową? Jeśli używamy typu danych do przechowywania wystąpienia przestrzennego, musimy określić orientację pierścienia i precyzyjnie opisać lokalizację tego wystąpienia.
Wnętrze wielokąta w układzie elipsoidalnym jest definiowane przez "zasadę lewej ręki": jeśli wyobrazisz, że idziesz wzdłuż pierścienia wielokąta geograficznego, podążając za punktami w wymienionej kolejności, obszar po lewej stronie jest traktowany jako wnętrze wielokąta, a obszar po prawej stronie jako zewnętrzna część wielokąta.
Przeciwnie do ruchu wskazówek zegara
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;
Zgodnie z ruchem wskazówek zegara
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;
Jeśli poziom zgodności wynosi 100 lub niższy w programie SQL Server, typ danych geograficznych ma następujące ograniczenia:
Każda instancja geografii musi mieścić się wewnątrz jednej półkuli. Nie można przechowywać obiektów przestrzennych większych niż półkula.
Dowolne wystąpienia geografii z reprezentacji Open Geospatial Consortium (OGC) Well-Known Text (WKT) lub Well-Known Binary (WKB), które generują obiekt większy niż półkula, zgłaszają wyjątek ArgumentException.
Metody typu danych geograficznych, które wymagają danych wejściowych dwóch wystąpień geograficznych (takich jak
STIntersection(),STUnion(),STDifference()iSTSymDifference()), zwrócą null, jeśli wyniki z metod nie mieszczą się wewnątrz jednej półkuli.STBuffer()również zwróci wartość null, jeśli dane wyjściowe przekraczają jedną półkulę.
Orientacja może być odwrócona przy użyciu rozszerzonej metody ReorientObject (geography Data Type).
Examples
Przykład A.
Poniższy przykład tworzy proste geometry Polygon wystąpienie z luką i 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);
Przykład B.
Nieprawidłowe wystąpienie można wprowadzić i przekonwertować na prawidłowe geometry wystąpienie. W poniższym przykładzie Polygonpierścienie wewnętrzne i zewnętrzne nakładają się na siebie, a wystąpienie nie jest prawidłowe.
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))'
);
Przykład C.
W poniższym przykładzie nieprawidłowe wystąpienie zostaje naprawione przy użyciu MakeValid().
SET @g = @g.MakeValid();
SELECT @g.ToString();
Wystąpienie geometry zwrócone z poprzedniego przykładu to 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)))
Przykład D.
Jest to kolejny przykład konwertowania nieprawidłowego wystąpienia na prawidłowe wystąpienie geometryczne. W poniższym przykładzie instancja Polygon została utworzona przy użyciu trzech punktów, które są dokładnie takie same.
DECLARE @g geometry
SET @g = geometry::Parse('POLYGON((1 3, 1 3, 1 3, 1 3))');
SET @g = @g.MakeValid();
SELECT @g.ToString()
Zwrócone wcześniej wystąpienie geometrii to Point(1 3). Jeśli Polygon jest POLYGON((1 3, 1 5, 1 3, 1 3)), to MakeValid() zwróci LINESTRING(1 3, 1 5).
Treści powiązane
- STArea (typ danych geometry)
- STExteriorRing (typ danych geometrycznych)
- STNumInteriorRing (typ danych geometry)
- STInteriorRingN (geometryczny typ danych)
- STCentroid (geometria typu danych)
- STPointOnSurface (typ danych geometryczny)
- MultiPolygon
- Dane przestrzenne
- STIsValid (typ danych geograficznych)
- STIsValid (typ danych geometrycznych)