Namespaces in logseq since v0.8.9

Namespaces in logseq are as simple as using a slash in the page’s title. If you have worked with namespaces in a logseq version, which is lower than v0.8.9, you should migrate your existing pages according to the “New file name rules”. These rules are mentioned almost at the end of release note. Otherwise you might notice some weird behaviour with the pages in a namespace.

The migration via GUI can be found in logseq: Settings → Advanced → File name format and there is an Edit button, which should be clicked and the instructions in the popup window need to be followed. In your logseq graph this will rename all pages with a slash, where the slash will be replace by three underscores.

OsmAnd: How to create a layer with custom POIs

This blog post describes how to create a POI (Point Of Interest) layer in OsmAnd. The layer highlights all locations of a specific POI type, e.g. table tennis locations, toilets, bicycle repair stations.

tl;dr: There is a German version of this post fitting in one Mastodon toot.

Add a custom POI layer

Start OsmAnd

At first you need to start OsmAnd of course.

Create a POI filter

Open Burger menu

Open the main menu of OsmAnd. That is the burger menu in the bottom left.

Start screen of Osmand with the burger menu highlighted

Configure Map

Select the Configure Map option.

Main menu of OsmAnd

Open POI overlays

Select the POI overlay… option.

Configure map view

Search for custom POI type

Now you see a lot of POI categories, which you could already use. To create a custom category open the Search.

POI overlay menu

Enter the custom type of POI you want to display, e.g. bicycle repair station and select the first search search result.

Search screen for POIs

Create a custom filter

Select the filter button right next to text Show bicycle repair station on the map.

Search result for the POI type

You are in the view to create a customized filter now. You could enable different options here, which are depending on the type of POI. I want to see all bicycle repair stations, which are mapped in OpenStreetMap.org. So i do not enable any option here. Open the kebab menu.

Filter view

Select the only option Save filter.

Filter view with opened kebab menu

Enter a custom name or leave it as is and select Save.

Filter save dialog

Enable custom POI layer

Use you back key or back gesture to go back to map. Open the POI overlay view again.

Start screen of Osmand with the burger menu highlighted Main menu of OsmAnd Configure map view

Now, you can see the option Bicycle repair station. This represents the filter we have just created. Select it. (I do not know why it is displayed twice. I select the first option.)

Search screen for POIs with our custom POI added

Our custom POI overlay is active now.

POI overlay menu with enabled custom POI

Explore the map

You can see all bicycle repair stations being mapped in OpenStreetMap. Before and after:

Start screen of Osmand with the burger menu highlighted Map view with all custom POI locations being highlighted

Add data to the map

Of course it is possible to add more POIs to the map. You can directly add the data on OpenStreetMap.org. It is easier to use a specialized editor to add POIs you know. I can recommend Mapcomplete. It provides different themes for different types of POIs. For example, there is a theme for adding bicycle infrastructure (incl. repair stations) or toilets or table tennis.

When you have added data to OpenStreetMap, be sure to wait for the map data update in OsmAnd. Map data is usually captured at the first day of the month. In the following days the update files are created and deployed. So, the worst case in waiting time is for data being added on the second day of the month, where you would have to wait more than a month to get the updated map data.

If you have got OsmAnd+, you could enable Live Updates for your region in order to get the map updates earlier.

Multiple POI layers

In the POI overlay view there is an option, where you can select multiple POI types to be displayed. Select the multiple check marks in the bottom left.

Search screen for POIs with multiple option highlighted

OpenStreetMap Karten generieren mit Map Machine

Karte des Stralsunder Hafens mit map-machine gerendert, auf OpenStreetMap basierend

tl;dr: Dieser Artikel beschreibt, wie man mit Map Machine, das in einem Docker Container läuft, Karten als SVG basierend auf OpenStreetMap generieren kann.

Map Machine ist ein Projekt, das die Fülle und Vielfalt der Daten von OpenStreetMap zeigen möchte. Es ist ein Map Renderer, der in Python geschrieben ist und unter MIT License auf GitHub veröffentlicht ist.

Um das das Docker Image für das Map Machine-Projekt bauen zu können, benötigen wir selbstverständlich auf unserem Rechner docker und git. Auf git könnte man verzichten, wenn man sich das Repository als gepacktes Zip herunterlädt. Dann benötigt man halt die Software zum Zip entpacken.

Wenn Docker noch nicht installiert ist, so gibt es Anleitungen z.B. für Ubuntu oder Archlinux.

Zunächst erzeugen wir eine lokale Kopie. Dazu müssen wir das das Repository clonen (oder herunterladen und entpacken):

git clone https://github.com/enzet/map-machine.git

Anschließend können wir in das Verzeichnis map-machine wechseln, um das Docker Image zu bauen:

docker build --pull -t strubbl_mapmachine .

Bei diesem Kommando ist der Punkt am Ende wichtig, denn er steht für das aktuelle Verzeichnis. Das bedeutet, dass im aktuellen Verzeichnis nach der Bauanleitung (Dockerfile) für dieses Image gesucht wird.

