Übersicht über räumliche Datentypen

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

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. SQL Server unterstützt auch den Geografischen Datentyp, der ellipsoidale Daten (Round-Earth) speichert, z. B. GPS-Breiten- und Längengradkoordinaten.

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 wiederverwendbarer Funktionen, von denen Anwendungen gebrauchen 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 nachfolgende Abbildung stellt die geometry-Hierarchie dar, auf der der geometry-Datentyp und der geography-Datentyp basieren. Die instanziierbaren Typen von geometry und geography sind in Blau dargestellt.

geom_hierarchy

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 mit der Methode STPointFromText() definieren, erkennen geometry und geography die Instanz als Point, sofern 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 in der Regel in Meter und Quadratmeter gemessen. Die Maßeinheit kann jedoch von den SRID (Spatial Reference Identifiers) der geography-Instanz abhängen. 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 einfachen OGC-Features für die SQL-Spezifikation diktieren keine Ringbestellung, und SQL Server erzwingt keine Ringbestellung.

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 die Kompatibilitätsstufe 100 oder darunter in SQL Server liegt, weist der Geografiedatentyp 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 geography -Datentyps, die Eingaben von zwei geography -Instanzen wie STIntersection(), STUnion(), STDifference() und STSymDifference() erfordern, geben NULL zurück, wenn das Ergebnis der Methode nicht in eine Hemisphäre passt. STBuffer() gibt ebenfalls NULL zurück, wenn die Ausgabe eine 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 den OGC Simple Features for SQL Specification werden äußere Ringe und innere Ringe erläutert, aber dieser Unterschied ist für den SQL Server-Geografiedatentyp wenig sinnvoll. Jeder Ring eines Polygons kann als äußerer Ring verwendet werden.

Weitere Informationen zu den OGC-Spezifikationen finden Sie in den folgenden Dokumenten:

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:

circular_arc_segments

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 auf Kreisbogensegmenttypen arbeiten, verwenden gerade Liniensegmente, um den Kreisbogen anzunähern. Die Anzahl der Liniensegmente, die zum Annähen des Bogens verwendet werden, hängt von der Länge und Krümmung des Bogens ab. Z-Werte können für jeden kreisförmigen Bogensegmenttyp gespeichert werden, werden jedoch 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.

Vergleich von LineString und CircularString

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

Beachten Sie, dass eine CircularString-Instanz sieben Punkte erfordert, 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 folgenden 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 ist das Resultset.

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.

Vergleich von LineString und CompoundCurve

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 obigen Beispielen könnte die Abbildung entweder mit einer LineString -Instanz oder einer CompoundCurve -Instanz gespeichert werden. 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.

Vergleich von CircularString und CompoundCurve

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.

Siehe auch