Udostępnij za pośrednictwem


Omówienie typów danych przestrzennych

Dotyczy:SQL ServerAzure SQL DatabaseSQL analityczny punkt końcowy w Microsoft FabricAzure SQL Managed InstanceMagazyn danych w Microsoft FabricSQL Database w Microsoft Fabric

Istnieją dwa typy danych przestrzennych. Typ danych obsługuje geometrie planarne lub euklidesowe (płaska Ziemia) dane. Geometria typ danych jest zgodna z Open Geospatial Consortium (OGC) Simple Features for SQL Specification w wersji 1.1.0 i standardem SQL MM (ISO).

Program SQL Server obsługuje również geograficzny typ danych, który przechowuje dane wielokropka (okrągłe ziemie), takie jak współrzędne szerokości geograficznej i długości geograficznej GPS.

Napiwek

Narzędzia przestrzenne programu SQL Server to sponsorowana przez firmę Microsoft kolekcja narzędzi typu open source do użycia z typami przestrzennymi w programie SQL Server. Ten projekt udostępnia zestaw funkcji wielokrotnego użytku, z których mogą korzystać aplikacje. Te funkcje mogą obejmować procedury konwersji danych, nowe przekształcenia, agregacje itp. Aby uzyskać więcej informacji, zobacz Microsoft/SQLServerSpatialTools w usłudze GitHub.

Obiekty danych przestrzennych

Typy danych geometrii i geografii obsługują 16 typów obiektów danych przestrzennych lub typów wystąpień. Jednak tylko 11 z tych typów wystąpień jest wystąpieniami; Możesz tworzyć wystąpienia i pracować z nimi w bazie danych. Te wystąpienia przejmują niektóre właściwości z nadrzędnych typów danych.

Na poniższej ilustracji przedstawiono hierarchię geometrii, na której są oparte typy danych geometrii i geografii. Typy instancjonowalne geometrii i geografii są oznaczone na niebiesko.

Diagram hierarchii typów Geometry.

Istnieje dodatkowy typ inicjowalny dla danych typu geograficznego : FullGlobe. Geometria i typów geograficznych może rozpoznać określone wystąpienie, o ile jest to dobrze sformułowane wystąpienie, nawet jeśli wystąpienie nie jest jawnie zdefiniowane. Jeśli na przykład jawnie zdefiniujesz wystąpienie przy użyciu metody STPointFromText(), geometrii i geografii rozpoznają wystąpienie jako Point, pod warunkiem, że dane wejściowe metody są prawidłowo sformułowane. Jeśli zdefiniujesz to samo wystąpienie przy użyciu metody STGeomFromText(), zarówno geometria , jak i geograficzne typy danych rozpoznają wystąpienie jako Punkt.

Podtypy typów geometrii i geografii są podzielone na proste i typy kolekcji. Niektóre metody, takie jak STNumCurves() działają tylko z prostymi typami.

Proste typy to:

Typy kolekcji to:

Różnice w typach danych geometrii i geografii

Dwa typy danych przestrzennych często zachowują się podobnie. Istnieją pewne kluczowe różnice w sposobie przechowywania i manipulowania danymi.

Jak zdefiniowano łączenie krawędzi

Definiujące dane LineString i typy wielokątnych są tylko wierzchołkami. Krawędź łącząca między dwoma wierzchołkami w typie geometrycznym jest linią prostą. Jednak krawędź łącząca dwa wierzchołki w typie geograficznym jest krótkim łukiem wielkim eliptycznym między tymi wierzchołkami. Wielka elipsa jest przecięciem elipsoidy z płaszczyzną przechodzącą przez jej środek. Wielki łuk eliptyczny jest segmentem łuku na wielkiej elipsie.

Sposób definiowania segmentów łuku cyklicznego

Segmenty łuku cyklicznego dla typów geometrycznych są definiowane na płaszczyźnie współrzędnej kartezjańskiej XY (wartości Z są ignorowane). Segmenty łuku cyklicznego dla typów geograficznych są definiowane przez segmenty krzywej na sferze referencyjnej. Każdy równoległy na sferze referencyjnej można zdefiniować za pomocą dwóch uzupełniających łuków okrągłych, w których punkty dla obu łuków mają stały kąt szerokości geograficznej.

