AvnNav Karten Konvertieren

Avnav Karten und Overlays

Einführung

Karten

Damit Karten in der WebApp verwendet werden können, müssen sie in einem „Kachelformat“ vorliegen. Das ist das Format, das durch Dienste wie OpenStreetMaps oder GoogleMaps benutzt wird. Eine Kartenkachel ist 256x256 Pixel gross. Die Welt wird dabei auf eine ebene Fläche projiziert (das kann man sich wie einen Papierzylinder vorstellen, der senkrecht steht und am Äquator um die Erde gewickelt wird). Jeder Punkt mit seinen Koordinaten (Länge/Breite) wird dann auf diesen Zylinder projiziert. Wie man das macht, welche Einheiten in der Projektion verwendet werden, und ob die Erde als Kugel oder Ellipsoid mit verschiedenen Parametern modelliert wird, beschreiben die verschiedenen Projektionen. Die WebApp benutzt die sogenannte Google-Mercator Projektion (die Erde wird dabei als Kugel betrachtet) - mit dem EPSG code 900913. Die Einheiten auf dem Papier sind dabei Meter (die man natürlich in die entsprechenden Koordinaten umrechnen kann). Karten in einem anderen Format (z.B. WGS84 – Erde als Ellipsoid, immer in Grad) müssen daher ggf. reprojiziert werden.

Die gesamte Projektionsfläche wird bei der Google Projektion in Kacheln unterteilt. Der Zoom Level gibt an, in wieviele Kacheln die Fläche unterteilt wird. Zoom Level 0 bedeutet: die gesamte Erde (von -85° bis +85° Breite – darüber ist die Projektion nicht definiert) auf einer Kachel von 256x256 Pixel. Mit jedem weiteren Zoom Level wird feiner unterteilt: Zoom Level 1: 2x2 Kacheln, 2: 4x4 Kacheln usw. Für uns reichen die interessanten Zoom Level von ca. 7 bis 18..19. Das bedeutet (Level 19) 2^19x2^19 Kacheln.

Zur Darstellung wird die Library openlayers verwendet. Diese lädt die entsprechenden Kartenkacheln je nach Zoom Level vom Raspberry und zeigt sie an. OpenStreetMaps verwendet typischerweise diese Library.

Man kann sich leicht vorstellen, dass bei hohen Zoom Levels schnell große Datenmengen zusammenkommen. Daher müssen wir für unsere Kartenkacheln ähnlich vorgehen, wie es auch bei den Papierkarten ist: für Übersichten ein kleinerer Zoom Level, Detailkarten größer und z.B. Hafenpläne dann mit Level 18 oder 19 (60cm/pixel bzw. 30cm/pixel). Um damit arbeiten zu können, werden die verschiedenen Detailgrade dann in Layern (Schichten) übereinandergelegt. Wenn es für ein Gebiet einen Layer mit besserem (grösserem) Zoom Level gibt, wird dieser angezeigt - wenn nicht, der mit der geringeren Auflösung (ggf. noch vergrössert). Um unsere Anzeigegeräte nicht zu überlasten, kann man typisch mit 3-5 Kartenlayern arbeiten (je nach Gerät...).

Damit besteht für die Kartenkonvertierung die Aufgabe darin, vorhandene Karten in solche Layer einzusortieren, sie ggf zu reprojizieren und dann die Kartenkacheln (sowie eine Beschreibungsdatei) zu erzeugen. Das erfordert meist eine ganze Menge Rechenleistung (und ggf. Zeit), daher ist das etwas, das auf einem PC oder Laptop laufen sollte (der Pi braucht potentiell sehr lange dafür). Das ist aber nicht schlimm – man muss das ja nur einmal machen. Belohnt wird man dafür mit einer sogenannten „blattschnittfreien“ Darstellung.

Für den Download gilt Vergleichbares - hier muss man geeignet die Zoom Level und Bereiche auswählen.

Das Verfahren dazu hängt von der Quelle ab. Im Moment habe ich Support für 3 „Wege“ der Kartenerstellung eingebaut:

  • Konvertierung von Karten mittels GDAL (z.B. BSB) – hier kann alles gelesen werden, was GDAL kann

  • Nutzung von online Karten (und deren Download) mit Hilfe von MapProxy - über das MapProxy Plugin
  • Nutzung von downloads mit dem Mobile Atlas Creator.

