Übersicht über räumliche DatentypenSpatial Data Types Overview

GILT FÜR: jaSQL ServerjaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Es gibt zwei Typen von räumlichen Daten.There are two types of spatial data. Der geometry -Datentyp unterstützt planare bzw. euklidische Daten (flache Erdabbildung).The geometry data type supports planar, or Euclidean (flat-earth), data. 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.The geometry data type both conforms to the Open Geospatial Consortium (OGC) Simple Features for SQL Specification version 1.1.0 and is compliant with SQL MM (ISO standard). Zudem unterstützt SQL ServerSQL Server den geography -Datentyp, der ellipsenförmige Daten speichert (runde Erdabbildung), z.B. GPS-Breiten- und -Längenkoordinaten.In addition, SQL ServerSQL Server supports the geography data type, which stores ellipsoidal (round-earth) data, such as GPS latitude and longitude coordinates.

Räumliche DatenobjekteSpatial Data Objects

Der geometry -Datentyp und der geography -Datentyp unterstützen 16 räumliche Datenobjekte bzw. Instanztypen.The geometry and geography data types support sixteen spatial data objects, or instance types. Nur elf dieser Instanztypen sind jedoch instanziierbar. Sie können diese Instanzen erstellen und Sie in einer Datenbanken bearbeiten (oder instanziieren).However, only eleven of these instance types are instantiable; you can create and work with these instances (or instantiate them) in a database. 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 GeometryCollectionauszeichnen.These instances derive certain properties from their parent data types that distinguish them as Points, LineStrings, CircularStrings, CompoundCurves, Polygons, CurvePolygons or as multiple geometry or geography instances in a GeometryCollection. DerGeography -Typ verfügt über einen zusätzlichen Instanztyp FullGlobe.Geography type has an additional instance type, FullGlobe.

Die nachfolgende Abbildung stellt die geometry -Hierarchie dar, auf der der geometry -Datentyp und der geography -Datentyp basieren.The figure below depicts the geometry hierarchy upon which the geometry and geography data types are based. Die instanziierbaren Typen von geometry und geography sind in Blau dargestellt.The instantiable types of geometry and geography are indicated in blue.

geom_hierarchy

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, MultiPolygonund GeometryCollection.As the figure indicates, the ten instantiable types of the geometry and geography data types are Point, MultiPoint, LineString, CircularString, MultiLineString, CompoundCurve, Polygon, CurvePolygon, MultiPolygon, and GeometryCollection. Es gibt einen zusätzlichen instanziierbaren Typen für den geography-Datentyp: FullGlobe.There is one additional instantiable type for the geography data type: 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.The geometry and geography types can recognize a specific instance as long as it is a well-formed instance, even if the instance is not defined explicitly. 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.For example, if you define a Point instance explicitly using the STPointFromText() method, geometry and geography recognize the instance as a Point, as long as the method input is well-formed. Wenn Sie die gleiche Instanz mit der STGeomFromText() -Methode definieren, erkennen sowohl der geometry - als auch der geography -Datentyp die Instanz als Point.If you define the same instance using the STGeomFromText() method, both the geometry and geography data types recognize the instance as a Point.

Die Untertypen für geometry- und geography-Typen sind in einfache Typen und Auflistungstypen unterteilt.The subtypes for geometry and geography types are divided into simple and collection types. Einige Methoden wie STNumCurves() funktionieren nur mit einfachen Typen.Some methods like STNumCurves() work only with simple types.

Zu einfachen Typen gehören:Simple types include:

Zu Auflistungstypen gehören:Collection types include:

Unterschiede zwischen den geometry- und geography-DatentypenDifferences Between the geometry and geography Data Types

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.The two types of spatial data often behave quite similarly, but there are some key differences in how the data is stored and manipulated.

Definieren von verbindenden RändernHow connecting edges are defined

Die definierenden Daten für die Typen LineString und Polygon sind nur Scheitelpunkte.The defining data for LineString and Polygon types are vertices only. Der verbindende Rand zwischen zwei Scheitelpunkten in einer Geometrie ist eine gerade Linie.The connecting edge between two vertices in a geometry type is a straight line. Die verbindende Kante zwischen zwei Scheitelpunkten in einem Geografietyp ist ein kurzer elliptischer Bogen zwischen den beiden Scheitelpunkten.However, the connecting edge between two vertices in a geography type is a short great elliptic arc between the two vertices. 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.A great ellipse is the intersection of the ellipsoid with a plane through its center and a great elliptic arc is an arc segment on the great ellipse.

Definieren von KreisbogensegmentenHow circular arc segments are defined

Kreisbogensegmente für geometry-Typen werden in der kartesischen XY-Koordinatenebene definiert (Z-Werte werden ignoriert).Circular arc segments for geometry types are defined on the XY Cartesian coordinate plane (Z values are ignored). Kreisbogensegmente für geography-Typen werden von Kurvenabschnitten auf einer Verweiskugel definiert.Circular arc segments for geography types are defined by curve segments on a reference sphere. 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.Any parallel on the reference sphere can be defined by two complementary circular arcs where the points for both arcs have a constant latitude angle.

