Übersicht über räumliche Datentypen
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank in Microsoft Fabric SQL in Microsoft Fabric
Es gibt zwei Typen von räumlichen Daten. Der geometry -Datentyp unterstützt planare bzw. euklidische Daten (flache Erdabbildung). Der geometry-Datentyp entspricht der Version 1.1.0. der Simple Features for SQL-Spezifikation des Open Geospatial Consortium (OGC) und ist auch mit SQL MM (ISO-Standard) kompatibel.
Zudem unterstützt SQL Server den geography-Datentyp, der ellipsenförmige Daten speichert (runde Erdabbildung), z. B. GPS-Breiten- und -Längenkoordinaten.
Tipp
Räumliche SQL Server-Tools sind eine von Microsoft gesponserte Open-Source-Sammlung von Tools für die Verwendung mit den räumlichen Typen in SQL Server. Dieses Projekt bietet eine Reihe von wiederverwendbaren Funktionen, die von Anwendungen genutzt werden können. Diese Funktionen können Datenkonvertierungsroutinen, neue Transformationen, Aggregate usw. umfassen. Weitere Details finden Sie unter Microsoft/SQLServerSpatialTools in GitHub.
Räumliche Datenobjekte
Der geometry-Datentyp und der geography-Datentyp unterstützen 16 räumliche Datenobjekte bzw. Instanztypen. Nur elf dieser Instanztypen sind jedoch instanziierbar. Sie können diese Instanzen erstellen und Sie in einer Datenbank bearbeiten (oder instanziieren). Diese Instanzen leiten bestimmte Eigenschaften von ihren übergeordneten Datentypen ab.
Die folgende Abbildung zeigt die Geometriehierarchie, auf der die Geometrie - und Geografiedatentypen basieren. Die instanziierbaren Typen von geometry und geography sind in Blau dargestellt.
Es gibt einen zusätzlichen instanziierbaren Typ für den Geografischen Datentyp: FullGlobe. Die Typen geometry und geography können eine spezifische Instanz erkennen, wenn es sich um eine wohlgeformte Instanz handelt. Dies gilt auch, wenn die Instanz nicht explizit definiert ist. Wenn Sie beispielsweise eine Point-Instanz explizit mithilfe der STPointFromText()
Methode definieren, erkennen Geometrie und Geografie die Instanz als Punkt, solange die Methodeneingabe wohlgeformt ist. Wenn Sie die gleiche Instanz mit der STGeomFromText()
-Methode definieren, erkennen sowohl der geometry - als auch der geography -Datentyp die Instanz als Point.
Die Untertypen für geometry- und geography-Typen sind in einfache Typen und Auflistungstypen unterteilt. Einige Methoden wie STNumCurves()
funktionieren nur mit einfachen Typen.
Einfache Typen sind:
Auflistungstypen sind:
Unterschiede zwischen geometry- und geography-Datentypen
Die beiden räumlichen Datentypen verhalten sich oft ähnlich. Es gibt einige wichtige Unterschiede in der Art und Weise, wie die Daten gespeichert und bearbeitet werden.
Definieren von verbindenden Rändern
Die definierenden Daten für die Typen LineString und Polygon sind nur Scheitelpunkte. Der verbindende Rand zwischen zwei Scheitelpunkten in einer Geometrie ist eine gerade Linie. Die verbindende Kante zwischen zwei Scheitelpunkten in einem Geografietyp ist ein kurzer elliptischer Bogen zwischen den beiden Scheitelpunkten. Eine Ellipse ist die Schnittmenge des Ellipsoids mit einer Ebene durch seinen Mittelpunkt. Ein elliptischer Bogen ist ein Bogensegment auf der großen Ellipse.
Definieren von Kreisbogensegmenten
Kreisbogensegmente für geometry-Typen werden in der kartesischen XY-Koordinatenebene definiert (Z-Werte werden ignoriert). Kreisbogensegmente für geography-Typen werden von Kurvenabschnitten auf einer Verweiskugel definiert. Jede Parallele auf der Verweiskugel kann von zwei komplementären Kreisbögen definiert werden, wobei die Punkte für beide Bögen einen konstanten Breitenwinkel haben.
Maße in räumlichen Datentypen
Im planaren bzw. euklidischen System werden Maße von Entfernungen und Flächen in der gleichen Maßeinheit angegeben wie die Koordinaten. Bei Verwendung des geometry-Datentyps beträgt die Entfernung zwischen (2, 2) und (5, 6) ungeachtet der verwendeten Maßeinheit fünf Einheiten.
Im ellipsenförmigen System werden Koordinaten in Breiten- und Längengraden angegeben. Längen und Flächen werden jedoch in der Regel in Metern und Quadratmetern gemessen, obwohl die Messung möglicherweise vom Räumlichen Bezugsbezeichner der geografischen Instanz abhängt. Die gängigste Maßeinheit für den geography -Datentyp ist Meter.
Ausrichtung von räumlichen Daten
Im planaren System ist die Ringausrichtung eines Polygons kein wichtiger Faktor. Die OGC Simple Features for SQL-Spezifikation schreibt keine Ringreihenfolge vor, und SQL Server erzwingt keine Ringreihenfolge.
In einem ellipsenförmigen System hat ein Polygon ohne Ausrichtung keine Bedeutung bzw. ist mehrdeutig. Beschreibt beispielsweise ein Ring um den Äquator die nördliche oder die südliche Hemisphäre? Wenn wir den geography -Datentyp zum Speichern von räumlichen Daten verwenden, müssen wir die Ausrichtung des Rings angeben und die Position der Instanz genau beschreiben.
Das Innere des Polygons in einem ellipsoidischen System wird über die „Linksregel“ definiert: Wenn Sie sich vorstellen, dass Sie auf dem Ring eines geography-Polygons die Punkte in der Reihenfolge ablaufen, in der sie aufgeführt sind, wird der Bereich links als das Innere des Polygons und der Bereich rechts als das Äußere des Polygons behandelt.
Wenn der Kompatibilitätsgrad in SQL Server 100 oder niedriger ist, weist der Geografie-Datentyp die folgenden Einschränkungen auf:
Jede geography -Instanz muss in genau eine Hemisphäre passen. Es können keine räumlichen Objekte gespeichert werden, die größer als eine Hemisphäre sind.
Jede geography -Instanz aus einer OGC-Darstellung (Open Geospatial Consortium) des Typs „Well-Known Text (WKT)“ oder „Well-Known Binary (WKB), die ein Objekt ergibt, das größer als eine Hemisphäre ist, führt zu einer Ausnahme des Typs ArgumentException“.
Die Methoden des geografischen Datentyps, die die Eingabe von zwei geografischen Instanzen erfordern, z
STIntersection()
. B. ,STUnion()
,STDifference()
undSTSymDifference()
, geben NULL zurück, wenn die Ergebnisse aus den Methoden nicht in eine einzelne Hemisphäre passen.STBuffer()
gibt auch NULL zurück, wenn die Ausgabe eine einzelne Hemisphäre überschreitet.
In SQL Server ist FullGlobe ein spezieller Polygontyp, der den gesamten Globus abdeckt. Es verfügt über einen Bereich, aber nicht über Rahmen oder Scheitelpunkte.
Äußere und innere Ringe beim geography
-Datentyp
In der Simple Features for SQL-Spezifikation des OGC werden äußere und innere Ringe erörtert. Diese Unterscheidung ist für den SQL Server-Datentyp Geographie allerdings nicht sinnvoll: Jederv Ring eines Polygons kann als äußerer Ring interpretiert werden.
Weitere Informationen zu den OGC-Spezifikationen finden Sie in den folgenden Dokumenten:
- OGC Specifications, Simple Feature Access Part 1 - Common Architecture
- OGC Specifications, Simple Feature Access Part 2: SQL Options (OGC-Spezifikationen, Simple Feature Access, Teil 2: SQL-Optionen)
Kreisbogensegmente
Drei instanziierbare Typen können Kreisbogensegmente verwenden: CircularString, CompoundCurveund CurvePolygon. Ein Kreisbogensegment wird von drei Punkten in einer zweidimensionalen Ebene definiert, und der dritte Punkt darf nicht mit dem ersten Punkt identisch sein. Einige Beispiele für Kreisbogensegmente:
Die ersten beiden Beispiele sind typische Kreisbogensegmente. Beachten Sie, dass jeder der drei Punkte auf dem Umkreis eines Kreises liegt.
Die anderen beiden Beispiele zeigen, wie ein Liniensegment als Kreisbogensegment definiert werden kann. Im Gegensatz zu einem regulären Liniensegment, das mit nur zwei Punkten definiert werden kann, sind dennoch drei Punkte erforderlich, um das Kreisbogensegment zu definieren.
Methoden, die mit Kreisbogensegmenten arbeiten, verwenden geradlinige Segmente, um den Kreisbogen zu approximieren. Die Anzahl der Liniensegmente, die zur Annäherung an den Kreisbogen verwendet werden, hängt von der Länge und der Krümmung des Kreisbogens ab. Z-Werte können für jeden der Kreisbogensegmenttypen gespeichert werden, werden aber nicht in den Berechnungen verwendet.
Hinweis
Wenn Z-Werte für Kreisbogensegmente angegeben werden, müssen diese für alle Punkte in dem Kreisbogensegment gleich sein, damit sie als Eingabe akzeptiert werden. Beispielsweise ist CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1)
zulässig, CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1)
jedoch nicht.
LineStr- und CircularString-Vergleich
In diesem Beispiel wird gezeigt, wie die identischen gleichschenkligen Dreiecke mit einer LineString-Instanz und einer CircularString-Instanz gespeichert werden:
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
Eine CircularString-Instanz erfordert sieben Punkte, um das Dreieck zu definieren. Eine LineString-Instanz erfordert nur vier Punkte, um das Dreieck zu definieren. Der Grund hierfür ist, dass eine CircularString -Instanz Kreisbogensegmente und keine Liniensegmente speichert. Die Seiten des Dreiecks, die in der CircularString-Instanz gespeichert sind, sind ABC, CDE und EFA. Die Seiten des Dreiecks, die in der LineString-Instanz gespeichert sind, sind AC, CE und EA.
Betrachten Sie das folgende Beispiel:
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];
Hier sehen Sie das Ergebnis.
LS Length CS Length
5.65685... 6.28318...
CircularString-Instanzen verwenden weniger Punkte, um Kurvenbegrenzungen mit größerer Genauigkeit zu speichern, als LineString-Instanzen. CircularString-Instanzen sind hilfreich für das Speichern von Kreisbegrenzungen, z. B. ein Suchradius von zwanzig Meilen von einem bestimmten Punkt aus. LineString -Instanzen eignen sich für das Speichern von linearen Grenzen, z. B. ein Häuserblock.
LineStr- und CompoundCurve-Vergleich
In den folgenden Codebeispielen ist dargestellt, wie die gleiche Abbildung mit LineString - und CompoundCurve -Instanzen gespeichert wird:
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))');
In den vorherigen Beispielen könnte entweder eine LineString-Instanz oder eine CompoundCurve-Instanz die Abbildung speichern. Im nächsten Beispiel wird ein Kreisslice mithilfe eines CompoundCurve gespeichert:
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(2 2, 1 3, 0 2),(0 2, 1 0, 2 2))');
Eine CompoundCurve-Instanz kann das Kreisbogensegment (2 2, 1 3, 0 2) direkt speichern, aber eine LineString-Instanz müsste die Kurve in mehrere kleinere Liniensegmente konvertieren.
CircularStr- und CompoundCurve-Vergleich
Im folgenden Codebeispiel wird gezeigt, wie der Kreisslice in einer CircularString -Instanz gespeichert werden kann:
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();
Zum Speichern des Kreissegments mit einer CircularString-Instanz müssen drei Punkte für jedes Liniensegment verwendet werden. Wenn ein Zwischenpunkt nicht bekannt ist, muss er entweder berechnet werden, oder der Endpunkt des Liniensegments muss verdoppelt werden, wie im folgenden Codeausschnitt dargestellt:
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');
InCompoundCurve -Instanzen sind sowohl LineString - als auch CircularString -Komponenten zulässig, sodass nur zwei Punkte der Liniensegmente des Kreisslices bekannt sein müssen. In diesem Codebeispiel wird gezeigt, wie ein CompoundCurve verwendet wird, um die gleiche Abbildung zu speichern:
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();
Vergleich von Polygon und CurvePolygon
CurvePolygon -Instanzen können beim Definieren ihrer äußeren und inneren Ringe CircularString - und CompoundCurve -Instanzen verwenden. Polygon-Instanzen können dies nicht.
Begrenzungen
In der SQL-Datenbank in Microsoft Fabric werden Geografie- und Geometriedatentypen unterstützt, können jedoch nicht auf die Fabric OneLake gespiegelt werden.