Pomiary w typach danych przestrzennych

W systemie planarnym (płaskoziem) pomiary odległości i obszarów są podane w tej samej jednostce pomiaru co współrzędne. Używając typu danych geometrii, odległość między (2, 2) a (5, 6) wynosi pięć jednostek, niezależnie od wybranych jednostek miary.

W układzie elipsoidalnym lub okrągłej Ziemi współrzędne są podawane w stopniach szerokości geograficznej i długości geograficznej. Jednak długości i obszary są zwykle mierzone w metrach i metrach kwadratowych, choć pomiar może zależeć od identyfikatora referencyjnego przestrzennego wystąpienia geograficznego. Najczęstszą jednostką miary w przypadku danych typu geografia są metry.

Orientacja danych przestrzennych

Orientacja pierścieniowa 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.

Jeśli w programie SQL Server poziom zgodności wynosi 100 lub mniej, typ danych geografia 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.

  • Każde wystąpienie geografii z Open Geospatial Consortium (OGC) Well-Known Text (WKT) lub Well-Known reprezentacja binarna (WKB), które generuje obiekt większy niż półkula, zgłasza wyjątek ArgumentException.

  • Metody typu danych geografia, które wymagają danych wejściowych dwóch instancji geograficznych , takich jak STIntersection(), STUnion(), STDifference()i STSymDifference(), zwrócą wartość 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ę.

W programie SQL Server FullGlobe jest specjalnym typem polygonu, który obejmuje cały świat. Ma obszar, ale nie ma obramowań ani wierzchołków.

Zewnętrzne i wewnętrzne pierścienie w typie danych geography

W OGC Simple Features for SQL Specification omówiono pierścienie zewnętrzne i pierścienie wewnętrzne, ale to rozróżnienie ma niewielkie znaczenie dla programu SQL Server lokalizacji geograficznej typu danych; każdy pierścień wielokąta może być pierścieniem zewnętrznym.

Aby uzyskać więcej informacji na temat specyfikacji OGC, zobacz następujące dokumenty:

Segmenty łuku cyklicznego

Trzy typy instancjalne mogą przyjmować segmenty łuku okręgu: CircularString, CompoundCurvei CurvePolygon. Segment łuku cyklicznego jest definiowany przez trzy punkty w płaszczyźnie dwuwymiarowej, a trzeci punkt nie może być taki sam jak pierwszy punkt. Kilka przykładów segmentów łuku cyklicznego:

Diagram segmentów łuku okręgu, które mogą być reprezentowane w typach przestrzennych silnika bazodanowego SQL.

Pierwsze dwa przykłady pokazują typowe segmenty łuku cyklicznego. Zwróć uwagę, że każdy z trzech punktów znajduje się na obwodzie okręgu.

W pozostałych dwóch przykładach pokazano, jak segment liniowy można zdefiniować jako segment łuku cyklicznego. Trzy punkty są nadal potrzebne do zdefiniowania segmentu łuku cyklicznego w przeciwieństwie do zwykłego segmentu linii, który można zdefiniować za pomocą zaledwie dwóch punktów.

Metody działające na typach segmentów łuku cyklicznego używają segmentów liniowych, aby przybliżyć łuk okrągły. Liczba segmentów linii używanych do przybliżenia łuku zależy od długości i krzywizny łuku. Wartości Z mogą być przechowywane dla każdego z typów segmentów łuku cyklicznego, ale nie będą używane w obliczeniach.

Notatka

Jeśli wartości Z są podane dla segmentów łuku cyklicznego, muszą być takie same dla wszystkich punktów w segmencie łuku cyklicznego, aby można je było zaakceptować dla danych wejściowych. Na przykład: CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) jest akceptowana, ale CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) nie jest akceptowana.

Porównanie obiektów LineStr i CircularString

W tym przykładzie pokazano, jak przechowywać identyczne trójkąty równoramienne przy użyciu wystąpienia LineString i wystąpienia CircularString.