Maße in räumlichen DatentypenMeasurements in spatial data types

Im planaren bzw. euklidischen System werden Maße von Entfernungen und Flächen in der gleichen Maßeinheit angegeben wie die Koordinaten.In the planar, or flat-earth, system, measurements of distances and areas are given in the same unit of measurement as coordinates. Bei Verwendung des geometry -Datentyps beträgt die Entfernung zwischen (2, 2) und (5, 6) ungeachtet der verwendeten Maßeinheit 5 Einheiten.Using the geometry data type, the distance between (2, 2) and (5, 6) is 5 units, regardless of the units used.

Im ellipsenförmigen System werden Koordinaten in Breiten- und Längengraden angegeben.In the ellipsoidal, or round-earth system, coordinates are given in degrees of latitude and longitude. 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.However, lengths and areas are usually measured in meters and square meters, though the measurement may depend on the spatial reference identifier (SRID) of the geography instance. Die gängigste Maßeinheit für den geography -Datentyp ist Meter.The most common unit of measurement for the geography data type is meters.

Ausrichtung von räumlichen DatenOrientation of spatial data

Im planaren System ist die Ringausrichtung eines Polygons kein wichtiger Faktor.In the planar system, the ring orientation of a polygon is not an important factor. 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.For example, a polygon described by ((0, 0), (10, 0), (0, 20), (0, 0)) is the same as a polygon described by ((0, 0), (0, 20), (10, 0), (0, 0)). Die OGC Simple Features for SQL-Spezifikation schreibt keine Ringreihenfolge vor, und SQL ServerSQL Server erzwingt keine Ringreihenfolge.The OGC Simple Features for SQL Specification does not dictate a ring ordering, and SQL ServerSQL Server does not enforce ring ordering.

In einem ellipsenförmigen System hat ein Polygon ohne Ausrichtung keine Bedeutung bzw. ist mehrdeutig.In an ellipsoidal system, a polygon has no meaning, or is ambiguous, without an orientation. Beschreibt beispielsweise ein Ring um den Äquator die nördliche oder die südliche Hemisphäre?For example, does a ring around the equator describe the northern or southern hemisphere? 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.If we use the geography data type to store the spatial instance, we must specify the orientation of the ring and accurately describe the location of the instance. Der Innere des Polygons in einem ellipsoidförmigen System wird von der linken Regel definiert.The interior of the polygon in an ellipsoidal system is defined by the left-hand rule.

Wenn der Kompatibilitätsgrad in SQL Server 2017SQL Server 2017 100 oder niedriger ist, weist der geography -Datentyp die folgenden Einschränkungen auf:When the compatibility level is 100 or below in SQL Server 2017SQL Server 2017 then the geography data type has the following restrictions:

  • Jede geography -Instanz muss in genau eine Hemisphäre passen.Each geography instance must fit inside a single hemisphere. Es können keine räumlichen Objekte gespeichert werden, die größer als eine Hemisphäre sind.No spatial objects larger than a hemisphere can be stored.
  • 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“.Any geography instance from an Open Geospatial Consortium (OGC) Well-Known Text (WKT) or Well-Known Binary (WKB) representation that produces an object larger than a hemisphere throws an 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.The geography data type methods that require the input of two geography instances, such as STIntersection(), STUnion(), STDifference(), and STSymDifference(), will return null if the results from the methods do not fit inside a single hemisphere. STBuffer() gibt ebenfalls NULL zurück, wenn die Ausgabe eine Hemisphäre überschreitet.STBuffer() will also return null if the output exceeds a single hemisphere.

In SQL Server 2017SQL Server 2017ist FullGlobe ein spezieller Polygontyp, der den gesamten Globus abdeckt.In SQL Server 2017SQL Server 2017, FullGlobe is a special type of Polygon that covers the entire globe. FullGlobe verfügt über einen Bereich, aber nicht über Rahmen oder Scheitelpunkte.FullGlobe has an area, but no borders or vertices.

Äußere und innere Ringe sind beim geography-Datentyp nicht von BedeutungOuter and inner rings not important in geography data type

In der Simple Features for SQL-Spezifikation von OGC werden äußere und innere Ringe erörtert. Diese Unterscheidung ist beim SQL ServerSQL Server geography allerdings nicht sinnvoll: Jeder Ring eines Polygons kann als äußerer Ring interpretiert werden.The OGC Simple Features for SQL Specification discusses outer rings and inner rings, but this distinction makes little sense for the SQL ServerSQL Server geography data type; any ring of a polygon can be taken to be the outer ring.

Weitere Informationen zu den OGC-Spezifikationen finden Sie in den folgenden Themen:For more information on OGC specifications, see the following:

KreisbogensegmenteCircular Arc Segments

Drei instanziierbare Typen können Kreisbogensegmente verwenden: CircularString, CompoundCurve und CurvePolygon.Three instantiable types can take circular arc segments: CircularString, CompoundCurve, and CurvePolygon. Ein Kreisbogensegment wird von drei Punkten in einer zweidimensionalen Ebene definiert; der dritte Punkt darf nicht mit dem ersten Punkt identisch sein.A circular arc segment is defined by three points in a two dimensional plane and the third point cannot be the same as the first point.