Kartenformate

AvNav nutzt als primäres Kartenformat das GEMF Format - das ist ein kompaktes Format - anstelle von sehr vielen einzelnen Dateien sind diese in einem großen File zusammengefaßt. Mit diesem Format können auch spezielle Funktionen wie eine automatische Anpassung des Zoom Levels ermöglicht werden.   
Ab der Version 20200325 kann AvNav auch direkt das mbtiles Format lesen. Bei diesem Format muss ggf. noch die richtige interne Anordnung der Kacheln gewählt werden - der Standard is "xyz", es gibt aber auch Dateien, die im "tms" Format vorliegen. Eine Umschaltung kann auf der Files/Download Seite erfolgen. MbTiles können z.B. direkt von OpenSeamap heruntergeladen werden.
Hinweis: Bis Version 202011xx hat AvNav einen Eintrag "scheme" in den Metadaten von mbtiles Files ausgewertet. Leider ist die Benutzung nicht wirklich klar geregelt und verschiedene Quellen nutzen das unterschiedlich (siehe auch Issue #63). AvNav hat auch intern xyz und tms genau invers verwendet. Mit der Version 202011xx ignoriert jetzt AvNav diesen Wert und nimmt tms an. Falls er in den Metadaten vorhanden ist, wird die Karte in rot angezeigt, über die Download-Seite kann dann gewählt werden, welche interne Kodierung genutzt werden soll.

Zusätzlich können (ab 20200325) auch Online Kartenquellen eingebunden werden, wenn sie ein entsprechendes URL Format unterstützen. Die Konfiguration erfolgt über XML Dateien. Ein Beispiel ist die mitgelieferte Quelle für OpenSeaMap.

Ab Version 20200515 können mit einem Plugin auch Karten von o-charts verwendet werden.

Ab Version 202011xx können (wenn die signalK Integration aktiv ist) auch Karten genutzt werden, die im signalK chart provider vorhanden sind.

Mit dem MapProxy Plugin können online Karten von verschiedenen Quellen eingebunden werden.

Installation von Karten

Nach der Installation ist in AvNav zunächst nur eine/einige Online-Demo-Karten vorhanden. Zur realen Nutzung müssen die Karten zunächst bei AvNav installiert werden.
Das kann durch direkte Kopie in das Karten-Verzeichnis (/home/pi/avnav/data/charts) bzw. in das externe Kartenverzeichnis unter Android erfolgen. Alternativ können die Karten auch direkt in der WebApp hochgeladen werden (einige erst ab 20200325). Das Hochladen erfolgt auf der Files/Download Seite.
Für Android ist zu beachten, dass mbtiles Karten nur gelesen werden können, wenn sie hochgeladen wurden, nicht aus dem externen Karten Verzeichnis.
Für mbtiles bitte auch diesen Hinweis auf der Files/Download Seite beachten.

In den normalen Versionen (nicht Android) können ab 20200325 auch Karten, die erst noch konvertiert werden müssen direkt hochgeladen werden. AvNav enthält immer auch den unter Konvertierung beschriebenen Konverter. Der liest Dateien aus seinem Import Verzeichnis (/home/pi/avnav/data/import) bzw. aus Unterverzeichnissen. Wenn beim Hochladen eine Karte mit einem Dateinamen für den Konverter gewählt wird (z.B. .kap), dann wird gefragt, ob diese direkt dem Konverter übergeben werden soll. Der Arbeitszustand des Konverters kann auf der Status Seite beobachtet werden. Es sollte dabei beachtet werden, das die Konvertierung ein rechenintensiver Prozeß sein kann, der auf einem Raspberry Pi viele Stunden dauern kann. Das sollte daher ggf. auf einem Desktop Rechner erfolgen.

Wenn das MapProxy plugin installiert ist, werden dessen Karten in AvNav sofort sichtbar und müssen nicht getrennt installiert werden.

Overlays

Ab Version 20201219 kann AvNav über (und unter) den eigentlichen Karten noch weitere Informationen anzeigen bzw. Karten können kombiniert werden.

Für Details siehe Overlays.

Konvertierung von Karten

Die Konvertierung kann direkt auf dem Raspi erfolgen. Da hier die Resourcen jedoch ziemlich begrenzt sind, muß mit längeren Laufzeiten gerechnet werden (Beispiel: Auf einem Raspi 2 dauerte das Konvertieren eines älteren NV Satzes (Ostsee 4) ca. 1 Stunde).

Einfacher geht die Konvertierung auf einem Windows (oder Linux/Mac) Rechner. Für die nötigen Installationen siehe: Der Hauptteil der Konvertierung wird durch tiler_tools durchgeführt (https://code.google.com/p/tilers-tools/) diese sind Bestandteil der Software und müssen nicht extra heruntergeladen werden..

Die Karten werden per Default im Verzeichnis <UserHome>/AvNavCharts/out erzeugt (also z.B. c:\Users\Andreas\AvNavCharts\out). Zumindest in der Windows GUI kann das Verzeichnis gewählt werden. Standarmäßig ensteht für jeden Konverter-Lauf eine xxx.gemf Datei, xxx ist dabei der Dateiname der ersten Datei oder der Name des ersten gewählten Verzeichnisses.

Im AvNavCharts Verzeichnis gibt es auch noch ein work-Verzeichnis, dieses sollte nicht gelöscht werden, da dann bei einem Update (z.B. werden Berichtigungen eingepflegt) nur die geänderten Karten neu erzeugt werden müssen.

Die Konvertierung verläuft in 2 Schritten:

  • Sortierung der Karten in Layer (und ggf. soweit nötig Konvertierung der karten).

  • Erzeugung der Kacheln

  • Erzeugung der gemf Datei

Wenn die Datei xxx.gemf erzeugt wurde, diese auf den raspberry installieren.
Man kann auch die Karte direkt auf dem Desktop Computer testen - nach Abschluss der Konvertierung wird der AvNav Server gestartet und man kann sich mit einem Browser verbinden.

Windows

Der Net-Installer (AvNavNet...) für Windows installiert neben der eigentlichen Konverter-Software auch die nötigen Programme:

  • python 2.7.10 (32 Bit)
  • GDAL 1.11 für python 2.7 (32 Bit)
  • Pillow 2.7.0
  • pyserial 2.7
Der Installer wird unter ProgramFiles\AvNav installiert. Wenn AvNav deinstalliert wird, werden nur diese Anteile mit entfernt.
Die nachgeladenen Teile werden im Home-Verzeichnis des Nutzers installiert und müssen aus der UI deinstalliert werden.
Nach der Installation kann man mit AvChartConvert die Applikation starten.

Die Applikation hat nur einen Bildschirm:

windows gui

Bei (1) können die zu konvertierenden Karten gewählt werden, bei (2) startet die Konvertierung. Es wird eine Log Datei geschrieben, die man mit "view" anschauen kann (das hätte ich auch gerne, wenn etwas nicht funktioniert).

Mit den Default-Einstellungen startet danach sofort der AvNav Server (also die Software, die sonst auf dem Raspberry läuft) und ein Browser wird geöffnet, der die App anzeigt.

Wenn die nötige Software noch nicht installiert wurde, öffnet sich ein Dialog, der die Installation anbietet und die nötigen Teile aus dem Netz nachlädt. Mit (5) kann das für ein Update wiederholt werden (die aktuell vorhandene Version wird angezeigt). Mit (4) kann die nachinstallierte Software entfernt werden.

Wie im Bild zu sehen, liefere ich eine Datei mit NMEA Daten mit (vom Greifswalder Bodden). Es kann natürlich zum Test auch jede andere eigene NMEA-log Datei gewählt werden.

Alternativ kann der Server auch direkt die NMEA Daten von einem angeschlossenen seriellen Gerät oder Bluetooth lesen (COM port) oder auch z.B. von einem Raspberry (IP). Wenn spezielle Setups erforderlich sind, kann man über 'custom' auch die Server-Konfiguration per Hand bearbeiten, eine Vorlage mit Kommentaren wird mitgeliefert.

Mit diesem Setup kann die Software damit also auch komplett z.B. and Bord auf einem Windows-Laptop benutzt werden. Die Funktionen sind die gleichen wie mit dem Raspberry.

Wenn man nur den Server starten möchte - (3) "startServer". Das muß man auch nach jeder Änderung tun.

Linux

Wie unter Installation beschrieben, startet man avnav -g und wählt auch hier die zu konvertierenden Karten.

Details

Im Folgenden werden die Konvertierungsschritte beschrieben - normalerweise muss man sich darum nicht kümmern - nur wenn die default-Einstellungen der GUI nicht gut genug sind...

Der erste Schritt geht relativ schnell. Alle Kartendateien werden gelesen, Auflösung und Abdeckung werden ermittelt (falls nötig wird konvertiert). Im Ergebnis entsteht im workdir/<name> Verzeichnis eine Datei chartlist.xml. Der Aufruf dazu lautet:

read_charts.py -g -o name -m chartlist inputdir [inputdir...]

Anschliessend sollte die chartlist.xml noch einmal mit einem Texteditor überprüft werden, manchmal macht es Sinn, Kartendateien noch einem anderen Layer zuzuordnen. Das kann einfach durch Verschieben des entsprechenden XML Elements erfolgen. Man kann sich dazu an den Namen der Karten orientieren - meist mach es Sinn Karten vergleichbaren Detailgrades in einen Layer zu verschieben.

Der zweite Schritt ist etwas langwieriger, hier erfolgt die eigentliche Erzeugung der Kartenkacheln. Der Aufruf:

read_charts.py -g -o name -m generate inputdir [inputdir...]

Unter workdir/<name> muss bereits eine chartlist.xml existieren. Die Erzeugung läuft multi-threaded, auf einem Dual Core 2x2Ghz ca. 20 min für einen Kartensatz mit ca. 20 Karten.

Zum Schluss muss man noch die gemf Datei erzeugen

read_charts.py -g -o name -m gemf inputdir [inputdir...]

Man kann auch alle Schritte kombinieren – dazu einfach -m all noch vor den anderen Parametern bei Schritt 1 angeben:

read_charts.py -g -m all [-o name] inputdir

MapProxy plugin

Es gibt ein Plugin, das MapProxy einbindet und damit Zugriff auf viele Online Kartenquellen erlaubt. Das Plugin unterstützt bei der Konfiguration von MapProxy und erlaubt das komfortable Herunterladen von Karten. Für Details siehe die plugin Beschreibung.

Es bietet viele Funktionen, die dem Mobile Atlas Creator ähneln, und kann diesen damit weitgehend ersetzen.

Download von Karten mit dem Mobile Atlas Creator

Für die Nutzung des Mobile Atlas Creators ist ausser Java und dem MOBAC selbst keine weitere Software auf dem PC/Laptop nötig. Man muss beim Download der Karten allerdings ein gewisses Schema einhalten, damit die Karten in das oben beschriebene Layer-Konzept passen und die Datenmengen überschaubar bleiben.

Dazu sollte man (je nach Kartenquelle) z.B. 3 Layer vorsehen: Übersicht( Zoom Level 7-10) Navigation (level 10-15), Details (Level 16-18). Anschliessend sollte man im MOBAC layerweise vorgehen. Dazu jeweils als gewünschte Zoom Level die zum Layer gehörigen anklicken (links oben), danach alle Teilbereiche jeweils markieren und unter einem beliebigen Namen dem Atlas hinzufügen. Das jeweils für die anderen Layer wiederholen (dabei sinnvolle Auswahlen treffen). Anschliessend sollte man die Atlas-Konfiguration unter einem beliebigen Namen speichern - die kann man ggf. noch für weitere Versuche brauchen. Als output Format OsmDroid GEMF (File->convertAtlasFormat) wählen und die Atlas-Erzeugung starten. Im output Verzeichnis entsteht eine xxx.gemf Datei. Diese auf den raspberry installieren.
Auf der Mapsources Seite sammle ich chart sources für den mobac, die für uns nützlich sein könnten.