Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

T-SQL Geografie-Unterricht Teil 2 – Linie

25. März 2010 , Geschrieben von Olaf Helper Veröffentlicht in #Geo - GIS

Nach den Punkten kommen nun die Linien für den Datentypen Geography des Microsoft SQL Server 2008 dran. Das ist nichts weiter kompliziertes, es sind lediglich Auflistungen von Punkten, um eine Linie zu erhalten; da muss man auch nichts weiter beachten, jedenfalls sind mir hier keine Stolperfallen bekannt.

Es gibt dabei aber auch eine interessante Funktion Reduce(), um die Anzahl der Punkte abhängig von der Entfernung untereinander zu verringern.

Einfaches wie praktisches Beispiel: Man hat einen GPS Tracker und zeichnet damit ein Weg (z.B. zur Arbeit oder zum Kunden) auf, das ist eine Anreihung von einzelnen Punkten zu einem bestimmten Zeitpunkt, was wiederum eine Linie ergibt; die Route eben.

Werden die Punkte zeitgesteuert gespeichert, bekommt man bei Ampelstopps oder anderen Pause viele Messpunkte für einen einzelnen Standort; das sind redundante Daten, die unnötig auf die Performance von der Auswertung her bis hin zur Anzeige gehen.

Über die Reduce(tolerance) Funktion kann man nun diese redundante Punkte entfernen lassen, über den Parameter tolerance gibt man dabei die Mindest-Entfernung in Metern an.

Beispiel:

 

 -- In Teil 1 angelegte Datenbank verwenden 
 USE [GeoTest]; 
 GO 
   
 -- Tabelle für einfache Linie 
 CREATE TABLE Lines 
  (ID int IDENTITY(1, 1) NOT NULL Primary Key, 
  Line geography); 
 GO 
   
 -- Eine einfache, horizontal & halbwegs gerade Linie 
 INSERT INTO Lines (Line) 
 VALUES (geography::STGeomFromText( 
  'LINESTRING( 9.73610 52.374401 
  , 9.73611 52.374400 
  , 9.73612 52.374401 
  , 9.73613 52.374400 
  , 9.73614 52.374401)', 4326)); 
   
 -- Die gleiche Linie parallel dazu, nur etwas "krösselig" 
 -- und mit weiteren kurzen Zwischenpunkten 
 INSERT INTO Lines (Line) 
 VALUES (geography::STGeomFromText( 
  'LINESTRING( 9.73610 52.374402 
  , 9.73611 52.374402 
  , 9.73612 52.374402 
  , 9.736121 52.374403 
  , 9.736122 52.374402 
  , 9.736123 52.374403 
  , 9.736124 52.374402 
  , 9.736125 52.374403 
  , 9.736126 52.374403 
  , 9.73613 52.374402 
  , 9.73614 52.374402)', 4326)); 
   
 -- Selektion der Linie, zusätzlich mit Reduktion der 
 -- Punkte, die näher als 80 Meter sind. 
 SELECT Line -- Zur Anzeige in Spatial Result 
  ,Line.Reduce(0.08) AS LineRed -- Zur Anzeige in Spatial Result 
  ,Line.ToString() 
  ,Line.STNumPoints() AS AnzPunkte 
   ,Line.Reduce(0.08).ToString() 
  ,Line.Reduce(0.08).STNumPoints() AS AnzReduz 
 FROM Lines;


Jetzt wird die zusätzliche Anzeige von „Spatial result“ auch etwas interessanter; mit Betonung auf etwas.

Leider gibt es (meines Wissens) keine Möglichkeit Einfluss auf die Darstellung / Farben zu nehmen, die dünnen Linien kann man bestenfalls so gerade eben noch erkennen.

 
Spatial_Result_Line.jpg

Diesen Post teilen

Repost 0

Kommentiere diesen Post

Thomas Naugler 04/01/2010 22:00


Vielen dank für die Fortsetzung. Wenigstens habe ich jetzt einige Anhaltspunkte.