DECLARE @g1 geometry;
DECLARE @g2 geometry;
SET @g1 = geometry::STGeomFromText('LINESTRING(1 1, 5 1, 3 5, 1 1)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(1 1, 3 1, 5 1, 4 3, 3 5, 2 3, 1 1)', 0);
IF @g1.STIsValid() = 1 AND @g2.STIsValid() = 1
  BEGIN
      SELECT @g1.ToString(), @g2.ToString()
      SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]
  END

Wystąpienie CircularString wymaga siedmiu punktów do zdefiniowania trójkąta. wystąpienie LineString wymaga tylko trzech punktów do zdefiniowania trójkąta. Powodem jest to, że wystąpienie CircularString przechowuje segmenty łuku cyklicznego, a nie segmenty liniowe. Boki trójkąta przechowywane w wystąpieniu CircularString to ABC, CDE i EFA. Boki trójkąta przechowywane w wystąpieniu LineString to AC, CE i EA.

Rozważmy następujący przykład:

SET @g1 = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 4 0)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(0 0, 2 2, 4 0)', 0);
SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length];

Oto zestaw wyników.

LS Length    CS Length
5.65685...   6.28318...

Wystąpienia CircularString używają mniejszej liczby punktów do przechowywania granic krzywej z większą dokładnością niż wystąpienia LineString. Obiekty CircularString są przydatne do przechowywania granic okrągłych, takich jak promień wyszukiwania o długości 20 mil z określonego punktu. wystąpienia LineString są dobre do przechowywania granic obszarów, które są liniowe, jak kwadratowy blok miejski.

Porównanie LineStr i CompoundCurve

W poniższych przykładach kodu pokazano, jak przechowywać tę samą figurę przy użyciu wystąpień LineString i CompoundCurve:

SET @g = geometry::Parse('LINESTRING(2 2, 4 2, 4 4, 2 4, 2 2)');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2), (4 2, 4 4), (4 4, 2 4), (2 4, 2 2))');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2, 4 4, 2 4, 2 2))');

W poprzednich przykładach wystąpienie LineString lub wystąpienie CompoundCurve mogło przechowywać rysunek. W następnym przykładzie użyto CompoundCurve do przechowywania wycinka kołowego:

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

Wystąpienie CompoundCurve może bezpośrednio przechowywać segment łuku kołowego (2 2, 1 3, 0 2), ale wystąpienie LineString musi przekonwertować krzywą na kilka mniejszych segmentów linii.

Porównanie circularStr i CompoundCurve

Poniższy przykład kodu przedstawia sposób przechowywania wycinka kołowego w wystąpieniu CircularString.

DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)');
SELECT @g.ToString(), @g.STLength();

Przechowywanie wycinka kołowego przy użyciu wystąpienia CircularString wymaga użycia trzech punktów dla każdego odcinka linii. Jeśli punkt pośredni nie jest znany, musi zostać obliczony lub punkt końcowy segmentu wiersza musi zostać podwojony, jak pokazano w poniższym fragmencie kodu:

SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');

Wystąpienia CompoundCurve umożliwiają użycie zarówno komponentów LineString, jak i CircularString, tak aby do określenia segmentów linii wycinka kołowego potrzebne były tylko dwa punkty. W tym przykładzie kodu pokazano, jak używać CompoundCurve do przechowywania tego samego rysunku:

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING( 3 6.3246, 0 7, -3 6.3246), (-3 6.3246, 0 0, 3 6.3246))');
SELECT @g.ToString(), @g.STLength();

Porównanie wielokąta i krzywegopolygonu

Wystąpienia CurvePolygon mogą używać CircularString i CompoundCurve jako swoich obiektów podczas definiowania pierścieni zewnętrznych i wewnętrznych. Wystąpienia wielokątów nie mogą tego zrobić.

Ograniczenia

W usłudze SQL Database w usłudze Microsoft Fabric obsługiwane są geografii i geometrii typów danych, ale nie można ich dublować w usłudze Fabric OneLake.