Geography und die Integration Services

Innerhalb des SQL Servers 2008 stehen einem viele verschiedene Methoden zur Verfügung um mit den sogenannten Spatial Data zu arbeiten. Das Management Studio wurde um eine sehr schöne Funktion ergänzt diese Daten auch zu visualisieren. Im Bild sind die Umrisses des Telefonvorwahlbereichs 0228 aus dem Reiter “Räumliche Ergebnisse” innerhalb des SQL Server Management Studio zu sehen. Der entsprechende Reiter wird automatisch angezeigt, sobals eine Abfrage ausgeführt wird, die Geodaten zurück gibt.

ONB_0228_GEODATA2

 

Wie sieht es jedoch aus wenn man die Daten in anderen Umgebungen weiter verarbeiten will? Um in der .NET Sprache seiner Wahl mit geographische Datentypen zu arbeiten, muss man seinem Projekt lediglich einen Verweis auf Microsoft.SqlServer.Types hinzuzufügen und schon kann man auch in .NET mit Geodaten arbeiten.

 

   1:  Dim GeoPoint As SqlGeography = SqlGeography.Point(latitude, longitude, SRID)

Möchte man die Daten per SSIS verarbeiten, ist das ganze schon ein bisschen umständlicher. Die Integration Services kennen derzeit leider noch keinen eigenen geographischen Datentyp und verarbeiten Geodaten grundsätzlich als BLOB (DT_IMAGE), was zur Folge hat, dass man z.B. keine Suche in anderen Tabellen anhand der Geodaten vornehmen kann.

image

Zugegeben wäre diese Suche in den meisten Fällen auch nicht sinnvoll, da man höchstwahrscheinlich sehr selten Daten über zwei identische Punkte zuordnen will. Eine Umkreissuche bietet sich hier eher an.
Im folgenden werden Bildern, die mit der ImageSource importiert wurde, Ortsnamen aus einer Referenztabelle zugeordnet, sofern sie in einem Umkreis von 3 km liegen.

image SSIS_GEOSUCHE3 SSIS_GEOSUCHE2

Als erstes müssen die Daten beim Laden aus der Datenquelle wieder zurück in einen varchar Wert konvertiert werden. Wichtig ist, das die Länge des varchar Wertes mit angegeben wird, da der Standartwert ansonsten bei 30 Zeichen liegt und die Daten des Geopunktes abgeschnitten werden.

 

   1:  SELECT    Filename
   2:            , CAST(GPS2.STAsText() AS VARCHAR(255)) AS GEO_Data 
   3:  FROM DEMO009

Die Referenzdaten im ”Suche”-Task müssen auf die gleiche Weise geladen werden, danach können die Spalten wie gewohnt miteinander verbunden werden. Im Menüpunkt “Erweitert” muss dann die SQL-Anweisung, die für die eigentliche Suche zuständig ist, angepasst werden. Die Daten aus dem Datenstrom werden der SQL-Anweisung als Parameter “?” übergeben.

 

   1:  select * from (
   2:     SELECT FULL_NAME
   3:            , CAST(GEO.STAsText() AS VARCHAR(255)) AS GEO_DATA 
   4:     FROM geonames2
   5:     ) [refTable]
   6:  where geography::STGeomFromText([refTable].[GEO_DATA], 4326).STDistance
   7:            (geography::STGeomFromText(?, 4326)) < 3000


In der “WHERE”-Klausel werden die zuvor als varchar konvertierten Daten nun wieder in den Datentypen geography konvertiert und dann eine Distanz-Berechnung ausgeführt. Die Distanzberechnung legt fest, das die beiden Punkt weniger als 3000 m voneinander entfernet sein sollen.

Die Methode STGeomFromText erwartet neben den Geodaten noch einen zusätzlichen Parameter, die sogenannte SRID. Diese ID gibt das Referenzsystem zur Positionsangabe auf der Erde an und sollte bei uns in Europa derzeit noch 4326 für WGS84 sein.

SSIS_GEOSUCHE4