home
erste Version am 15.04.2017
letzte Änderung am 22.04.2017

OpenStreetMap in einem wx.Window


Bald geht die Fahrrad-Saison wieder los.
Also werde ich demnächst weitere GPS-Tracks erzeugen, für die ich bisher jedoch noch kein Visualisierungs-GUI habe, welches sich direkt mittels Python steuern ließe.
Will heißen: ein Ersatz für den Workaround mit dem hier.


Inhalt

Version 1.2 - klappt schon gut aber ruckelt noch etwas beim scrollen
dann doch etwas Doku - Übersicht der Funktionen
Version 1.3
Überlegungen und Tests zu asynchroner Map-Aufbereitung - aber wxPython macht Zicken
Erweiterungen
Version 1.3d
Version 1.4c



Meine Suche nach einer fertigen Library war nicht erfolgreich. Hier gibt es zwar eine lange Liste von Kandidaten, aber entweder passte mir die gebotene Funktionalität nicht - oder es wurden zu viele andere Libraries benötigt, die ich nicht alle auf meinem System haben wollte.

Die erste Selbstbau-Version war an einem Wochenende zusammengebastelt. Sie hat die Tiles noch synchron (eins nach dem andern) geladen und vor allen Dingen hat sie den Mittelpunkt des Fensters als Referenzpunkt verwendet. Das brachte diverse Problemchen mit sich. Also weg damit und neu machen....

Die zweite Version sah zuerst ganz gut aus. Sie hat allerdings weiterhin mit einem statischen Faktor pro aktuellem Bildausschnitt gerechnet, um von Längen-/Breitengraden nach Pixel-Koordinaten hin und her zu wandeln. Leider klappt das beim Längengrad nicht. Speziell bei kleinen Zoom-Stufen passte die gelieferte Position deutlich nicht. Weil es bei Zoom-Stufen >=15 aber wenig auffällt, habe ich es erst relativ spät erkannt. Also noch ein Fehlversuch für die Tonne.
Den Faktor hatte ich aus dem Abstand eines Tiles und seinem Folge-Tile berechnet - weil ich für ein Tile nur seine Basis-Koordinate berechnen konnte.

Wegen der eben genannten Probleme bin ich irgendwann auf die Idee gekommen, dass ich der dafür genutzten Funktion deg2num() aus dem OSM-Wiki das Abschneiden der Nachkommastellen abgewöhnen könnte.

Version 1.2

Und damit kam es zu der ersten brauchbaren Version 1.2, um die es im weiteren Text geht.

Screenshot vom wxOSM Demonstrator

In dem Archiv sind drei Dateien, die sich alle im selben Verzeichnis befinden müssen. Das auszuführende Script ist OSM_win.py.
Vor einem erfolgreichen Start sind ggf. noch ein paar Python-Libraries zu installieren.
Es werden von den Scripten zwar weitere Libraries geladen - diese sollten aber schon bei Python selbst mitgekommen sein.


Das Demonstrator-Script OSM_win.py zeigt zunächst eine Karte im Zoom-Level 16, bei der mein Haus im Zentrum liegt.
Scrollen des Bildes erfolgt wie von OpenStreetMap gewohnt mit der Maus. Zoomen per Mausrad ebenfalls.
Weiterhin können GPX-Tracks angezeigt und nachgefahren werden. Wird z.B. dieser GPX-Track (von unserer ersten Radtour 2017) in das Fenster gezogen und dort fallen gelassen, lädt das Script die Datei. Danach wird der Zoom-Level und Karten-Ausschnitt so angepasst, damit der Track vollständig angezeigt werden kann.
Mit der Taste A wird der Nachfahr-Modus eingeschaltet, bei dem der Track auf der Karte samt Geschwindigkeits-Anzeige nachgefahren wird. Die ESC-Taste beendet diesen Modus und mit der S-Taste kann die Geschwindigkeit zwischen langsam und schnell (nur bei hohen Zoom-Stufen) umgeschaltet werden.
Die Statuszeile enthält fünf Felder. Sie zeigen (von links nach rechts)
- den aktuellen Zoom-Level,
- die Anzahl der noch offenen Anfragen beim Tile-Server,
- die letzte Klick-Position in Pixeln,
- die letzte Klick-Position oder aktuelle Nachfahr-Position in lan/lon und
- im fünften Feld die Ortszeit der aktuellen Nachfahr-Position (natürlich nur im Nachfahr-Modus).

Durch Start des Demonstrator-Scripts wird ein Verzeichnis ~/tilecache/osm angelegt. Darin werden einmal heruntergeladene Tiles lokal gespeichert, um sie bei erneuter Nutzung von dort laden zu können.

Am Anfang von OSM_win.py wird ein Dictionary angelegt, in dem vier Tile-Server mit ihren Parametern definiert sind.
Die Auswahl des zu nutzenden Tile-Servers erfolgt über die Variable SERVER. Wird sie z.B. auf SERVER="OCM" geändert, werden zukünftig die Tiles von OpenCycleMap verwendet. Speziell für OpenCycleMap wird jedoch ein API-Key benötigt, den man sich für Hobby-Nutzung unter thunderforest.com aber kostenlos klicken kann. Und deren Server scheinen mir die Tiles mit einem Vielfachen der Geschwindigkeit der anderen drei getesteten Server auszuliefern (kann allerdings auch Tagesform gewesen sein - mehrere Tage lang!).

Auf die Dokumentation der einzelnen Funktionen von OSM_screen.py bzw. OSM_TileCache.py habe ich an dieser Stelle keine Lust.
Über jeder Funktion gibts einen entsprechenden Kommentar und OSM_win.py zeigt, wie jede Funktion genutzt werden kann.
Bei Bedarf bin ich ja auch per eMail oder Jabber erreichbar.

Vielleicht werde ich irgendwann noch eine Version 2.0 bauen, die die CPU beim Scrollen etwas weniger belastet.
Derzeit wird das Bild bei jedem Aufruf von drawMap() komplett neu aus Tiles zusammengesetzt.
Durch Einsatz von wx.MemoryDC() könnte sich da was machen lassen.....
Damit geht es auf der zweiten Seite weiter.