Open-Source Geodatenbanken Benjamin Winter Betreuer: Prof. Dr. Bernhard Möller Dieses Seminar stellt verschiedene Open-Source Geodatenbanksysteme vor. Zu Beginn wird kurz die Geschichte der bekanntesten drei Vertreter PostGIS, Spatialite und MySQL erläutert. Danach werden die drei Systeme in ihrem Funktionsumfang verglichen und abschlieÿend noch einige Fähigkeiten von Geodatenbanken am Beispiel von Spatialite aufgezeigt. Abstract. 1 Einleitung Immer mehr technische Geräte wie z.B. Handys, Smartphones und Digitalkameras sind mit GPS-Empfängern ausgestattet. Besonders im Bereich der Smartphones und Handys, die meist schon Internetfähigkeiten besitzen, können die gewonnen Geodaten auf einfache Weise einem Onlinedienst zur Verfügung gestellt werden, der diese dann entsprechend aufbereitet und dem Benutzer wieder verfügbar macht. So kann man z.B. bei Facebook seinen Standort mitteilen und Freunde, die sich gerade in der Nähe benden und auch ihren Standort mitgeteilt haben, ausndig machen. Das ist jedoch nur ein Beispiel der vielfältigen Anwendungsmöglichkeiten von Geodatenbanksystemen. Dazu sind meist keine teuren Produkte von kommerziellen Herstellern nötig, es gibt auch einige OpenSource Geodatenbanken. Im Folgenden werden PosGIS, Spatialite sowie MySQL als die gröÿten und bekanntesten Vertreter davon vorgestellt und miteinander verglichen. Im Anschluss daran werden auch noch einige praktische Beispiele mit Spatialite aufgezeigt. Diese sind einfach und unkompliziert umzusetzen, da man für die Verwendung von Spatialite auf dem Computer nichts installieren oder einrichten muss. 2 2.1 Geschichte PostGIS Die allgemein bekannte Geschichte der Open-Source Geodatenbanken beginnt mit PostGIS[1][2]. PostGIS wurde von Refractions Research als eine Erweiterung der PostgreSQL-Datenbank entwickelt. Im Mai 2001 hat Refractions Research festgestellt, dass die in PostgreSQL schon rudimentär vorhandenen Geometriedatentypen nicht ausreichen, um Geoinformationsdaten ezient zu speichern und zu verarbeiten. Die bisherige Vorgehensweise war, Geodaten, die die Fähigkeiten von PostgreSQL überstiegen, in Dateien auszulagern oder als BLOB zu speichern. Beides war nicht sehr leistungsfähig. Folglich hat man damit begonnen, einen 2 Open-Source Geodatenbanken eigenen Datentyp für Geodaten zu entwickeln. Schon die ersten Implementierungen dieses Datentyps waren zehnmal schneller als das Speichern in BLOBs. Die seitdem zahlreich entwickelten Funktionen zum Umgang mit den neuen Daten wurden in der GEOS-Bibliothek zusammengefasst. Die GEOS-Bibliothek ist eine C++-Portierung der JTS Topology Suite und kann auch von anderen Datenbanksystemen, z.B. Spatialite, benutzt werden. Seit Version 0.8, die schlieÿlich im Jahr 2003 erschienen ist, hat PostGIS den Standard ISO 19125 "Simple Feature Access" vollständig in die GEOS-Bibliothek implementiert. Mit Version 1.0 (April 2005) wurde ein nochmals verbessertes Datenformat zur internen Speicherung der Geodaten standardmäÿig eingeführt (die Entwicklung begann jedoch schon ab Version 0.8). Seit Version 1.2 (2006/2007) wird in PostgreSQL der SQL/MM-Standard implementiert. Dieser Standard hat den Vorteil, dass er mehr Geometrische Objekte als ISO 19125 beschreibt. Diese Erweiterungen der Datenbank-Funktionen hat man jedoch nicht mehr in die GEOS-Bibliothek aufgenommen, da diese Bibliothek nur den Simple Feature Access-Standard implementiert. Die aktuelle Version ist 1.5.2 (September 2010). 2.2 MySQL Ein weiteres Open-Source Datenbanksystem ist MySQL. Es unterstützt seit Version 4.1 (2003) räumliche Erweiterungen zu diesem Zeitpunkt jedoch nur für Tabellen, die die MyISAM-Storage Engine nutzen[5]. Generell wird, wie auch bei PostGIS und Spatialite, der Simple Feature Access-Standard umgesetzt. Davon wurden allerdings einige Teile nicht implementiert. Seit Version 5.0.16 (Nov 2005) unterstützen auch die Storage-Engines InnoDB, NDB, BDB und ARCHIVE die Geodaten-Spalten[6]. Genauere Funktionen für topologische Prädikate (beispielsweise Intersects, Overlaps und Touches) existieren seit Version 5.6.1 (April 2011). Diese neuen Funktionen beginnen mit einem "ST_"-Präx und haben den Vorteil, dass sie nicht mehr mit der Hüllgeometrie (MBR, Minimal Bounding Rectangles), sondern mit den exakten geometrischen Formen arbeiten[7][8]. 2.3 Spatialite Eine Open-Source Datenbank mit einem etwas anderen Ansatz, aber auch mit Unterstützung für räumliche Daten, ist Spatialite. Dies ist eine Erweiterung der SQLite Programmbibliothek, welche eine schlanke, serverlose SQL-DatenbankEngine ist. Wegen dieser Eigenschaften ist nicht der komplette Funktionsumfang von Standard-SQL gegeben. Für genauere Informationen sei auf das Kapitel "Funktionsumfang" verwiesen. Die erste Version von Spatialite ist im März 2008 erschienen[3]. Seit Version 2.0 vom Juni 2008 integriert Spatialite die GEOSBibliothek und befolgt somit vollständig den Simple Feature Access-Standard. Zusätzlich wird die PROJ.4 Bibliothek, die Kartographie-Projektionen möglich macht, seit Version 2.2 (September 2008) unterstützt. Die aktuelle Versionsnummer lautet 2.3.1 (Juli 2009). Die wichtigsten Neuerungen dieser Version sind das Hinzufügen der SQL-Math-, sowie die Erweiterung um Funktionen zum Umgang mit EXIF-GPS Daten. Seit Dezember 2009 wird an Version 2.4.0 Open-Source Geodatenbanken 3 gearbeitet, wobei letzter Stand der Entwicklung Version 2.4.0.RC-4 (November 2010) ist[4]. Diese ist jedoch noch experimentell und nicht zum alltäglichen Einsatz gedacht. Die wichtigsten, schon implementierten Neuerungen bis jetzt sind: Konvertierungsfunktionen für KML und GML, Geschwindigkeitsverbesserungen beim Routingalgorithmus sowie Unterstützung für DBF-Dateien. 3 Funktionsumfang im Überblick Die Open-Source Datenbank mit dem wohl gröÿten Funktionsumfang stellt zweifelsohne PostGIS dar. PostGIS implementiert sowohl den Simple Feature AccessStandard komplett, als auch Teile des SQL/MM-Standards, sowie eigene Funktionen. Einige Beispiele für diese Funktionen wären das Konvertieren in SVG bzw. KML und die Bildung von Polygonen aus Streckenzügen[9](Kapitel 3.2). Eine weitere Datenbank mit einem groÿem Funktionsumfang im Hinblick auf Geodaten ist SpatiaLite, eine Erweiterung der Standalone-Datenbank SQLite, welche keine Client-Server-Architektur besitzt. Die Datenbank wird in einer einzelnen Datei gespeichert. Deswegen funktionieren die SQL-Statements GRANT und REVOKE nicht, da nur die Zugrisrechte der Datenbank-Datei gelten. Es existieren noch einige weitere, nur eingeschränkt funktionsfähige SQL-Funktionen [10]. Eine hiervon ist ALTER TABLE, die nur RENAME und ADD COLUMN unterstützt. DELETE, INSERT oder UPDATE funktionieren beispielsweise nicht auf Views und der FOR EACH STATEMENT-Trigger ist unter den Funktionen überhaupt nicht vorhanden (FOR EACH ROW jedoch schon). Dadurch, dass für die räumlichen Funktionen die gleiche Bibliothek wie bei PostGIS, nämlich GEOS, zum Realisieren des Simple Feature Access-Standards verwendet wird, steht SpatiaLite dem PostGIS-Datenbanksystem hinsichtlich dieses Standards in nichts nach. Neben der GEOS-Bibliothek wird auch die PROJ.4-Bibliothek verwendet. Dadurch kann man mit der Funktion "Transform" ein geometrisches Objekt von einem Koordinatensystem in ein anderes transformieren (identiziert durch eine SRID)[11]. Ein sehr interessantes Feature von SpatiaLite / SQLite ist die Unterstützung für sogenannte "Virtual Tables": Man kann eine Modul entwickeln, das auf beliebige Datenquellen zugreift und diese für SQLite als Tabelle, und somit für beliebige SQL-Statements zur Verfügung stellt. In SpatiaLite sind einige solcher Module bereits enthalten. Beispielsweise VirtualShape und VirtualText, wobei ersteres Zugri auf Shapeles (ein "Shapele" besteht aus mehreren Dateien und beschreibt Punkte, Linien, Flächen oder Multi-Punkte). Auch eine Routing-Funktion, die Dijkstra's Algorithmus zur Berechnung der kürzesten Wege nutzt, kann durch das Modul VirtualNetwork genutzt werden. Im Vergleich zu den beiden anderen vorgestellten Datenbanksystemen ist MySQL das mit dem kleinsten Funktionsumfang bezogen auf Geodaten. Wie schon im Geschichts-Kapitel erwähnt, setzt MySQL generell auch den Simple Feature Access-Standard um, jedoch nicht komplett. Die Verschneidungsoperationen Union() und Intersection() zum Erstellen von neuen Daten aus schon vorhandenen wurden weggelassen. Des Weiteren werden keine GIS Metadaten 4 Open-Source Geodatenbanken abgespeichert. Ebenso wird die SRID, welche die Eigenschaften eines Koordinatensystems beschreibt, zwar abgespeichert, aber nicht bei räumlichen Berechnungen berücksichtigt. Bei den räumlichen Berechnungen wird das zugrunde liegende Koordinatensystem nur als planar betrachtet[12]. 3.1 Überblick Im Folgenden wird der Funktionsumfang der einzelnen Standards und Datenbanksysteme im tabellarischen Überblick zusammengefasst: Die Tabelle stammt urspünglich aus [9] S. 3 und wurde an manchen Stellen erweitert und aktualisiert. Funktionen ISO 19125 Zugri auf Basiseigenschaften (Dimension, GeometryType, Zugri auf die Geometriebestandteile) Test von Geometrieeigenschaften (IsSimple, IsClosed, IsRing) Messfunktionen (Length, Area, Distance) Geometrische Funktionen auf einer Geometrie(Distance, Envelope, Centroid, Buer, ConvexHull) Verschneidungsoperationen Topologische Prädikate gemäÿ Dimensionally-Extended 9-Intersection Matrix [Clementini & DiFelice 1996] Konvertierung in Well-Known-Text (WKT) Well-Known Binary (WKB) Konvertierung in Geography Markup Language (GML) X SQL/ Post- Spatia-lite Mysql MM GIS Spatial X X X X X X X X (X) X X X X X X X X X (X) X X X X X X X X (X) X X X X X X X Open-Source Geodatenbanken Konvertierung in Scalable Vector Graphics (SVG) und Keyhole Markup Language (KML) Validierung von Geometrien Koordinatentransformationen Approximation von Kurvensegmenten durch Streckenzüge Gesonderte geometrische Funktionen und Verschneidungen auf achsenparallelen Rechtecken Generalisierung und Polygonisierung von Linien Geometrische Aggregatfunktionen 4 X X X X SVG; seit 2.4.0 RC 4 auch KML X X X[13] X[14] 5 X X X Anwendungsbeispiele mit SpatiaLite Jetzt sollen ein paar Anwendungsbeispiele von Geodatenbanken aufgezeigt werden. Dazu wird die Datenbank-Engine SpatiaLite benutzt. Um diese zu verwenden, reicht es aus, ein Programm herunterzuladen und auszuführen. Es ist keine Installation oder Einrichtung am Computer notwendig. Die entsprechenden Dateien kann man von der Homepage [15] herunterladen. Prinzipiell ist es egal, ob man spatialite-gui oder die Kommandozeilenversion (spatialite-tools) benutzt. Da jedoch die GUI die Geometrischen Daten auch auf einfache Weise darstellen kann, beziehen sich die folgenden Beispiele auf die GUI-Version. Zum schnellen Einstieg wird auch eine Beispieldatenbank von [16] verwendet. Die folgenden Beispiele beziehen sich auf die "World.7z": In dieser, noch gepackten, Datenbank sind alle Staaten der Welt aufgeführt. Zu jedem Staat in der Datenbank sind Informationen wie beispielsweise die kartographischen Daten als "Geometry", sowie die Flagge und das Wappen als Bild vorhanden. Neben der Staatentabelle existiert eine weitere Tabelle mit dem Namen "Admin", aus der beispielsweise ersichtlich wird, in welche Bereiche ein Staat unterteilt ist. Im Falle von Deutschland sind dies die Bundesländer. Die "Cities"-Tabelle sollte auch noch erwähnt werden. Dort sind neben den Koordinaten der jeweiligen Stadt auch Informationen darüber enthalten, zu welchem Land sie gehört oder ob sie eine Hauptstadt ist. Um die Datenbank zu verwenden, startet man spatialite-gui, wählt im Menü "Files -> Connecting an existing SQLite DB" aus und selektiert dann die aus der "world.7z" entpackte Datei "world.sqlite". Das Hauptfenster des Programms ist in drei Bereiche unterteilt: auf der linken Seite sind die Tabellen der Datenbank 6 Open-Source Geodatenbanken zu sehen, auf der rechten Seite oben ein Eingabefeld für SQL-Befehle und unten das Ergebnis der Abfrage. Um die Daten einer Tabelle anzusehen, kann man diese mit der rechten Maustaste anklicken und den Menüpunkt "Edit Table Rows" auswählen. Dadurch wird auch automatisch das SQL-Statement, das verwendet wurde, um die Tabelle auszugeben, in das SQL-Eingabefeld eingetragen. Dort kann es nach Belieben abgeändert werden (z.B. um uninteressante Spalten zu entfernen). Durch einen Klick auf den Button rechts neben dem Eingabefeld aktualisiert sich die Ausgabetabelle dann automatisch. 4.1 Geodaten ansehen Da man nun mit der Funktionsweise des Programms spatialite-gui grob vertraut sein müsste, könnte man sich als nächsten Schritt einmal die Geodaten aus einer der Tabellen ansehen: Zu Beginn lässt man sich beispielsweise Deutschland aus der Tabelle "Countries" der Beispieldatenbank ausgeben. Die interessanten Spalten sind dabei der Name des Landes und dessen Geodaten im Original, sowie eine, in ein anderes Koordinatensystem transformierte, Ausgabe davon. SELECT CNTRY_NAME as Name, Geometry as OriginalGeodaten, TRANSFORM(Geometry, 32632) as TransformierteGeodaten FROM Countries WHERE CNTRY_NAME like 'germany' ORDER BY CNTRY_NAME; Das Ergebnis erscheint wie gewohnt unterhalb des Eingabefeldes. Nach einem Rechtsklick auf eine Zelle in der Spalte OriginalGeodaten bzw. TransformierteGeodaten kann man "Blob Explore" auswählen und bekommt eine hexadezimale Ansicht der Daten präsentiert, die jedoch für die hier aufgeführten Beispiele nicht von Bedeutung ist. Wechselt man jedoch zur Registerkarte "Geometry Explorer", sieht man ein Bild der zuvor ausgewählten Daten. Fig. 1 zeigt auf der linken Seite das Bild, das ausgegeben wird, wenn man die Spalte OriginalGeodaten ausgewählt hat und auf der rechten Seite das Bild, das entsteht, wenn man die Spalte TransformierteGeodaten angeklickt hat. Man kann erkennen, dass Deutschland in der OriginalGeodaten-Spalte etwas zusammengestaucht aussieht, in der TransformierteGeodaten-Spalte jedoch normal erscheint. Das liegt an der SRID, die zum Abspeichern der Geodaten verwendet wurde. Eine genauere Erklärung dazu war bereits Thema eines anderen Vortrages. Aus diesem Grund wird hier nicht weiter darauf eingegangen. Sieht man sich nun das Fenster mit der Grakanzeige der Geodaten etwas genauer an, ndet man auf der linken Seite auch einige Informationen zu den Daten an sich. Hier kann man unter anderem erkennen, dass Daten mit der SRID 4326 vorliegen. In der "spatial_ref_sys"-Tabelle sind alle, vom Open Geospatial Consortium im Simple Feature Access - Standard denierten, SRID's abgespeichert. Sucht man dort nach der SRID 4326, ndet man das zugehörige Referenzsystems "WGS 84". Diese Erkenntnis wird gleich noch benötigt. Open-Source Geodatenbanken Fig. 1. 4.2 7 OriginalGeodaten (links) und TransformierteGeodaten (rechts) Neueinträge Wenn man sich die Tabelle "Cities" einmal genauer ansieht, wird man feststellen, dass dort die Stadt "Augsburg" nicht enthalten ist. Diese Informationslücke kann man durch einen Neueintrag beheben. Um Augsburg korrekt einzutragen, benötigt man zunächst einmal die Koordinaten in einer für das weitere Vorgehen passenden Notation. An eine Auswahl von Notationen gelangt man am einfachsten, indem man im Wikipedia-Eintrag [17] auf die Koordinaten auf der rechten Seite direkt unter dem Titel klickt. Aber welche dieser Koordinaten eigenen sich nun für die hier verwendete Beispieldatenbank? Dass es sich um WGS-84-Koordinaten handelt, wurde schon herausgefunden. Es stellt sich jedoch die Frage, wie das in die Datenbank eingetragen wird. Dazu sieht man sich einmal an, wie die anderen (deutschen) Städte eingespeichert wurden: SELECT WUP_AGGL, AsText(Geometry) FROM Cities WHERE CNTRY_Name LIKE 'Germany'; Die Funktion AsText(Geometry) gibt dabei die Geodaten in Form von WellKnown-Text, wie im Simple-Feature-Access-Standard deniert, aus. Jetzt kann man erkennen, dass München ein "POINT" mit den Koordinaten 11.5833 und 48.1333 ist. Wenn man nun die Koordinaten von München, analog der Vorgehensweise bei Augsburg, sucht, wird man feststellen, dass die auf der GeoHackSeite[18] gefunden Koordinaten bis auf die Darstellung in umgekehrter Reihenfolge ziemlich genau mit denen der Datenbank übereinstimmen. Da München jedoch recht groÿ ist, soll diese Ungenauigkeit nicht weiter stören. Da nun die für die Datenbank benötigte Notation der von Augsburg gefunden Koordinaten bekannt ist, kann man sich den Well-Known-Text von Augsburg zusammenstellen: POINT(10.898333 48.371667) 8 Open-Source Geodatenbanken Um zu erfahren, auf welche Weise man die neu gewonnenen Geodaten in die Datenbank eintragen kann, könnte man die Hilfe aufrufen. Der Button hierzu bendet sich in der Symbolleiste. Nach einem Klick auf das linke der beiden blau hinterlegten Fragezeichen önet sich ein Hilfefenster. Dort sticht sogleich die Überschrift "functions for constructing a geometric object given its Wellknown Text Representation" ins Auge. Nach einem Klick auf den Link ndet man eine Funktion, die sich "PointFromText(...)" nennt. Die Well-Known-Text von Augsburg ist inzwischen bekannt und man kann einen neuen Eintrag in der Datenbank anlegen: INSERT INTO Cities(WUP_AGGL, Geometry) VALUES ('Augsburg', PointFromText('POINT(10.898333 48.371667)', 4326)); Wichtig ist, dass die einzelnen Koordinaten nicht durch ein Komma getrennt werden, denn wenn dies der Fall ist, stürzt SpatiaLite aufgrund eines Speicherzugrisfehlers ab. 4.3 Räumliche Lagebeziehungen Mit SpatiaLite kann man sich auch alle in der Beispieldatenbank vorhandenen Städte ausgeben lassen, die sich in Deutschland benden. Dies ist entweder mit Standard-SQL möglich, indem man aus der Tabelle Cities alle Zeilen ausgeben lässt, deren CTNRY_NAME-Spalte gleich "Germany" ist oder man nutzt die räumliche Funktion Contains() und lässt sich alle Zeilen aus der Cities-Tabelle ausgeben, deren Geodaten innerhalb von Deutschland liegen. Da im vorherigen Schritt, beim Eintragen von Augsburg in die Datenbank, die Spalte CNTRY_NAME nicht ausgefüllt wurde, könnte man mit Standard-SQL die Stadt Augsburg nicht mehr Deutschland zuordnen. Daher wird im folgenden Beispiel die Variante mit der räumlichen Funktion benutzt: SELECT WUP_AGGL AS Name FROM Cities, Countries WHERE Countries.CNTRY_Name LIKE 'Germany' AND Contains(Countries.Geometry, Cities.Geometry) ORDER BY WUP_AGGL; Wie man sehen kann,1 steht Augsburg an zweiter Stelle der Ergebnistabelle. 4.4 Entfernungsmessung Eine weitere nützliche Funktion von SpatiaLite, die auch im OpenGIS Standard beschrieben ist[19], ist DISTANCE(). Sie erwartet zwei Parameter vom Typ Geometry. Im folgenden Beispiel soll die Entfernung der Augsburger Universität zum Königsplatz ausgegeben werden. Dafür benötigt man zuerst die jeweiligen Koordinaten. Diese können ohne viel Aufwand über die Internetseite openrouteservice.org herausgefunden werden. Openrouteservice ist ein frei verfügbarer Routenplaner, basierend auf den Daten von openstreetmap. Open-Source Geodatenbanken 9 org. Um die Koordinaten für die Universität in Augsburg herauszunden, kann folgendermaÿen vorgegangen werden: Man gibt im Abschnitt "Routenplaner" als Startpunkt "Augsburg Universität" ein und klickt auf "Setze". Die Karte wird nun im rechten Teil der Seite auf den entsprechenden Kartenausschnitt eingestellt. In der Kartenansicht bendet sich auch ein grüner Pfeil, welcher die soeben gesuchte Position anzeigt. Wenn der Pfeil mit der Maus verschoben wird, ändert sich automatisch der Inhalt des Eingabefeldes der Startposition zu den Koordinaten, auf die der Pfeil zeigt. Diese Koordinaten können ebenfalls zum Eintragen in die Datenbank verwendet werden. Nachfolgend werden Beispieldaten für die Universität und den Königsplatz in die Tabelle Cities eingetragen: INSERT INTO Cities(WUP_AGGL, Geometry) VALUES('Augsburg UNI', GeomFromText('POINT(10.898868 48.333856)', 4326)); INSERT INTO Cities(WUP_AGGL, Geometry) VALUES('Augsburg Königsplatz', GeomFromText('POINT(10.894311 48.365317)', 4326)); Zu Beachten ist dabei noch, dass spatialite-gui nur das erste SQL-Statement durchführt, auch wenn im Eingabefeld mehrere eingetragen sind. Man muss also beide gesondert einfügen und ausführen. Die Kommandozeilenversion führt wie erwartet alle Statements aus. Nun möchte man die Entfernung zwischen der Universität und dem Königsplatz herausnden: SELECT DISTANCE( (SELECT Geometry FROM Cities WHERE WUP_AGGL LIKE 'Augsburg UNI'), (SELECT Geometry FROM Cities WHERE WUP_AGGL LIKE 'Augsburg Königsplatz')) AS 'Entfernung'; Es stellt sich jedoch die Frage, in welcher Einheit das Ergebnis 0.031789 vorliegt. Wenn man sich die spatial_ref_sys Spalte noch einmal genauer ansieht, erkennt man, dass dort eine Spalte proj4text existiert. Diese Spalte ist für die Projektion zuständig. In der Ausgabe von SELECT srid, ref_sys_name, proj4text FROM spatial_ref_sys WHERE srid = 4326 OR srid = 32632; wird ersichtlich, dass bei SRID 32632 in der proj4text-Spalte der Text "+units=m" enthalten ist. In der entsprechenden Spalte der SRID 4326 ist kein solcher Wert enthalten. Man kann also davon ausgehen, dass Geodaten mit der SRID 32632 die Einheit Meter benutzen. Also noch einmal die Entfernungs-Abfrage, diesmal mit transformierten Daten: 10 Open-Source Geodatenbanken SELECT DISTANCE( (SELECT Transform(Geometry,32632) FROM Cities WHERE WUP_AGGL LIKE 'Augsburg UNI'), (SELECT Transform(Geometry,32632) FROM Cities WHERE WUP_AGGL LIKE 'Augsburg Königsplatz')) AS 'Entfernung(m)'; Das Ergebnis ist dieses Mal: 3514.086873. Die Entfernung von der Universität zum Königsplatz beträgt also ca 3,5 Kilometer. 4.5 Umkreisbestimmung Um, wie in der Einleitung beschrieben, Freunde in der Nähe ausndig machen zu können, gibt es mehrere Möglichkeiten. Da die Beispieldatenbank nicht aus Positionen von Freunden besteht, wird angenommen, dass die eigene Position "Augsburg UNI" ist und die Freunde jeweils in anderen Städten sitzen. Gesucht werden Freunde, die sich in Orten im Umkreis von beispielsweise 130 Kilometern benden. Da wieder mit der SRID 32632 gearbeitet werden muss, um Strecken in Metern anzugeben, merkt man sich die Textdarstellung der eigenen Position im gewünschten Koordinatensystem: SELECT ASTEXT(Transform(Geometry,32632)) FROM Cities WHERE WUP_AGGL LIKE 'Augsburg UNI'; Das Ergebnis ist: "POINT(640727.734896 5355150.367024)" Das weiter Vorgehen besteht darin, alle Orte zu nden, die höchstens 130 Kilometer von "Augsburg UNI" entfernt sind: Die oensichtlichste, jedoch nicht ezienteste Methode, wäre, alle Städte auszugeben, deren Entfernung zur eigenen Position maximal 130 km beträgt: SELECT WUP_AGGL FROM Cities WHERE DISTANCE( PointFromText('POINT(640727.734896 5355150.367024)', 32632), Transform(Geometry,32632)) <= 130000; Als Ergebnis erhält man neben Augsburg, Augsburg UNI und Augsburg Königsplatz auch noch München und Nürnberg. Eine ezientere Methode besteht darin, einen Rahmen mit dem Radius 130 Kilometer um die eigene Position zu erstellen und zu prüfen, welche Städte darin enthalten sind. SpatiaLite unterstützt "minimal bounding rectangles" und bietet mit der Funktion BuildCircleMBR(x, y, Radius, SRID) auch eine einfache Möglichkeit solche zu erstellen. Hierbei ist zu beachten, dass es sich beim daraus resultierenden geometrischen Objekt nicht um einen Kreis, sondern um das kleinste Quadrat, das den Kreis enthält, handelt. Ein einfaches Contains(BuildCirleMBR(..), ..) reicht also nicht aus. Da auch Städte mit einer Entfernung > 130 km im Rechteck enthalten sind, müssen diese noch gesondert ausgeltert werden. Dazu misst man wie im vorherigen Beispiel die exakte Entfernung: Open-Source Geodatenbanken 11 SELECT WUP_AGGL FROM Cities WHERE MBRContains( BuildCircleMBR(640727.734896, 5355150.367024, 130000, 32632), Transform(Geometry,32632)) AND Distance( PointfromText('POINT(640727.734896 5355150.367024)', 32632), Transform(Geometry,32632)) <= 130000; Da jetzt nur die Entfernung der Städte berechnet werden muss, die innerhalb des minimalen Rechtecks liegen, müsste diese Alternative schneller sein. Da beim Ausführen der verschiedenen Abfragen subjektiv kein Geschwindigkeitsunterschied festgestellt werden kann, bräuchte man eine exakte Möglichkeit die Ausführungszeit zu messen. Eine solche ist mit spatialite-gui aber nicht gegeben. Man kann jedoch die Kommandozeilenversion des Programms verwenden (unter Windows: spatialite.exe aus dem Archiv spatialite-tools-win-x86-2.3.1.zip). Hierzu schlieÿt man das Fenster von "spatialite-gui" und startet "spatialite" mit der Datenbank-Datei "world.sqlite" als Parameter. In der Eingabeauorderung von spatialite kann man mit dem Befehl .timer on einschalten, dass gemessen wird wie lange die Ausführung eines SQL-Statements dauert. Diese Zeit wird nach dem Ergebnis jedes Statements ausgegeben. Das Statement, das die Entfernung zu jeder Stadt in der Datenbank misst, dauert auf dem zum Testen verwendeten Netbook mit einer Taktrate von 800 MHz im Durchschnitt ca 0.4 Sekunden. Das Statement, das nur die Entfernung der Städte innerhalb des Rechtecks misst, dauert hingegen durchschnittlich nur ca 0.36 Sekunden. Es ergibt sich also ein Geschwindigkeitsvorteil von ca 11 %. References 1. PostGIS : News http://postgis.refractions.net/news/ Besucht: 05.05.2011 2. Refractions Research : PostGIS History http://www.refractions.net/products/postgis/history/ Besucht: 05.05.2011 3. SpatiaLite and VirtualShape version history http://www.gaia-gis.it/spatialite/changelog.html Besucht: 05.05.2011 4. SpatiaLite 2.4.0 RC-4 http://www.gaia-gis.it/spatialite-2.4.0-4/changelog.html Besucht: 05.05.2011 5. MySQL :: MySQL 3.23, 4.0, 4.1 Reference Manual :: 16 Spatial Extensions http://dev.mysql.com/doc/refman/4.1/en/spatial-extensions.html Besucht: 05.05.2011 12 Open-Source Geodatenbanken 6. MySQL :: MySQL 5.0 Reference Manual :: D.1.80 Changes in MySQL 5.0.16 (10 November 2005) http://dev.mysql.com/doc/refman/5.0/en/news-5-0-16.html Besucht: 05.05.2011 7. MySQL :: MySQL 5.6 Reference Manual :: D.1.3 Changes in MySQL 5.6.1 (Not released Milestone 5) http://dev.mysql.com/doc/refman/5.6/en/news-5-6-1.html Besucht: 05.05.2011 8. MySQL :: MySQL 5.6 Reference Manual :: 11.17.5.4 Functions for Testing Spatial Relations Between Geometric Objects http://dev.mysql.com/doc/refman/5.6/en/functions-for-testing-spatial-relations-between-geometric-ob html#functions-that-test-spatial-relationships-between-geometries Besucht: 05.05.2011 9. Thomas Brinkho. Open-Source-Geodatenbanksysteme. Datenbank-Spektrum, Heft 22, pp. 37.44, dpunkt-Verlag, August 2007 10. SQL Features That SQLite Does Not Implement http://www.sqlite.org/omitted.html Besucht: 05.05.2011 11. SpatiaLite SQL functions reference list http://www.gaia-gis.it/spatialite/spatialite-sql-2.3.1.html Besucht: 05.05.2011 12. MySQL :: GIS and Spatial Extensions with MySQL http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html Besucht: 05.05.2011 13. SpatiaLite C APIs reference list http://www.gaia-gis.it/spatialite/spatialite-C-API-2.3.1.html#p12 Besucht: 05.05.2011 14. SpatiaLite v.2 tutorial http://www.gaia-gis.it/spatialite-2.0/SpatiaLite2-tutorial.html#t5 Besucht: 05.05.2011 15. SpatiaLite precompiled binaries download page http://www.gaia-gis.it/spatialite/binaries.html Besucht: 05.05.2011 16. SpatiaLite Resources http://www.gaia-gis.it/spatialite/resources.html Besucht: 05.05.2011 17. Augsburg Wikipedia http://de.wikipedia.org/wiki/Augsburg Besucht: 05.05.2011 18. GeoHack - München http://toolserver.org/~geohack/geohack.php?pagename=M%C3% BCnchen&language=de&params=48.136944444444_N_11.575277777778_E_region: DE-BY_type:city%281330440%29 Besucht: 05.05.2011 19. SpatiaLite SQL functions reference list http://www.gaia-gis.it/spatialite/spatialite-sql-2.3.1.html#p13 Besucht: 05.05.2011