Der Name für das Image strubbl_mapmachine ist frei gewählt und kann natürlich anders lauten. In den folgenden docker-Kommandos muss dies dann entsprechend angepasst werden.

Während das Image gebaut wird, können schon einige Vorbereitungen getroffen werden, um gleich einen sinnvollen Aufruf an Map Machine zu formulieren.

  1. Es muss ein Verzeichnis angelegt werden, in dem die Karten später zu finden sind. Außerdem sollte es ein Unterverzeichnis darin geben, um einen Karten-Cache anzulegen und zu nutzen. Ich möchte die Karten unter $HOME/data/mapmachine/maps und somit die Cache-Daten unter $HOME/data/mapmachine/maps/cache ablegen. Durch die Verwendung der Variablen $HOME wird automatisch das eigene Home-Verzeichnis verwendet, z.B. /home/strubbl. Ich erstelle also die von mir gewünschten Verzeichnisse mit dem Ausführen des Befehls mkdir -p $HOME/data/mapmachine/maps/cache.
  2. Der Bereich der Karte, die wir erstellen wollen, wird benötigt. Das nennt sich Bounding Box oder kurz bbox. Dafür gibt es ein kleines Tool von Klokan, damit man sich den gewünschten Kartenausschnitt aussuchen kann. Oben links in dem Tool ist Button mit einem Pfeil der auf ein Rechteck zeigt. Wenn man dieses Werkzeug auswählt, kann man ein Rechteck (die bbox) in der Karte zeichnen. Dieses kann man auch nachträglich noch in der Größe anpassen. Die bbox sollte nicht zu groß gewählt werden, weil in diesem Beispiel hier die Daten direkt über die OpenStreetMap API abgefragt werden. Man kann auch über die Programmargumente eine XML-Datei mit den Kartendaten angeben, um keine Anfrage an die OpenStreetMap API senden zu müssen. Wenn die bbox fertig eingezeichnet ist, kann man im unteren Teil Copy & Paste des Tools die bbox als Text kopieren. Das Format für die bbox sollte CSV sein. Dann erkennt man die durch Kommata getrennten zwei Koordinaten.
  3. Schließlich benötigen wir noch das Zoom-Level der Karte. Der Standardwert ist 18, wenn wir keinen angeben.

Wenn diese drei Informationen zusammengetragen sind und das Docker Image erfolgreich gebaut wurde, kann man einen Container basierend auf dem Image starten, der die Karte erstellt und sich dann wieder beendet.

Ein Aufruf könnte wie folgt aussehen:

docker run -v $HOME/data/mapmachine/maps:/maps strubbl_mapmachine render \
  --cache=/maps/cache -z=17 -o=/maps/stralsund-hafen.svg \
  -b=" 13.089452552,54.313679518,13.1049235336,54.3194871239"

Aufgeschlüsselt bedeutet jeder Teil des Kommandos folgendes:

  • Mit docker run drückt man aus, dass man einen Container starten will.
  • Nach dem -v kommt zunächst der Pfad auf unserem PC, wo die genierten Karten hingeschrieben werden sollen: $HOME/data/mapmachine/maps. Dann folgt ein Doppelpunkt und der Container-interne Pfad /maps.
  • Anschließend folgt der Name des Docker Images, hier strubbl_mapmachine.
  • render ist das erste Argument, dass an den map-machine-Befehl gesendet wird, um mitzuteilen, dass eine Karte generiert werden soll.
  • Mit --cache und dem folgenden Pfad /maps/cache gibt man an, wo Daten, die über die OpenStreetMap API abgefragt werden, zwischengespeichert werden. Diese können dann wiederverwendet werden.
  • Das Zoom-Level wird über -z 17 angegeben, das hier auf Stufe 17 festgelegt wird.
  • Den Dateinamen für die Karte kann man über den Parameter -o festlegen. Die Datei sollte unterhalb des Container-internen Verzeichnisses /maps/ liegen, sodass wir die Datei auch auf unserem lokalen Pfad verfügbar haben und sie nicht im Container gespeichert wird, worauf wir nicht zugreifen können sobald der Container beendet wurde. Der Container-interne Pfad wird durch unseren lokalen Pfad gemappt, siehe Parameter -v.
  • Die bbox wird über den -b-Parameter angegeben. Die Angabe der Koordinaten mit den Anführungszeichen und dem Leerzeichen in der Form ist wichtig, weil es sonst zu einem bekannten Fehler kommen kann.

Man muss in diesem Docker-Kommando nicht map-machine mit angeben, weil es das Standardkommando beim Aufruf des Containers ist. Das ist so im Dockerfile definiert.

Mit dieser gewählten kleinen bbox und dem Zoom-Level 17 dauert die Generierung nur ein paar Sekunden (ca. 10 s auf einem i3-6100U mit SSD). Ein größeres Zoom-Level oder eine größere bbox verlängern den Prozess und die Größe der SVG-Kartendatei. Z.B. die Generierung einer Karte mit der gleichen bbox aber Zoom-Level 19 dauert in etwa doppelt so lange, wobei dank Nutzung des Caches keine neuen Daten von der OpenStreetMap API abgefragt werden müssen.

