Übersicht über räumliche Datentypen

Es gibt zwei Typen von räumlichen Daten. Der geometry-Datentyp unterstützt planare bzw. euklidische Daten. Der geometry-Datentyp entspricht der Open Geospatial Consortium (OGC) Simple Features for SQL Specification Version 1.1.0. und ist auch mit SQL MM (ISO-Standard) kompatibel.

Zudem unterstützt SQL Server den geography-Datentyp, der ellipsenförmige Daten speichert, z. B. GPS-Breiten- und Längenkoordinaten.

Wichtiger HinweisWichtig

Laden Sie für eine ausführliche Beschreibung und Beispiele der neuen räumlichen Funktionen in dieser Version (z. B. Erweiterungen der räumlichen Datentypen) das Whitepaper Neue räumliche Funktionen in SQL Server Codename "Denali" herunter.

In diesem Thema

  • Räumliche Datenobjekte

  • Unterschiede zwischen den geometry- und geography-Datentypen

  • Kreisbogensegmente

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 Datenbanken bearbeiten (oder instanziieren). Diese Instanzen leiten bestimmte Eigenschaften von ihren übergeordneten Datentypen ab, die sie als Points, LineStrings, CircularStrings, CompoundCurves, Polygons, CurvePolygons oder als mehrere Instanzen von geometry oder geography in einer GeometryCollection auszeichnen. Der Geography-Typ verfügt über einen zusätzlichen Instanztyp FullGlobe.

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.

Hierarchie des Geometrietyps

Wie aus der Abbildung hervorgeht, handelt es sich bei den zehn instanziierbaren Typen der Datentypen geometry und geography Point, MultiPoint, LineString, CircularString, MultiLineString, CompoundCurve, Polygon, CurvePolygon, MultiPolygon und GeometryCollection. Es gibt einen zusätzlichen instanziierbaren Typen für den geography-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 STPointFromText()-Methode 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-Datentyp 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.

Zu einfachen Typen gehören:

Zu Auflistungstypen gehören:

[Nach oben]

Unterschiede zwischen den geometry- und geography-Datentypen

Die beiden Typen von räumlichen Daten verhalten sich oft ganz ähnlich. Es gibt aber einige wichtige Unterschiede in Bezug darauf, wie 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 große Ellipse ist die Schnittmenge des Ellipsoids mit einer Ebene durch seinen Mittelpunkt, und ein großer 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 5 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 vom SRID 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. Beispielsweise entspricht das durch ((0, 0), (10, 0), (0, 20), (0, 0)) gegebene Polygon dem Polygon, das durch ((0, 0), (0, 20), (10, 0), (0, 0)) beschrieben wird. 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. Der Innere des Polygons in einem ellipsoidförmigen System wird von der linken Regel definiert.

Wenn der Kompatibilitätsgrad in SQL Server 2012 100 oder niedriger ist, weist der geography-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 Darstellung des Typs Open Geospatial Consortium (OGC) Well-Known Text (WKT) oder Well-Known Binary (WKB), die ein Objekt ergibt, das größer als eine Hemisphäre ist, löst eine Ausnahme des Typs ArgumentException aus.

  • Die Methoden des geography-Datentyps, die die Eingabe von zwei geography-Instanzen erfordern (z. B. STIntersection(), STUnion(), STDifference() und STSymDifference()), geben NULL zurück, wenn das Ergebnis der Methoden nicht in eine einzelne Hemisphäre passt. STBuffer() gibt auch NULL zurück, wenn die Ausgabe eine einzelne Hemisphäre überschreitet.

In SQL Server 2012 ist FullGlobe ein spezieller Polygontyp, der den gesamten Globus abdeckt. FullGlobe verfügt über einen Bereich, aber nicht über Rahmen oder Scheitelpunkte.

Äußere und innere Ringe sind beim geography-Datentyp nicht von Bedeutung

In der OGC Simple Features for SQL Specification werden äußere und innere Ringe erörtert, diese Unterscheidung ist beim geography-Datentyp von SQL Server aber nicht sinnvoll: Jeder Ring eines Polygons kann als äußerer Ring interpretiert werden.

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

[Nach oben]

Kreisbogensegmente

Drei instanziierbare Typen können Kreisbogensegmente verwenden: CircularString, CompoundCurve und CurvePolygon. Ein Kreisbogensegment wird von drei Punkten in einer zweidimensionalen Ebene definiert; der dritte Punkt darf nicht mit dem ersten Punkt identisch sein.

In Abbildung A und B sind typische Kreisbogensegmente dargestellt. Beachten Sie, dass jeder der drei Punkte auf dem Umkreis eines Kreises liegt.

In Abbildung C und D ist dargestellt, wie ein Liniensegment als Kreisbogensegment definiert werden kann. Beachten Sie, dass auch hier, im Gegensatz zu einem regulären Liniensegment, das mit nur zwei Punkten definierten werden kann, drei Punkte erforderlich sind, um das Kreisbogensegment zu definieren.

Methoden, die für Kreisbogensegmenttypen ausgeführt werden, verwenden gerade Liniensegmente zur Annäherung an den Kreisbogen. Die Anzahl von Liniensegmenten, die zur Annäherung an den Bogen verwendet wird, ist von der Länge und der Krümmung des Bogens abhängig. Für jeden Kreisbogensegmenttyp können Z-Werte können gespeichert werden, diese werden jedoch von Methoden nicht in ihren Berechnungen verwendet.

HinweisHinweis

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

Im folgenden Diagramm sind identische gleichschenklige Dreiecke dargestellt (Dreieck A verwendet Liniensegmente zur Definition des Dreiecks, Dreieck B verwendet Kreisbogensegmente zur Definition des Dreiecks):

7e382f76-59da-4b62-80dc-caf93e637c14

In diesem Beispiel wird gezeigt, wie die oben erwähnten 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 jedoch nur vier Punkte, um das Dreieck zu definieren. Der Grund hierfür ist, dass eine CircularString-Instanz Kreisbogensegmente und keine Liniensegmente speichert. Deshalb sind die Seiten des in der CircularString-Instanz gespeicherten Dreiecks ABC, CDE und EFA, wohingegen die Seiten des in der LineString-Instanz gespeicherten Dreiecks AC, CE und EA sind.

Sehen Sie sich den folgenden Codeausschnitt an:

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];

Dieser Ausschnitt liefert die folgende Ergebnisse:

LS LengthCS Length
5.65685…6.28318…

In der folgenden Abbildung ist dargestellt, wie die einzelnen Typen gespeichert werden (die rote Linie stellt LineString @g1 dar, die blaue Linie stellt CircularString @g2 dar):

e52157b5-5160-4a4b-8560-50cdcf905b76

Wie die obige Abbildung zeigt, verwenden CircularString-Instanzen 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 Kilometern 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))');

Oder

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, wohingegen eine LineString-Instanz die Kurve in mehrere kleinere Liniensegmente konvertieren müsste.

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 Kreisslices mit einer CircularString-Instanz müssen drei Punkte für jedes Liniensegment verwendet werden. Wenn ein Zwischenpunkt nicht bekannt wird, 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)');

In CompoundCurve-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 keine Kreisbogensegmenttypen verwenden: CircularString und CompoundCurve.

[Nach oben]

Siehe auch

Verweis

STNumCurves (geometry-Datentyp)

STNumCurves (geography-Datentyp)

STGeomFromText (geometry-Datentyp)

STGeomFromText (geography-Datentyp)

Konzepte

Räumliche Daten (SQL Server)

geometry-Datentyp-Methodenverweis

Andere Ressourcen

geography-Datentyp-Methodenverweis