Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Neuerungen in SQL Server 2008: Räumliche Datentypen

Genau wie der Datentyp HierarchyId, so sind auch die neuen räum­li­chen Datentypen geo­me­try und geo­gra­phy CLR-Datentypen, die in jeder Datenbank ver­füg­bar sind – unab­hän­gig davon, ob CLR-Funktionen akti­viert sind.

Der geo­me­try-Datentyp erlaubt die Darstellung von Daten im kar­te­si­schen Koordinatensystem und die Durchführung von Berechnungen mit die­sen Daten.
Das möchte ich an einem Beispiel verdeutlichen:
image3

In die­sem Koordinatensystem befin­den sich 2 geo­me­tri­sche Figuren. Ein Strahl mit den Endpunkten (0; 0), (100; 200) und ein Quadrat mit den Eckpunkten (-40; ‑40), (100; ‑40), (100; 100), und (-40, 100).

Die Deklaration einer Tabelle zur Speicherung der Daten ist recht tri­vial. Hierzu erzeugt man ein­fach eine Tabellenspalte vom Typ Geometry in die man die Daten schreibt.

Ich möchte hier aller­dings auf die Möglichkeiten des Datentyps ein­ge­hen. Daher wer­den in den fol­gen­den Beispielen nur Variablen die­ses Datentyps erzeugt. Mit Hilfe der sta­ti­schen Methode STGeomFromText kann aus einem nor­mal­sprach­li­chen Text (dem soge­nann­ten "Well Known Text" = WKT) eine geo­me­tri­sche Instanz erzeugt wer­den. Im Beispiel ist das:

DECLARE @line geo­me­try;
SET @line =
geo­me­try ::STGeomFromText('LINESTRING (0 0, 100 200)',0)
DECLARE @rectangle geo­me­try;
SET @rectangle = geo­me­try ::STGeomFromText('POLYGON ((-40 ‑40, 100 ‑40, 100 100, ‑40 100, ‑40 ‑40))',0)

Wie man sieht, wird hier die Art der geo­me­tri­schen Figur ange­ge­ben  und Punkte, die die Figur näher beschrei­ben. Das Quadrat ist ver­all­ge­mei­nert ein Polygon, daher ist der WKT hier POLYGON. Zu beach­ten ist bei Polygonen, dass Start- und Endpunkt über­ein­stim­men müssen.

Soweit ganz gut. Das Erzeugen und Speichern von Daten an sich ist recht lang­wei­lig. Was kön­nen die Methoden, die geo­me­try zur Verfügung stellt?

STAsText: STAsText gibt den WKT für ein geometry-Objekt zurück.

STArea: Diese Funktion berech­net die Oberfläche von geo­me­tri­schen Objekten. Im Fall der Linie ist die Oberfläche 0, aber das ist ehr­lich gesagt auch nicht ver­wun­der­lich. Im Fall des Quadrats hat die Methode kor­rekt 140 * 140 = 19600 zurückgegeben.

STIntersection: Mit STIntersection wird die Überschneidung zweier Objekte berech­net. Das Ergebnis der Berechnung im Beispiel ist eine Linie mit den Endpunkten (0; 0) und (50; 100) – und genau das kann man auch sehr schön im Diagramm ablesen.

STLength: Ein letz­tes Beispiel an die­ser Stelle soll STLength sein. Wie der Name schon ver­mu­ten lässt, kann damit die Länge bzw. der Umfang der Objekte berech­net werden.

Die Anwendungsfälle dafür kön­nen sehr viel­fäl­tig sein. Beispielsweise könnte hier die Entfernung zwi­schen Gebäuden oder Objekten berech­net werden.

Die Berechnung von Entfernungen mit STLength oder Flächen mit STArea auf gera­den Flächen ist nur dann sinn­voll, wenn es sich um kurze Distanzen han­delt. Möchte man Entfernungen in der rea­len Welt berech­nen, ist der geometry-Datentyp auf­grund der Krümmung der Erde nicht mehr geeig­net. Der geo­gra­phy-Datentyp schafft hier Abhilfe:

Wie schon vom Geometry-Datentyp bekannt, kann ein Objekt mit­tels der sta­ti­schen Methode STGeomFromText erzeugt wer­den. Allerdings spielt hier die dort recht unwich­tige SRID hier eine wesent­li­che Rolle. Sie defi­niert, anhand wel­chen Standards Berechnungen durch­ge­führt wer­den. In der MSDN fin­det man zum Thema folgendes:

geo­me­try Instances Default to Zero SRID

The default SRID for geo­me­try instan­ces in SQL Server is 0. With geo­me­try spa­tial data, the spe­ci­fic SRID of the spa­tial instance is not requi­red to per­form cal­cu­la­ti­ons; thus, instan­ces can reside in unde­fi­ned pla­nar space. To indi­cate unde­fi­ned pla­nar space in the cal­cu­la­ti­ons of geo­me­try data type methods, the SQL Server Database Engine uses SRID 0.

geo­gra­phy Instances Must Use Supported SRID

SQL Server sup­ports SRIDs based on the EPSG stan­dards. A SQL Server-supported SRID for geo­gra­phy instan­ces must be used when per­forming cal­cu­la­ti­ons or using methods with geo­gra­phy spa­tial data. The SRID must match one of the SRIDs dis­played in the sys.spatial_reference_systems cata­log view. As men­tio­ned pre­viously, when you per­form cal­cu­la­ti­ons on your spa­tial data using the geo­gra­phy data type, your results will depend on which ellip­soid was used in the crea­tion of your data, as each ellip­soid is assi­gned a spe­ci­fic spa­tial refe­rence iden­ti­fier (SRID).

SQL Server uses the default SRID of 4326, which maps to the WGS 84 spa­tial refe­rence sys­tem, when using methods on geo­gra­phy instan­ces. If you use data from a spa­tial refe­rence sys­tem other than WGS 84 (or SRID 4326), you will need to deter­mine the spe­ci­fic SRID for your geo­gra­phy spa­tial data.

Im Gegensatz zu Geometry muss für die Initialisierung der Geography-Objekte also zwin­gend eine SRID ange­ge­ben wer­den. Der Standard ist aktu­ell 4362. Eine Übersicht der gül­ti­gen SRIDs erhält man, wenn man die Systemsicht sys.spatial_reference_systems aufruft:
image11

Es gibt noch eine wei­tere Einschränkung: Geography-Instanzen dür­fen die Hemisphäre nicht über­schrei­ten. Diese Einschränkung spielt natür­lich erst dann eine Rolle, wenn man nicht mehr nur geo­gra­phi­sche Punkte spei­chert, son­dern Berechnungen durch­füh­ren möchte und z.B. Entfernungen berech­net. Eine in mei­nen Augen gute Erklärung für diese Einschränkung lie­fert ein Blogeintrag von Steve Kass zum Thema. Darin wird auch gut beschrie­ben, wes­halb die Punkte von Polygonen immer ent­ge­gen des Uhrzeigersinns ange­ge­ben wer­den müssen.

Related Posts

1 Kommentar

Avatar Bernd Viehmann

Guter Artikel. Vielen Dank.

Ich frage mich nur noch wie man die geometry-Daten aus der SQL-Server Datenbank in Koordinaten für Google-Maps konvertiert.

Viele Grüße

Bernd Viehmann

Comments are closed.

Pin It on Pinterest