Wenn das Docker-Kommando fertig ist, haben wir im Pfad $HOME/data/mapmachine/maps/stralsund-hafen.svg unsere generierte Karte liegen.

Danke an Manfred für das Testen des Artikels und die Rückmeldungen. So haben wir zusammen den o.g. Bug gefunden.

Kartieren eines Neubaugebiets in Lancken mit Drohnenfotos

In diesem Beitrag möchte ich kurz zusammenfassen, wie ich beim Kartieren eines Neubaugebietes für OpenStreetMap vorgegangen bin, für das es noch keine aktuellen Luftbilder gibt.

Warum?

Ausgehend von einer Diskussion mit dem OpenStreetMap-Nutzer Pferdo, die wir ursprünglich wegen eines Wanderweges gestartet hatten, kamen wir schnell auf das in der Nähe entstehende Neubaugebiet in Lancken. Die derzeit aktuellsten Luftbilder von Bing sind an dieser Stelle verpixelt. Luftbilder anderer Anbieter wie Esri, Maxar oder Mapbox sind leider in dieser Gegend zu veraltet.

Bings Luftbilder sind verpixelt

Das liegt vermutlich daran, dass das Gebiet die ehemalige Flugabwehrraketenabteilung 4335 der NVA war und das immer noch als zu zensierendes Gebiet bei Bing vermerkt ist. Pferdo bot an, von dem Neubaugebiet Fotos mit Hilfe seiner Drohne anzufertigen und ich bot an, das in OpenStreetMap zu kartieren. Und da wären wir nun für den Ausgangspunkt dieses Blogeintrags.

Vorbereitung

Fotos auswählen

Die mir vorliegenden Drohnenaufnahmen zeigen einerseits das Neubaugebiet aus der Perspektive und aus der Draufsicht. Zum Kartieren wähle ich mir die Draufsichtfotos aus. Die Fotos von der Seite sind gut, um einzusortieren, wo die Fotos der Draufsicht anzuordnen sind.

PicLayer Plugin installieren

Um die Fotos in JOSM als Hintergrundebene einfügen zu können, benötigt man ein Plugin. Das heißt PicLayer und wird über die Einstellungen im Bereich Plugins installiert.

Einstellungen Plugins PicLayer installieren

Fotos in JOSM laden und ausrichten

Anschließend gibt es im Menü Imagery einen Menüpunkt namens New picture layer from file…. In der folgenden Dateiauswahl suche ich die Fotos, die ich als Hintergrund nutzen möchte aus und füge sie als neue Ebenen hinzu.

PicLayer Menüeintrag

Nun folgt der schwierigste Teil. Man muss jedes einzelne Foto skalieren und drehen, um es an den vorhandenen Daten und Luftbilder auszurichten. Das hat mich hier am meisten Zeit gekostet.

Wireframe View der OSM-Daten und das Foto als Hintergrund inkl. Anmerkungen

Nachdem das Foto als Ebene geladen ist, blende ich zunächst alle Foto- und Luftbilderebenen aus bis auf die eine, die ich ausrichten möchte. Nun muss man das kleine grüne Häkchen setzeni (1), um die Ebene zu aktivieren. Dann erst erhält man auf der linken Werkzeugleiste die Möglichkeiten zum Verschieben (2), Drehen (3) und Größe ändern (4).

Hintergrundfoto am ESRI Luftbild ausgerichten

Zum Ausrichten kann man nicht nur die OSM-Daten, sondern auch die anderen vorhandenen Luftbilder, wie z.B. die von ESRI, benutzen.

Endresultat: Alle Fotos einigermaßen ausgerichtet

Das ganze Ausrichten mache ich noch mit zwei weiteren Bildern. Wenn schließlich alle Bilder ausgerichtet sind, kann man endlich kartieren.

Verzerrungen an den Rändern der Fotos

Man sieht anhand der Verzerrungen an dem Rand der Fotos, dass die Bilder nicht perfekt ausgerichtet sind. Dazu müssten sie wahrscheinlich ordentlich zugeschnitten und die Verzerrungen am Rande der Bilder anpasst werden. Einfacher wäre es gewesen, wenn man statt mehrerer Fotos einzeln eine Collage der Fotos als eine Bilddatei erstellt. Dann müsste man nur diese eine Bilddatei als Hintergrundbild ausrichten und einpassen. Um das aber in kürzerer Zeit hinzubekommen als das einzelne Ausrichten der Fotos, bräuchte ich mehr Bildbearbeitungserfahrung.

Endresultat

Schließlich kann kartiert werden und das Endergebnis hochgeladen werden, © OpenStreetMap-Mitwirkende:

Neubaugebiet Lancken in OSM vorher Neubaugebiet Lancken in OSM nachher