mobile GIS Open Source Geodatenbanken Benjamin Winter Einführung Internet auf Smartphones integrierte GPS-Sensoren in vielen Geräten → einfache Möglichkeit seinen Standort mitzuteilen daher große Menge an Geodaten Zur effizienten Verwaltung sind Datenbanksysteme notwendig Open Source Systeme bieten guten Einstieg Inhalt Geschichte der Open-Source Geodatenbankysteme PostGIS MySQL SpatiaLite Funktionsumfang Anwendungsbeispiele SpatiaLite Geschichte PostGIS Entwicklung beginnt 2001 GEOS-Bibliothek entsteht Portierung von JTS Topology Suite nach C++ 2003 Simple Feature Access vollständig implementiert 2006/2007 Fokus auf SQL/MM Standard Beschreibt mehr geometrische Objekte Geschichte MySQL Räumliche Erweiterungen seit 2003 (v 4.1) Seit 2005 (v5.0.16) Unterstützung für mehr Engines Nur für MyISAM Storage Engine InnoDB, NDB, BDB, Archive Exakte topologische Prädikate seit v5.6.1 (11. April 2011) Intersects, Touches, Overlaps Geschichte SpatiaLite Erweiterung von SQLite Entwicklungsbeginn März 2008 Integration der GEOS-Bibliothek seit Juni 2008 Integration der PROJ.4 Bibliothek seit September 2008 Standard ”Simple Feature Access” vollständig implementiert Ermöglicht Koordinatentransformationen Seit Dez 2009 Optimierungen, neue Funktionen Letzte Entwicklerversion Nov 2010 Funktionsumfang MySQL Kleinster Funktionsumfang Simple Feature Access nur zu großen Teilen umgesetzt Keine Verschneidungsoperationen (Union, Intersection) SRID außer Speicherung keine Berücksichtigung in Berechnungen Zugrundeliegendes Koordinatensystem wird immer als planar Betrachtet Funktionsumfang SpatiaLite Aufbau auf SQLite Eingeschränkte SQL-Funktionen: ALTER TABLE: nur RENAME und ADD COLUMN möglich DELETE, INSERT, UPDATE nicht möglich auf Views Trigger: FOR EACH STATEMENT nicht implementiert Funktionsumfang SpatiaLite Nutzt GEOS und PROJ.4 Bibliotheken Simple Feature Access vollständig implementiert Transformation von Geodaten in verschiedene Koordinatensysteme möglich Unterstützt Module zum Zugriff auf beliebige Datenquellen Enthaltene Module: VirtualShape: liest und schreibt Shapefiles VirtualText: liest CSV-Dateien VirtualNetwork: Routing mit Dijkstra-Algorithmus Anwendungsbeispiele Vorbereitungen SpatiaLite als Datenbanksystem Keine Installation und Einrichtung nötig Benötigt: spatialite-gui (direkt ausführbare Datei) http://www.gaia-gis.it/spatialite/binaries.html Beispieldatenbank: world.sqlite http://www.gaia-gis.it/spatialite/world.7z (gepackt) Anwendungsbeispiele Anwendungsbeispiele Geodaten anzeigen Anwendungsbeispiele Neueinträge SQL-Statement: SELECT WUP_AGGL, AsText(Geometry) FROM Cities WHERE CNTRY_Name LIKE 'Germany'; Beispiel einer Zeile: Munich | POINT(11.5833 48.1333) Augsburg ist noch nicht enthalten Welche Koordinaten hat Augsburg? Anwendungsbeispiele Neueintrag In Wikipedia Stadt suchen und auf den Link mit den Koordinaten klicken zweite Zeile sieht brauchbar aus Koordinaten von München in Datenbank vertauscht und nicht komplett identisch Analog: Well-Known-Text von Augsburg ist POINT(10.898333 48.371667) Anwendungsbeispiele Neueintrag Anwendungsbeispiele Neueintrag Anwendungsbeispiele räumliche Lagebeziehungen Alle Städte innerhalb Deutschlands suchen SQL: SELECT WUP_AGGL AS Name FROM Cities, Countries WHERE Countries.CNTRY_Name LIKE 'Germany' AND Contains(Countries.Geometry, Cities.Geometry); Anwendungsbeispiele Entfernungsmessung Luftlinie zwischen Universität Augsburg und Königsplatz soll gemessen werden Diese Orte müssen noch eingetragen werden Einfacher Weg, um an die Koordinaten zu kommen: http://openrouteservice.org/ gesuchten Ort als Startpunkt eingeben grünen Pfeil in Kartenansicht auf exakte Position verschieben Koordinaten aus dem Eingabefeld des Startpunktes auselesen Anwendungsbeispiel Entfernungsmessung Ansichtsausschnitt der Seite http://openrouteservice.org/ Anwendungsbeispiel Entfernungsmessung gewünschte Positionen eintragen: 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)); Anwendungsbeispiel Entfernungsmessung Entfernung messen: 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'; Ergebnis: 0.031789 Was für eine Einheit? Anwendungsbeispiel Entfernungsmessung Anwendungsbeispiel Entfernungsmessung Vorher in geeignetes Koordinatensystem transformieren: 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)'; Ergebnis: 3514.086873 Anwendungsbeispiel Umkreisbestimmung Ziel: alle Orte in einem bestimmten Umkreis bestimmen Beispiel: Städte herausfinden, die im Umkreis von 130 km um ”Augsburg UNI” liegen Zwei Möglichkeiten: 1. Messung der Entfernung von Augsburg UNI zu jedem Ort in der Datenbank 2. filtern der Orte durch ”MBR, minimal bounding rectangle” und nur Messung der Entfernung innerhalb dieses Rechtecks Anwendungsbeispiele Umkreisbestimmung Zweite Möglichkeit ist schneller, da MBRs effizient von der Datenbank verwaltet werden können Exakte Entfernung muss trotzdem noch gemessen werden, da MBR keinen Kreis beschreiben minimal bounding rectangle En t fe rn un g Anwendungsbeispiele Umkreisbestimmung Entfernung in Metern, Geodaten mit geeignetem Koordinatensystem verwenden Geodaten von Augsburg UNI in Koordinatensystem mit SRID 32632 herausfinden SELECT ASTEXT(Transform(Geometry,32632)) FROM Cities WHERE WUP_AGGL LIKE 'Augsburg UNI'; Ergebnis: POINT(640727.734896 5355150.367024) Anwendungsbeispiel Umkreisbestimmung ohne MBR SQL-Statement: SELECT WUP_AGGL FROM Cities WHERE DISTANCE( PointFromText('POINT(640727.734896 5355150.367024)', 32632), Transform(Geometry,32632)) <= 130000; Ergebnis: Augsburg, Augsburg UNI, Augsburg Königsplatz, München und Nürnberg Anwendungsbeispiel Umkreisbestimmung mit MBR Erstellen eines MBR mit Radius 130 km um Augsburg UNI: BuildCircleMBR(640727.734896, 5355150.367024, 130000, 32632) finden der Städte in diesem Rechteck mit MBRContains(...) Exakte Entfernungsbestimmung mittels Distance(...) Anwendungsbeispiel Umkreisbestimmung mit MBR Komplettes Statement: 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; Ergebnis: Augsburg, Augsburg UNI, Augsburg Königsplatz, München und Nürnberg Anwendungsbeispiel Zeitmessung Kein subjektiver Geschwindigkeitsunterschied zwischen beiden Varianten zur Umkreisbestimmung Exakte Zeitmessung nur mit Kommandozeilenversion von SpatiaLite möglich Befehl ”.timer on” wird schaltet Zeitmessung ein Dauer einer Abfrage wird nach dem Ergebnis dieser angezeigt Anwendungsbeispiel Zeitmessung - Beispiel Verwendete Hardware: Netbook mit einer CPUTaktrate von 800 Mhz Durchschnittliche Dauer der Umkreisbestimmung ohne MBR Durchschnittliche Dauer der Umkreisbestimmung mit MBR ca 0,4 Sekunden ca 0,36 Sekunden Geschwindigkeitsvorteil ca 11% Vielen Dank für die Aufmerksamkeit Fragen?