|
1 | 1 | # OSM Routing |
2 | 2 |
|
3 | 3 | ## Projektziel |
| 4 | +Ziel des Projektes ist die Schaffung der technischen Infrastruktur, welche die Entwicklung eines Navigationssystems für körperlich behinderte Menschen ermöglicht. |
| 5 | +Es soll möglich sein, den kürzesten Weg zwischen zwei Nodes eines OpenStreetMap Datensets zu ermitteln. |
| 6 | +Der ermittelte Weg soll von einem Menschen mit körperlicher Behinderung komplett begehbar sein. |
| 7 | +Das System soll ausserdem eine Wegbeschreibung des ermittelten Weges generieren. |
4 | 8 |
|
5 | 9 | ## Architektur |
6 | 10 | Im folgenden wird eine Übersicht über die Architektur des Systems gegeben. Dazu gehören ein Diagramm über die einzelnen Softwaremodule, eine Beschreibung des Ablaufs einer Anfrage sowie eine Übersicht über die verwendeten Erlang Module. |
7 | 11 |
|
8 | | -### Diagramm |
| 12 | + |
9 | 13 |  |
10 | 14 |
|
11 | 15 | ### Bearbeitung einer Anfrage an das System |
| 16 | +1. HTTP Anfrage wird gesendet. |
| 17 | +2. Der Server erhält die Anfrage. Die Bearbeitung der Anfrage übernimmt das Erlang System. |
| 18 | +3. server:request() wird aufgerufen. Diese Funktion dient der Erkennung der Art der Anfrage und zur Weiterleitung an die entsprechenden Submodule. |
| 19 | +4. requests:route() wird aufgerufen. Diese Funktion berechnet die Route der Anfrage. Dies geschieht mithilfe der Funktionen des astar Erlang moduls. |
| 20 | +5. Die Funtionen aus dem astar Modul greifen zur Berechnung der Route auf das geodata Erlang Modul zu. Das geodata Modul dient als High-Level API für die Datenbank. Alle Anfrage des geodata Moduls an die Datenbank laufen über das store Modul, welches als Low-Level API für diese dient. |
| 21 | +6. Nachdem die Route berechnet ist wird die HTTP Antwort in JSON enkodiert. Anschliesend sendet die Funktion server:request() die HTTP Antwort. |
12 | 22 |
|
13 | 23 | ### Erlang Module |
14 | 24 | #### astar |
| 25 | +Dieses Modul implementiert einen A* Algorithmus, um den kürzesten Weg zwischen zwei Knoten zu finden. |
| 26 | + |
15 | 27 | #### geodata |
| 28 | +Diese Modul dient als High-Level API für die Datenbank. Alle Zugriffe auf die Datenbank laufen über dieses Modul. |
| 29 | + |
16 | 30 | #### osm_parser |
| 31 | +Mithilfe dieses Moduls ist es mögich eine .osm Datei auszulesen und deren Inhalt in der Datenbank zu sichern. |
| 32 | +Die Daten werden beim Einlesen über generische Regeln gefiltert. So lassen sich leicht für Behinderte ungeignete Wege aus dem Datenset entfernen. |
| 33 | + |
17 | 34 | #### priority_queue |
| 35 | +Dieses Modul implementiert eine Prioritätswarteschlange, welche vom Routing-Algorithmus benötigt wird. |
| 36 | + |
18 | 37 | #### requests |
| 38 | +Dieses Modul implementiert die HTTP Antworten des HTTP Servers. |
| 39 | + |
19 | 40 | #### routing |
| 41 | +Dieses Modul dient als Schnittstelle für das komplette System. Andere Erlang Systeme sollten über diese Schnittstelle mit dem Routingsystem kommunizieren. |
| 42 | + |
20 | 43 | #### server |
| 44 | +Dieses Modul implementiert die HTTP API des Servers. Es ist nur die Serverlogik und die JSON Serialisierung enthalten. |
| 45 | + |
21 | 46 | #### store |
| 47 | +Dieses Modul dient als API der ets Tabellen. Die ets Tabellen sollten nur über diese API angespochen werden. |
22 | 48 |
|
23 | 49 | ## Softwarekomponenten |
24 | 50 | ### Programmiersprache |
25 | | -Die Wahl der Programmiersprache viel auf Erlang. |
| 51 | +Die Wahl der Programmiersprache des Backends viel auf Erlang. |
26 | 52 |
|
27 | | -Pro: |
| 53 | +PRO: |
28 | 54 |
|
29 | 55 | * Virtuelle Maschine: |
30 | | -Erlang läuft auf einer VM. Damit ist es sehr leicht möglich ein Programm zu ändern, während es läuft, ohne es komplett neu zu kompilieren und neu zu starten. Dies erhöht die Produktivität. |
31 | | - |
| 56 | +Erlang läuft auf einer VM. Damit ist es sehr leicht möglich ein Programm im laufenden Betrieb zu ändern, ohne es komplett neu zu kompilieren und neu zu starten. Dies erhöht die Entwickler-Produktivität. |
| 57 | + |
32 | 58 | * Referenzielle Transparenz: |
33 | | -Da der einzige Effekt einer nebeneffektfreien Funktion ihr Rückgabewert ist, sind Sie leichter zu verstehen als Prozeduren. |
| 59 | +Da der einzige Effekt einer nebeneffektfreien Funktion ihr Rückgabewert ist, ist Sie leichter zu verstehen als eine Prozedur. |
34 | 60 |
|
35 | 61 | * Deklarative Sprache: |
36 | 62 | Erlang ist eine Deklarative Sprache. Im vergleich zu imperativen Sprachen führt das zu kürzeren, leichter verständlichen Programmen. |
37 | 63 |
|
38 | 64 | * Leichtgewichtige Prozesse: |
39 | 65 | Prozesse sind Teil der Erlang VM und nicht Teil des Betriebssystems. Dadurch sind Sie wesentlich leichtgewichtiger als OS Prozesse oder sogar Threads. Auf einem handelsüblichen Rechner ist es möglich mehrere hundertausend Erlang Prozesse laufen zu lassen. Damit ist Erlang optimal für ein asynchrones und ausfallsicheres System geeignet. |
40 | 66 |
|
41 | | - |
42 | | -Kontra: |
| 67 | +KONTRA: |
43 | 68 |
|
44 | 69 | * Performancekritischer, sequentieller Code: |
45 | | -Durch die Indirektion der VM geht ein Teil der Performance der Hardware verloren. Obwohl der grösste Teil des Systems durch IO Operationen dominiert wird, gibt es kleine performancekritische, sequentielle Code Stücke (z.B. der routing Algorithmus). Hier könnte man durch eine Hardwarenhe Sprache wie C eine verbesserte Abtwortzeit erreichen. |
| 70 | +Durch die Indirektion der VM geht ein Teil der Performance der Hardware verloren. Obwohl der grösste Teil des Systems durch IO Operationen dominiert wird, gibt es kleine, performancekritische, sequentielle Codestücke (z.B. der routing Algorithmus). Hier könnte man durch eine Hardwarenahe Sprache wie C eine verbesserte Antwortzeit erreichen. |
46 | 71 |
|
47 | 72 | ### Datenbank |
| 73 | + |
| 74 | +Als Datenbank werden mehrere ets Tabellen verwendet. |
| 75 | + |
| 76 | +* http://www.erlang.org/doc/man/ets.html |
| 77 | + |
| 78 | +PRO: |
| 79 | + |
| 80 | +* Einfache API: |
| 81 | +Da ets Tabellen einfache Key-Value Stores sind, sind Sie sehr einfach zu benutzen. |
| 82 | + |
| 83 | +* Erlang Modul: |
| 84 | +ets Tabellen sind Teil des Erlang Systems. Damit sind Sie direkt über Erlang Syntax verwendbar. Darüber hinaus werden die Abhängigkeiten des Systems nicht unnötig erweitert. |
| 85 | + |
| 86 | +* In-Memory Datenbank: |
| 87 | +ets Tabellen werden komplett im Hauptspeicher gehalten. Zugriffe auf die Tabellen sind damit sehr schnell. |
| 88 | + |
| 89 | +KONTRA: |
| 90 | + |
| 91 | +* Speicherverbrauch: |
| 92 | +Da alle Tabellen komplett im Hautspeicher gehalten werden, verbrauchen diese viel Platz. Es ist somit nicht möglich extrem grosse .osm Dateien einzulesen. |
| 93 | + |
48 | 94 | ### Algorithmus |
49 | | -### HTTP Server |
| 95 | +Zur Berechnung der kürzesten Route zwischen zwei Knoten wird der A-Star Algorithmus verwendet. |
| 96 | + |
| 97 | +PRO: |
| 98 | + |
| 99 | +* Einfach |
| 100 | +A-Star ist leicht zu implementieren. Sämtliche in vergleichbaren Systemen implementierten Algorithmen basieren auf A-Star mit zusätzlichen Optimierungen. |
| 101 | + |
| 102 | +KONTRA: |
| 103 | + |
| 104 | +* Speicherbedarf |
| 105 | +Da alle besuchten Knoten in einer Liste gahelten werden, benötigt A-Star im worst-case sehr viel Speicher. |
| 106 | + |
| 107 | +### HTTP API |
| 108 | +Das gesamte System wird über eine HTTP Schnittstelle angesprochen. |
| 109 | + |
| 110 | +PRO: |
| 111 | + |
| 112 | +* Universelle API: |
| 113 | +Sowohl lokale Anfragen als auch Netzwerkanfragen können über eine API getätigt werden. |
| 114 | + |
| 115 | +* Einfache API: |
| 116 | +HTTP Anfragen sind sehr einfach zu stellen. Es existiert zu jeder populären Sprache ein entsprechendes Modul. |
| 117 | + |
| 118 | +KONTRA: |
| 119 | + |
| 120 | +* Nichts (bei der Art des Systems). |
| 121 | + |
| 122 | +##Performanz-Tests |
| 123 | +Ausgewertet wurden verschiedene Metriken von drei Routen unterschiedlicher Länge: |
| 124 | + |
| 125 | +| Metrik | Rohrbach - Uni | OMZ Uni - Mensa Uni | OMZ Uni - Mannheim | |
| 126 | +| - | - | - | - | |
| 127 | +| Zeit | 82 ms | 190 ms | 1520 ms | |
| 128 | +| Nodes in Ergebnis | 20 | 25 | 71 | |
| 129 | +| Pfadlänge | 460 m | 4151 m | 17 866 m | |
| 130 | +| Besuchte Nodes in Algorithmus | 451 | 2550 | 15816 | |
| 131 | +| Speicherbedarf | 44 k words | 220 k words | 1338 k words | |
| 132 | + |
50 | 133 |
|
51 | 134 | ## Weiterentwicklung |
52 | 135 | ### Geochouch |
| 136 | +Es bietet sich an, das Routing-System an GeoCouch anzuknüpfen. GeoCouch ermöglicht die Berechnung von Bounding-Box Anfragen, welche für eine weitere Verbesserung der Wegbeschreibung und einen fortgeschrittenen Name-Server nötig sind. |
| 137 | +Da GeoCouch/CouchDB ebenfalls in Erlang implementiert wurde, ließe sich das Routing System sogar zu einem CouchDB-Plugin entwickeln. Das hätte den Vorteil einer schnelleren Daten-Zugriffszeit und würde das Deployment erleichtern. |
| 138 | +Ein mit GeoCouch gebundeltes Routing System bietet beste Vorraussetzungen zur Entwicklung von Routing-Webapps. Der Entwickler dieser Apps müsste lediglich JavaScript und HTML beherrschen, da die komplette Backend-Funktionalität von GeoCouch abgedeckt werden kann. |
| 139 | + |
| 140 | +* https://github.com/couchbase/geocouch |
| 141 | +* http://www.couchbase.org/ |
| 142 | + |
| 143 | +###GeoJson |
| 144 | +Sämtliche APIs des Routing-Systems sollten auf GeoJson standardisiert werden. GeoJson ist ein leichtgewichtiger Standard für Geo-Daten, der sich wachsender Beliebtheit in der Webentwicklung erfreut. |
| 145 | +Die Standardisierung würde die Verwendung vor allem von UI-libraries deutlich erleichtern. |
| 146 | + |
| 147 | +* http://geojson.org/ |
| 148 | + |
53 | 149 | ### Polymaps |
54 | | -### Algorithmus |
| 150 | +Polymaps ist eine JavaScript library, die das Erstellen stark angepasster und dynamischer Karten ermöglicht. Als karthografische Ressourcen können OpenStreetMap, Google Maps, Bing und weitere Anbieter eingebunden werden. |
| 151 | +Die Anpassung und das Anzeigen zusätzlicher Informationen (Pfade, Lables, Statistiken, ...) auf der Karte erfolgt über SVG und GeoJson. |
| 152 | +Es eignet sich besonders Polymaps zusammen mit d3.js zu verwenden - eine weitere Javascript library, die das Erstellen datengetriebener Dokumente ermöglicht. |
| 153 | +Hinter Polymaps und d3.js stehen herraussragende Entwickler der Stanford Visualization Group und eine weitere Wartung der libraries ist sicher. |
| 154 | + |
| 155 | +* http://polymaps.org/ |
| 156 | +* http://mbostock.github.com/d3/ |
| 157 | + |
| 158 | +## Mitwirkende |
| 159 | +* Johannes Auer |
| 160 | +* Haykuhi Jaghinyan |
| 161 | +* Mirko Kiefer |
0 commit comments