In Abbildung A und B sind typische Kreisbogensegmente dargestellt.Figures A and B show typical circular arc segments. Beachten Sie, dass jeder der drei Punkte auf dem Umkreis eines Kreises liegt.Note how each of the three points lie on the perimeter of a circle.

In Abbildung C und D ist dargestellt, wie ein Liniensegment als Kreisbogensegment definiert werden kann.Figures C and D show how a line segment can be defined as a circular arc segment. 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.Note that three points are still needed to define the circular arc segment unlike a regular line segment which can be defined by just two points.
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.Methods operating on circular arc segment types use straight line segments to approximate the circular arc. The number of line segments used to approximate the arc will depend on the length and curvature of the arc. Z values can be stored for each of the circular arc segment types; however, methods will not use the Z values in their calculations.

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.If Z values are given for circular arc segments then they must be the same for all points in the circular arc segment for it to be accepted for input. 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.For example: CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) is accepted, but CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) is not accepted.

Vergleich von LineString und CircularStringLineString and CircularString comparison

In diesem Beispiel wird gezeigt, wie die identischen gleichschenkligen Dreiecke mit einer LineString-Instanz und einer CircularString-Instanz gespeichert werden:This example shows how to store identical isosceles triangles using both a LineString instance and CircularString instance:

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.Notice that a CircularString instance requires seven points to define the triangle, but a LineString instance requires only four points to define the triangle. Der Grund hierfür ist, dass eine CircularString -Instanz Kreisbogensegmente und keine Liniensegmente speichert.The reason for this is that a CircularString instance stores circular arc segments and not line segments. 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.So the sides of the triangle stored in the CircularString instance are ABC, CDE, and EFA whereas the sides of the triangle stored in the LineString instance are AC, CE, and EA.

Betrachten Sie das folgende Beispiel:Consider the following example:

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

Im Folgenden finden Sie das Resultset.Here is the result set.

LS LengthCS Length
5.65685...6.28318...

CircularString-Instanzen verwenden weniger Punkte, um Kurvenbegrenzungen mit größerer Genauigkeit zu speichern, als LineString-Instanzen.CircularString instances use fewer points to store curve boundaries with greater precision than LineString instances. CircularString -Instanzen sind hilfreich für das Speichern von Kreisbegrenzungen, z.B. ein Suchradius von zwanzig Kilometern von einem bestimmten Punkt aus.CircularString instances are useful for storing circular boundaries like a twenty-mile search radius from a specific point. LineString -Instanzen eignen sich für das Speichern von linearen Grenzen, z. B. ein Häuserblock.LineString instances are good for storing boundaries that are linear like a square city block.

Vergleich von LineString und CompoundCurveLineString and CompoundCurve comparison

In den folgenden Codebeispielen ist dargestellt, wie die gleiche Abbildung mit LineString - und CompoundCurve -Instanzen gespeichert wird:The following code examples show how to store the same figure using LineString and CompoundCurve instances:

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.In the examples above, either a LineString instance or a CompoundCurve instance could store the figure. Im nächsten Beispiel wird ein Kreisslice mithilfe eines CompoundCurve gespeichert:This next example uses a CompoundCurve to store a pie slice:

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.A CompoundCurve instance can store the circular arc segment (2 2, 1 3, 0 2) directly whereas a LineString instance would have to convert the curve into several smaller line segments.

Vergleich von CircularString und CompoundCurveCircularString and CompoundCurve comparison

Im folgenden Codebeispiel wird gezeigt, wie der Kreisslice in einer CircularString -Instanz gespeichert werden kann:The following code example shows how the pie slice can be stored in a CircularString instance:

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.To store the pie slice using a CircularString instance requires that three points be used for each line segment. Wenn ein Zwischenpunkt nicht bekannt wird, muss er entweder berechnet werden, oder der Endpunkt des Liniensegments muss verdoppelt werden, wie im folgenden Codeausschnitt dargestellt:If an intermediate point is not known, it either has to be calculated or the endpoint of the line segment has to be doubled as the following snippet shows:

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.CompoundCurve instances allow both LineString and CircularString components so that only two points to the line segments of the pie slice need to be known. In diesem Codebeispiel wird gezeigt, wie ein CompoundCurve verwendet wird, um die gleiche Abbildung zu speichern:This code example shows how to use a CompoundCurve to store the same figure:

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 CurvePolygonPolygon and CurvePolygon comparison

CurvePolygon -Instanzen können beim Definieren ihrer äußeren und inneren Ringe CircularString - und CompoundCurve -Instanzen verwenden.CurvePolygon instances can use CircularString and CompoundCurve instances when defining their exterior and interior rings. Polygon-Instanzen können keine Kreisbogensegmenttypen verwenden: CircularString und CompoundCurve.Polygon instances cannot use the circular arc segment types: CircularString and CompoundCurve.

Weitere InformationenSee Also