Um Kartendaten auch offline zugreifbar zu machen habe ich einen Weg gefunden um MBTiles mit TileStache auszuliefern.
Was sind MBTiles
MBTiles ist ein spezielles Dateiformat um gekachelte Bitmaps, sogenannte Tiles in einer einzelnen Datei zusammenzufassen. Erfunden wurde das MBTiles Format von MapBox die das Format als Ausgabedatei des Kartenrenderers TileMill einsetzen.
Der Vorteil des Formats liegt darin, dass es unter der Haube eine SQLite Datenbank ist. Diese Datenbank enthält die eigentlichen Bilddaten. Für den Nutzer gibt es nur noch eine einzelne Datei die er kopieren muss und der Zugriff auf die Daten ist über eine Schnittstellenbeschreibung klar geregelt. Um Speicherplatz zu sparen können identische Bitmaps (zum Beispiel Wasser) so abgelegt werden, dass sie nur einmal gespeichert werden und die anderen Stellen nur darauf verweisen.
Mittlerweile unterstützen auch viele Smartphones das Format so dass es sich auch dazu eignet dort die Daten offline dabei zu haben.
Mein Einsatzzweck ist JOSM
Für mich war aber ein anderer Einsatzzweck das Ziel. Ich möchte die Daten in JOSM, dem Java Editor für OpenStreetMap, als Hintergrundbild verwenden. Da JOSM das MBTiles Format (noch) nicht direkt lesen kann benötige ich eine Software die das MBTiles Format einlesen und für JOSM als TMS Dienst zur Verfügung stellt. Eine weitere Anforderung war, dass das ganze unter Windows laufen muss.
Leider habe ich keine schlanke Lösung gefunden die auf diesen speziellen Zweck optimiert ist, so dass ich etwas mehr dafür tun musste. Auch scheint Windows bei den Entwicklern nicht besonders beliebt zu sein, so dass die Installation reichlich kompliziert ist.
TileStache unter Windows installieren
Nach einiger Suche habe ich das Programm TileStache gefunden das unter anderem auch Daten im MBTile Format als TMS ausliefern kann. Unglücklicher weise ist das Programm in Python geschrieben und erfordert die Installation einiger Module.
Zuerst installiere ich die Python Distribution von ActiveState auf meinem Rechner. Ich verwende die Version 2.7, da die 3.x Serie von TileStache noch nicht unterstützt wird. Ein benötigtes Modul ist die Python Imaging Library (PIL). Diese installiert man am besten in Binärform.
Nachdem diese Voraussetzungen erfüllt sind kann man TileStache (mit allen weiteren Abhängigkeiten) und einen in TileStache verwendeten Server namens Werkzeug installieren. Auf der Kommandozeile erledigen das diese Aufrufe:
1 2 |
pip install -U TileStache pip install -U Werkzeug |
Das sollte die benötigten Module geladen und installiert haben. Bei mir unter c:\Python27.
Als nächstes muss noch die Konfiguration angepasst werden.
TileStache konfigurieren
In der Konfiguration teilt man den Namen des neuen Tile Layers mit sowie den Speicherort der MBTile Datei. Bei mir sieht es wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "cache": { "name": "Test", "path": "tmp/stache", "umask": "0000" }, "layers": { "thaimap": { "provider": {"name": "mbtiles", "tileset": "Thaimap.mbtiles"}, } } } |
Die Konfiguration habe ich in ein eigenes Verzeichnis zusammen mit der MBTiles Datei gelegt. Zum selbst ausprobieren stelle ich eine kleine MBTiles Datei zum Download bereit. Diese enthält in knapp 60MB eine zweisprachige Übersichtskarte von Thailand bis Zoom Level 12, generiert aus OSM Daten. Die Daten selbst stehen unter der ODbL, die MBTiles sind CC-BY-SA.
MBTiles mit TileStache ausliefern
Wenn alles gut ging lässt sich nach einem Wechsel in das Verzeichnis der Server starten. Dieser meldet nach kurzer Ladezeit Bereitschaft.
1 2 |
python c:\Python27\Scripts\tilestache-server.py --config=tilestache.cfg --port=4040 * Running on http://127.0.0.1:4040/ |
JOSM konfigurieren
Als letzter Schritt muss der soeben erzeugte Layer in JOSM als Hintergrund hinzugefügt werden. Danach können die Tiles offline verwendet werden. Für JOSM ist es kein Unterschied (außer der Geschwindigkeit) wo die Tiles herkommen.