QVINTVS · SCRIBET

OpenStreetMap-Karten III: Aktualisierte Fassung zur Erstellung von Printkarten mit dem deutschen Stil

Der Artikel stellt eine aktualisierte Version eines früheren Artikels zur Erstellung von Printkarten mit dem deutschen OpenStreetMap-Stil dar.

I. Einleitung

Zuletzt erschien auf diesem Blog 2016 ein Artikel zu OpenStreetMap. Damals ging es um die Erstellung von Printkarten (also solchen zum Ausdrucken) mit dem deutschen OpenStreetMap-Stil. Seitdem haben sich einige Änderungen ergeben, weshalb dieser Beitrag sich erneut mit dem Thema beschäftigt. Er steht auch unter anderen Vorzeichen, denn seitdem hat der Verfasser die Linux-Distribution von Gentoo auf Debian gewechselt. Anders als in den vorigen Beiträgen zum Thema sind daher die Erklärungen auf Debian 10 zugeschnitten.

Zu diesem Beitrag wird in Kürze noch eine Ergänzung als eigener Beitrag veröffentlicht, der die graphische Darstellung von GPS-Spuren erklären wird.

II. Kartenmaterial

Man lege wie üblich ein Verzeichnis an, mit dem man experimentieren kann.

$ mkdir ~/osmtest
$ cd ~/osmtest

Weiterhin wird ein Auszug aus der OpenStreetMap-Geodatenbank benötigt. Wie bisher lassen sich derartige Auszüge von der Geofabrik GmbH beziehen. Diese sind recht groß, daher sollte der Download frühzeitig angestoßen werden – je nach ausgewählter Region sind hunderte Megabyte herunterzuladen. Dieser Beitrag nutzt den aktuellen Auszug für das Land Nordrhein-Westfalen. Bei der Formatwahl sollte man sich für die platzsparende Variante .osm.pbf entscheiden, sofern keine zwingenden Gründe dagegen sprechen.

$ wget http://download.geofabrik.de/europe/germany/nordrhein-westfalen-latest.osm.pbf

III. Software aus den Repositorien

Erfreulicherweise befinden sich unter Debian fast alle für die Zwecke dieses Beitrags erforderlichen Programme in den Standard-Repositorien. Die einzige Ausnahme (carto) wird unten behandelt. Es genügt daher die Installation der folgenden Pakete mithife von APT:

# apt install postgresql mapnik-utils postgis nik4 osm2pgsql \
  postgresql-11-postgis-2.5 libmapnik-dev nodejs npm fonts-noto

OpenStreetMaps Datenbank basiert auf PostgreSQL mit der GIS-Erweiterung PostGIS, was deren Installation erforderlich macht. Mapnik ist die Rendering-Software des OpenStreetMap-Projekts und kümmert sich um die graphische Darstellung der Daten (sog. Rendering). Der hier eingesetzte deutsche OpenStreetMap-Stil greift auf die Noto-Schriftenfamilie zurück, welche daher ebenfalls nötig ist. osm2pgsql ist ein Importwerkzeug u.a. für das PBF-Format und Nodejs und NPM sind (leider) für das Hilfsprogramm carto nötig, das unten unter IV. noch angesprochen wird.

Anders als es 2016 bei Gentoo der Fall war, sind bei der Debian-Version von PostgreSQL und PostGIS keine Inkompatibilitäten festzustellen. Etwas irritierend ist einzig, daß das Paket postgresql-11-postgis-2.5 nicht automatisch als Abhängigkeit von postgis mitinstalliert wird und deshalb gesondert an APT übergeben werden muß.

IV. carto

Der internationale wie der deutsche OpenStreetMap-Stil werden seit Jahren nicht mehr direkt im Eingabeformat von Mapnik (welches auf XML basiert) beschrieben, sondern in einer an CSS orientierten Sprache namens CartoCSS. Die U.S.-Firma MapBox, Inc. bietet hierfür ein (quelloffenes) Produkt namens carto an, welches CartoCSS in das von Mapnik benötigte XML-Format übersetzt und selbst in NodeJS geschrieben ist. NodeJS/NPM ist mit den Paketierungsmodellen stabiler Betriebssysteme inkompatibel und verursacht daher Paketierern erhebliche Probleme. carto ist wohl auch deshalb nicht in den Repositorien von Debian 10 enthalten und muß manuell installiert werden. Damit ist carto die einzige Abhängigkeit, die man nicht aus den Repositorien installieren kann. Dies führt leider dazu, daß sich der Prozeß der Kartenerstellung letztlich als eine Art bewegliches Ziel darstellt. Derzeit ist es es möglich, carto mit dem in Debian 10 enthaltenen Nodejs zu verwenden. Daß dies so bleibt, ist nicht nur nicht gewährleistet, sondern nachgerade unwahrscheinlich.

Die folgenden Kommandos installieren carto in der mit Debian 10 kompatiblen Version 1.2.0:

$ git clone https://github.com/mapbox/carto.git
[...]
$ cd carto
$ git checkout v1.2.0
Note: checking out 'v1.2.0'
[...]
$ npm install
npm WARN npm npm does not support Node.js v10.15.2
npm WARN npm You should probably upgrade to a newer version of node as we
npm WARN npm can't make any promises that npm will work with this version.
npm WARN npm Supported releases of Node.js are the latest release of 4, 6, 7, 8, 9.
npm WARN npm You can find the latest version at https://nodejs.org/
[...]
added 282 packages from 772 contributors in 2.518s

Nach Abschluß des NPM-Durchlaufs steht carto in bin/carto zur Verfügung, was dem Suchpfad für ausführbare Programme hinzuzufügen ist:

$ export PATH="$PWD/bin:$PATH"
$ cd ..

In einem früheren Beitrag hat der Verfasser die Frage aufgeworfen, ob magnacarto einen Ersatz für carto darstellen könnte. Konnte zu diesem Zeitpunkt magnacarto den Stil immerhin noch übersetzen (wenngleich mit Warnungen), scheitert dies nun mit Fehlermeldungen. Es bleibt dennoch zu hoffen, daß magnacarto sich zu einer ernsthaften Alternative zu carto entwickelt, um dem NodeJS-Problem zu entkommen.

V. Kartenstil

Ziel der Übung ist, Printkarten mit dem deutschen OSM-Stil zu erstellen, der etwa auf openstreetmap.de zum Einsatz kommt und gegenüber dem internationalen Stil auf deutsche Besonderheiten abgestimmt ist. Hierfür ist selbiger mithilfe von Git herunterzuladen. Um Probleme mit Entwicklerversionen zu vermeiden, sollte man außerdem auf eine getaggte Version zurückgreifen. Anders als früher1 gibt es nämlich mittlerweile spezielle Tags des deutschen Stils. Hier wird mit dem Tag v4.24.0-de1 gearbeitet.

$ git clone https://github.com/giggls/openstreetmap-carto-de
$ git checkout v4.24.0-de1

Der deutsche Kartenstil hat eigentlich eine Abhängigkeit von einer Software namens mapnik-german-l10n. Dabei handelt es sich um eine PostgreSQL-Erweiterung zur Transliteration von nicht-westlichen Schriften in lateinische Buchstaben. Deren Abhängigkeiten ziehen aber unter Debian 10 eine vollständige (!) LLVM-Installation nach sich. Wer nur Karten mit Gebieten erstellt, die lateinische Schriftzeichen (auch mit Akzenten) verwenden, kann darauf verzichten — für Gegenden innerhalb Deutschlands dürften also kaum jemals Probleme auftreten. Die Installationsdokumentation erwähnt allerdings zwar die Möglichkeit des Verzichts, läßt eine genauere Erklärung aber vermissen. Der Entwickler des deutschen OpenStreetMap-Stils, Sven Geggus, erklärte die Angelegenheit auf Nachfrage. Seine Ausführungen liegen dem im Anhang dargestellten Patch gegen Version v4.24.0-de1 zugrunde, welcher die Abhängigkeit von mapnik-german-l10n entfernt und außerdem noch ein Problem mit dem Download der Shapefiles behebt, auf das sogleich eingegangen wird. Der Patch ist als fix.patch abzuspeichern und wie folgt anzuwenden:

$ cd openstreetmap-carto-de
$ patch -p1 < ../fix.patch

Nun zu den erwähnten Shapefiles. Der deutsche (wie auch der internationale) Stil benötigen zur Darstellung sog. Shapefiles, das sind Geometriedateien, die große Objekte abbilden, z.B. die weltweiten Küstenlinien. Diese Shapefiles lädt das Skript openstreetmap-carto-de/scripts/get-shapefiles.py automatisiert herunter, oder sollte es jedenfalls. Tatsächlich schlägt die Ausführung des Skripts auch nicht fehl, sondern gibt vor, alles relevante herunterzuladen:

$ ./scripts/get-shapefiles.py

Starting get-shapefiles.py...
1-1. Downloading 'world_boundaries'...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 50.4M  100 50.4M    0     0  10.3M      0  0:00:04  0:00:04 --:--:-- 10.3M

1-2. Expanding 'world_boundaries'... Done.

1-3-2. Indexing 'data/world_boundaries/places.shp'...
max tree depth:8
split ratio:0.55
processing data/world_boundaries/places.shp
9994
length=1054
version=1000
type=1
extent:box2d(-175.2365875244140625,-41.2103958129882812,179.2218933105468750,66.1441192626953125)
 number shapes=251
 number nodes=406
done!

2-1. Downloading 'simplified-water-polygons-split-3857'...
[...]
...script completed in 81.6 seconds.

Allein, die heruntergeladen Daten sind unvollständig. Es fehlen die Shapefiles der Gruppen rivers-z, lakes-z und ocean-z, was beim späteren Rendering (unten VII.) einen Fehler auslöst. Ein Blick in das Skript get-shapefiles.py zeigt, daß die entsprechenden Befehle auskommentiert sind. Der Grund dafür findet sich bei der Quelle der Daten. Diese wurde vor einiger Zeit ausgetauscht, weil die alte Quelle den Dienst eingestellt hat. Die neue Quelle bietet aber die im Skript mit 7, 8 und 9 angegebenen Shapefiles mit den erwähnten Namen nicht an. Wer diese Shapefiles also nicht rechtzeitig heruntergeladen hat, steckt hier fest. Der oben vorgestellte Patch löst das Problem durch Entfernung der entsprechenden Stilangaben aus dem Stil. Das führt potentiell zu einer schlechteren Gesamtdarstellung, jedoch steht eine andere Möglichkeit derzeit nicht zur Verfügung.

Der Stil kann jetzt kompiliert, d.h. in das Mapnik-XML-Format übersetzt werden. Dafür genügt ein einfacher Aufruf von make.

$ make
carto -a 3.0.22 project.mml > /tmp/tmp.6Joq2bpP3H
Warning: landcover.mss:618:4 line-offset is unstable. It may change in the future.
Warning: landcover.mss:621:6 line-offset is unstable. It may change in the future.
Warning: Layer builtup has no styles associated with it.
Warning: Layer rivers-z1 has no styles associated with it.
Warning: water-features.mss:112:6 line-offset is unstable. It may change in the future.
Warning: water-features.mss:114:6 line-offset is unstable. It may change in the future.
Warning: water-features.mss:99:4 line-offset is unstable. It may change in the future.
Warning: water-features.mss:105:4 line-offset is unstable. It may change in the future.
Warning: roads.mss:621:10 line-offset is unstable. It may change in the future.
Warning: roads.mss:623:10 line-offset is unstable. It may change in the future.
Warning: roads.mss:615:10 line-offset is unstable. It may change in the future.
[...]
Warning: amenity-points.mss:1632:4 Styles do not match layer selector #text-poly-low-zoom.
Warning: admin.mss:115:6 Styles do not match layer selector #admin-low-zoom.
mv /tmp/tmp.6Joq2bpP3H osm-hrb.xml

Der Befehl läuft recht lange und generiert dabei ziemlich viele Warnungen. Allerdings scheinen die Warnungen zu keinen Problemen zu führen. Der fertige Stil befindet sich dann in der Datei osm-de.xml, nebst einer hier nicht weiter relevanten Variante osm-hrb.xml.

VI. PostgreSQL

PostgreSQL sollte für den Umgang mit den erheblichen Datenmengen noch etwas justiert werden, indem möglichst große Werte für work_mem und maintenance_work_mem in /etc/postgresql/11/main/postgresql.conf vorgesehen werden. Folgende Werte haben sich als angemessen herausgestellt:

work_mem = 1024MB
maintenance_work_mem = 2048 MB

Dabei ist natürlich die Größe des eigenen Arbeitsspeichers zu beachten. Mehr als vorhanden kann hier nicht vergeben werden.

In diesem Zusammenhang sollte man auch noch das Memory Overcommitting zulassen (diese Änderung ist nicht persistent und muß nach jedem Neustart neu gesetzt werden). Anschließend ist PostgreSQL neu zu starten.

# sysctl -w vm/overcommit_memory=1
# rc-service postgresql restart # Oder bei systemd mit systemctl

Nun sind die OpenStreetMap-Daten, die im ersten Schritt oben heruntergeladen wurden, in eine PostgreSQL-Datenbank einzupflegen. Dazu wechselt man zum Benutzer postgres und legt zunächst überhaupt erst einmal eine Datenbank an.

# su - postgres
$ psql
CREATE USER quintus WITH PASSWORD 'geheimespasswort';
CREATE DATABASE osm WITH OWNER quintus;
\q

Der Datenbankname osm ist zwingend. Er wird vom deutschen OpenStreetMap-Stil an verschiedenen Stellen referenziert und müßte sonst überall dort geändert werden.

Nun sind noch zwei Erweiterungen in die neue Datenbank zu laden:

$ psql osm
CREATE EXTENSION hstore;
CREATE EXTENSION postgis;
\q
$ exit # Verlasse Benutzer postgres

Die anderen in den früheren Beiträgen erwähnten Erweiterungen sind nicht nötig, weil in diesem Beitrag wie beschrieben auf mapnik-german-l10n verzichtet wird.

Der eigentliche Datenimport von PBF in die PostgreSQL-Datenbank erfolgt dann mit folgendem Kommando:

$ osm2pgsql -d osm -G -S hstore-only.style \
  -k -C 1000 --slim --number-processes `nproc` \
  --tag-transform-script openstreetmap-carto.lua \
  -p planet_osm_hstore \
  ../nordrhein-westfalen-latest.osm.pbf

Die Bedeutung der einzelnen Optionen kann in der Benutzerhandbuchseite zu osm2pgsql(1) nachgelesen werden. In der Gesamtgestaltung folgen diese Optionen aus der Datei INSTALL-de.md mit minimaler Modifikation (--slim für nicht ganz so leistungsfähige Rechner; die Koppelung mit nproc(1) nutzt alle Prozessorkerne aus). Dieses Kommando läuft recht lange (ca. vierzig Minuten).

Der deutsche OpenStreetMap-Stil nutzt die Daten nicht direkt, sondern nur über SQL-Views, die erst noch angelegt werden müssen. Der oben vorgestellte Patch verändert diese SQL-Views so, daß die Transliterationen mithilfe von mapnik-german-l10n entfallen. Sie können einfach wie folgt angelegt werden (folgt ebenfalls aus INSTALL-de.md):

$ psql -d osm -f osm_tag2num.sql
$ psql -d osm -f views_osmde/view-line.sql
$ psql -d osm -f views_osmde/view-point.sql
$ psql -d osm -f views_osmde/view-polygon.sql
$ psql -d osm -f views_osmde/view-roads.sql

VII. Karte erstellen

Damit sind die Vorarbeiten abgeschlossen. Mit dem Programm nik4 kann man jetzt eine Karte erzeugen. Beispielhaft hier für die Gegend rund um das Landtagsgebäude in Düsseldorf im Maßstab 1:5000 bei 600 DPI auf A4:

$ nik4 -s 5000 --ppi 600 -a 4 -c 6.76409 51.21815 \
  --margin 10 osm-de.xml /tmp/landtag.png
Mapnik LOG> 2019-12-25 21:20:53: warning: unable to find face-name 'Noto Sans CJK JP Regular' in FontSet 'fontset-0'
Mapnik LOG> 2019-12-25 21:20:53: warning: unable to find face-name 'Noto Sans Balinese Regular' in FontSet 'fontset-0'
[...]
Mapnik LOG> 2019-12-25 21:20:53: warning: unable to find face-name 'unifont Medium' in FontSet 'fontset-2'
Mapnik LOG> 2019-12-25 21:20:53: warning: unable to find face-name 'Unifont Upper Medium' in FontSet 'fontset-2'

Soweit ersichtlich, können die Warnungen über nicht vorgefundene Schriftarten ignoriert werden. Sie betreffen vornehmlich Gegenden, in welchen andere als lateinische Zeichen genutzt werden. Bei der Suche nach den korrekten Koordinaten für die Option -c erweist sich die OpenStreetMap-Webseite als recht praktisch – man kann sie nach Zentrierung der Karte auf dem gewünschten Ort einfach aus der URL ablesen.

Bricht Mapnik dagegen mit dieser Fehlermeldung ab:

Mapnik LOG> 2019-12-25 22:37:56: warning: unable to find face-name 'unifont Medium' in FontSet 'fontset-2'
Mapnik LOG> 2019-12-25 22:37:56: warning: unable to find face-name 'Unifont Upper Medium' in FontSet 'fontset-2'
Traceback (most recent call last):
  File "/usr/bin/nik4", line 323, in <module>
    mapnik.load_map_from_string(m, style_xml, False, style_path)
RuntimeError: Shape Plugin: shapefile 'data/river-polygons-reduced-3857/river_reduced_z0.shp' does not exist  encountered during parsing of layer 'rivers-z0' in Layer at line 8977

Dann liegt das oben unter V. angesprochene Problem mit den nicht existenten Shapefiles vor. Es kann durch Anwendung des dort vorgestellten Patches behoben werden.

Die so erzeugte Graphik enthält nur die reine Karte. Wenn diese nicht bloß für den Eigengebrauch erstellt wird, muß man nun mit einem Graphikprogramm noch den nach der Lizenz erforderlichen Urheberrechtshinweis auf der Graphik anbringen. Hat man das erledigt, kann man das Ergebnis dann auf A4-Papier ausdrucken. Es ist darauf zu achten, beim Druck dieselbe DPI-Zahl anzugeben wie beim Aufruf von nik4. 600 DPI entspricht einem feinen Druck mit vielen Details; nicht jeder Drucker ist dafür geeignet. Im Zweifel sind 300 DPI ein guter Wert.

VIII. Fazit

Die manuelle Erstellung von Printkarten gestaltet sich weiterhin kompliziert. Der Vorteil dieser Methode liegt aber neben einem besseren Verständnis für die Technik hinter OpenStreetMap in der Hoheit über die Daten und die praktisch unbegrenzten Anpassungsmöglichkeiten. Entweder durch Veränderung des CartoCSS oder direkt des Mapnik-XML können so Karten nach allen Bedürfnissen erzeugt werden. Mit der Frage, wie GPS-Spuren dargestellt werden können, soll sich ein Folgebeitrag beschäftigen.

IX. Anhang: Patch

diff --git a/project.mml b/project.mml
index 120e6d51..3702bfa8 100644
--- a/project.mml
+++ b/project.mml
@@ -259,144 +259,6 @@ Layer:
         ) AS water_lines
     properties:
       minzoom: 12
-  - id: rivers-z0
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z0.shp"
-      type: "shape"
-    properties:
-      maxzoom: 0
-    advanced: {}
-  - id: rivers-z1
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z1.shp"
-      type: "shape"
-    properties:
-      minzoom: 1
-      maxzoom: 1
-    advanced: {}
-  - id: rivers-z2
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z2.shp"
-      type: "shape"
-    properties:
-      minzoom: 2
-      maxzoom: 2
-    advanced: {}
-  - id: rivers-z3
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z3.shp"
-      type: "shape"
-    properties:
-      minzoom: 3
-      maxzoom: 3
-    advanced: {}
-  - id: rivers-z4
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z4.shp"
-      type: "shape"
-    properties:
-      minzoom: 4
-      maxzoom: 4
-    advanced: {}
-  - id: rivers-z5
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z5.shp"
-      type: "shape"
-    properties:
-      minzoom: 5
-      maxzoom: 5
-    advanced: {}
-  - id: rivers-z6
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z6.shp"
-      type: "shape"
-    properties:
-      minzoom: 6
-      maxzoom: 6
-    advanced: {}
-  - id: lakes-z0
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z0.shp"
-      type: "shape"
-    properties:
-      maxzoom: 0
-    advanced: {}
-  - id: lakes-z1
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z1.shp"
-      type: "shape"
-    properties:
-      minzoom: 1
-      maxzoom: 1
-    advanced: {}
-  - id: lakes-z2
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z2.shp"
-      type: "shape"
-    properties:
-      minzoom: 2
-      maxzoom: 2
-    advanced: {}
-  - id: lakes-z3
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z3.shp"
-      type: "shape"
-    properties:
-      minzoom: 3
-      maxzoom: 3
-    advanced: {}
-  - id: lakes-z4
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z4.shp"
-      type: "shape"
-    properties:
-      minzoom: 4
-      maxzoom: 4
-    advanced: {}
-  - id: lakes-z5
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z5.shp"
-      type: "shape"
-    properties:
-      minzoom: 5
-      maxzoom: 5
-    advanced: {}
-  - id: lakes-z6
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z6.shp"
-      type: "shape"
-    properties:
-      minzoom: 6
-      maxzoom: 6
-    advanced: {}
   - id: water-areas
     geometry: polygon
     <<: *extents
@@ -427,75 +289,6 @@ Layer:
     properties:
       cache-features: true
       minzoom: 0
-  - id: ocean-z0
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z0.shp"
-      type: "shape"
-    properties:
-      maxzoom: 0
-    advanced: {}
-  - id: ocean-z1
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z1.shp"
-      type: "shape"
-    properties:
-      minzoom: 1
-      maxzoom: 1
-    advanced: {}
-  - id: ocean-z2
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z2.shp"
-      type: "shape"
-    properties:
-      minzoom: 2
-      maxzoom: 2
-    advanced: {}
-  - id: ocean-z3
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z3.shp"
-      type: "shape"
-    properties:
-      minzoom: 3
-      maxzoom: 3
-    advanced: {}
-  - id: ocean-z4
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z4.shp"
-      type: "shape"
-    properties:
-      minzoom: 4
-      maxzoom: 4
-    advanced: {}
-  - id: ocean-z5
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z5.shp"
-      type: "shape"
-    properties:
-      minzoom: 5
-      maxzoom: 5
-    advanced: {}
-  - id: ocean-z6
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z6.shp"
-      type: "shape"
-    properties:
-      minzoom: 6
-      maxzoom: 6
-    advanced: {}
   - id: ocean-lz
     geometry: polygon
     <<: *extents
diff --git a/project.mml.d/lakes-z0 b/project.mml.d/lakes-z0
deleted file mode 100644
index b21ee09d..00000000
--- a/project.mml.d/lakes-z0
+++ /dev/null
@@ -1,9 +0,0 @@
-  - id: lakes-z0
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z0.shp"
-      type: "shape"
-    properties:
-      maxzoom: 0
-    advanced: {}
diff --git a/project.mml.d/lakes-z1 b/project.mml.d/lakes-z1
deleted file mode 100644
index 0a9a650b..00000000
--- a/project.mml.d/lakes-z1
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: lakes-z1
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z1.shp"
-      type: "shape"
-    properties:
-      minzoom: 1
-      maxzoom: 1
-    advanced: {}
diff --git a/project.mml.d/lakes-z2 b/project.mml.d/lakes-z2
deleted file mode 100644
index 883f69f9..00000000
--- a/project.mml.d/lakes-z2
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: lakes-z2
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z2.shp"
-      type: "shape"
-    properties:
-      minzoom: 2
-      maxzoom: 2
-    advanced: {}
diff --git a/project.mml.d/lakes-z3 b/project.mml.d/lakes-z3
deleted file mode 100644
index 2ecc17ae..00000000
--- a/project.mml.d/lakes-z3
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: lakes-z3
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z3.shp"
-      type: "shape"
-    properties:
-      minzoom: 3
-      maxzoom: 3
-    advanced: {}
diff --git a/project.mml.d/lakes-z4 b/project.mml.d/lakes-z4
deleted file mode 100644
index 13294690..00000000
--- a/project.mml.d/lakes-z4
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: lakes-z4
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z4.shp"
-      type: "shape"
-    properties:
-      minzoom: 4
-      maxzoom: 4
-    advanced: {}
diff --git a/project.mml.d/lakes-z5 b/project.mml.d/lakes-z5
deleted file mode 100644
index a38bc1a3..00000000
--- a/project.mml.d/lakes-z5
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: lakes-z5
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z5.shp"
-      type: "shape"
-    properties:
-      minzoom: 5
-      maxzoom: 5
-    advanced: {}
diff --git a/project.mml.d/lakes-z6 b/project.mml.d/lakes-z6
deleted file mode 100644
index c7ef625e..00000000
--- a/project.mml.d/lakes-z6
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: lakes-z6
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/lakes-polygons-reduced-3857/lakes_reduced_z6.shp"
-      type: "shape"
-    properties:
-      minzoom: 6
-      maxzoom: 6
-    advanced: {}
diff --git a/project.mml.d/ocean-z0 b/project.mml.d/ocean-z0
deleted file mode 100644
index 32d8cc92..00000000
--- a/project.mml.d/ocean-z0
+++ /dev/null
@@ -1,9 +0,0 @@
-  - id: ocean-z0
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z0.shp"
-      type: "shape"
-    properties:
-      maxzoom: 0
-    advanced: {}
diff --git a/project.mml.d/ocean-z1 b/project.mml.d/ocean-z1
deleted file mode 100644
index 9b450ae0..00000000
--- a/project.mml.d/ocean-z1
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: ocean-z1
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z1.shp"
-      type: "shape"
-    properties:
-      minzoom: 1
-      maxzoom: 1
-    advanced: {}
diff --git a/project.mml.d/ocean-z2 b/project.mml.d/ocean-z2
deleted file mode 100644
index b61d6241..00000000
--- a/project.mml.d/ocean-z2
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: ocean-z2
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z2.shp"
-      type: "shape"
-    properties:
-      minzoom: 2
-      maxzoom: 2
-    advanced: {}
diff --git a/project.mml.d/ocean-z3 b/project.mml.d/ocean-z3
deleted file mode 100644
index 99af5736..00000000
--- a/project.mml.d/ocean-z3
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: ocean-z3
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z3.shp"
-      type: "shape"
-    properties:
-      minzoom: 3
-      maxzoom: 3
-    advanced: {}
diff --git a/project.mml.d/ocean-z4 b/project.mml.d/ocean-z4
deleted file mode 100644
index 31eae0d6..00000000
--- a/project.mml.d/ocean-z4
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: ocean-z4
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z4.shp"
-      type: "shape"
-    properties:
-      minzoom: 4
-      maxzoom: 4
-    advanced: {}
diff --git a/project.mml.d/ocean-z5 b/project.mml.d/ocean-z5
deleted file mode 100644
index ad08debd..00000000
--- a/project.mml.d/ocean-z5
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: ocean-z5
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z5.shp"
-      type: "shape"
-    properties:
-      minzoom: 5
-      maxzoom: 5
-    advanced: {}
diff --git a/project.mml.d/ocean-z6 b/project.mml.d/ocean-z6
deleted file mode 100644
index 5f40da7a..00000000
--- a/project.mml.d/ocean-z6
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: ocean-z6
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/ocean-polygons-reduced-3857/ocean_reduced_z6.shp"
-      type: "shape"
-    properties:
-      minzoom: 6
-      maxzoom: 6
-    advanced: {}
diff --git a/project.mml.d/order.txt b/project.mml.d/order.txt
index 6a33bb9e..fb9dbdc1 100644
--- a/project.mml.d/order.txt
+++ b/project.mml.d/order.txt
@@ -8,28 +8,7 @@ water-lines-casing
 water-lines-low-zoom
 springs
 water-lines
-rivers-z0
-rivers-z1
-rivers-z2
-rivers-z3
-rivers-z4
-rivers-z5
-rivers-z6
-lakes-z0
-lakes-z1
-lakes-z2
-lakes-z3
-lakes-z4
-lakes-z5
-lakes-z6
 water-areas
-ocean-z0
-ocean-z1
-ocean-z2
-ocean-z3
-ocean-z4
-ocean-z5
-ocean-z6
 ocean-lz
 ocean
 landcover-area-symbols
diff --git a/project.mml.d/rivers-z0 b/project.mml.d/rivers-z0
deleted file mode 100644
index 700c30e1..00000000
--- a/project.mml.d/rivers-z0
+++ /dev/null
@@ -1,9 +0,0 @@
-  - id: rivers-z0
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z0.shp"
-      type: "shape"
-    properties:
-      maxzoom: 0
-    advanced: {}
diff --git a/project.mml.d/rivers-z1 b/project.mml.d/rivers-z1
deleted file mode 100644
index ccf05d16..00000000
--- a/project.mml.d/rivers-z1
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: rivers-z1
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z1.shp"
-      type: "shape"
-    properties:
-      minzoom: 1
-      maxzoom: 1
-    advanced: {}
diff --git a/project.mml.d/rivers-z2 b/project.mml.d/rivers-z2
deleted file mode 100644
index 386f334d..00000000
--- a/project.mml.d/rivers-z2
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: rivers-z2
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z2.shp"
-      type: "shape"
-    properties:
-      minzoom: 2
-      maxzoom: 2
-    advanced: {}
diff --git a/project.mml.d/rivers-z3 b/project.mml.d/rivers-z3
deleted file mode 100644
index e995418b..00000000
--- a/project.mml.d/rivers-z3
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: rivers-z3
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z3.shp"
-      type: "shape"
-    properties:
-      minzoom: 3
-      maxzoom: 3
-    advanced: {}
diff --git a/project.mml.d/rivers-z4 b/project.mml.d/rivers-z4
deleted file mode 100644
index 0e1e6a22..00000000
--- a/project.mml.d/rivers-z4
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: rivers-z4
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z4.shp"
-      type: "shape"
-    properties:
-      minzoom: 4
-      maxzoom: 4
-    advanced: {}
diff --git a/project.mml.d/rivers-z5 b/project.mml.d/rivers-z5
deleted file mode 100644
index cc3d14c7..00000000
--- a/project.mml.d/rivers-z5
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: rivers-z5
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z5.shp"
-      type: "shape"
-    properties:
-      minzoom: 5
-      maxzoom: 5
-    advanced: {}
diff --git a/project.mml.d/rivers-z6 b/project.mml.d/rivers-z6
deleted file mode 100644
index 31056963..00000000
--- a/project.mml.d/rivers-z6
+++ /dev/null
@@ -1,10 +0,0 @@
-  - id: rivers-z6
-    geometry: "polygon"
-    <<: *extents
-    Datasource:
-      file: "data/river-polygons-reduced-3857/river_reduced_z6.shp"
-      type: "shape"
-    properties:
-      minzoom: 6
-      maxzoom: 6
-    advanced: {}
diff --git a/views_osmde/view-line.sql b/views_osmde/view-line.sql
index f14773df..290649b0 100644
--- a/views_osmde/view-line.sql
+++ b/views_osmde/view-line.sql
@@ -45,10 +45,10 @@ osm_tag2num(tags->'width') as "num_width",
 way as "way",
 way_area as way_area,
 z_order as z_order,
-osml10n_get_placename_from_tags(tags,true,false,' - ','de',way) as localized_name_second,
-osml10n_get_placename_from_tags(tags,false,false,' - ','de',way) as localized_name_first,
-osml10n_get_name_without_brackets_from_tags(tags,'de',way) as localized_name_without_brackets,
-osml10n_get_streetname_from_tags(tags,true,false,' - ','de', way) as localized_streetname,
+tags->'name' as localized_name_second,
+tags->'name' as localized_name_first,
+tags->'name' as localized_name_without_brackets,
+tags->'name' as localized_streetname,
 COALESCE(tags->'name:hsb',tags->'name:dsb',tags->'name') as name_hrb,
 layer as layer,
 tags as tags
diff --git a/views_osmde/view-point.sql b/views_osmde/view-point.sql
index 7efc40b3..f3ac6f7a 100644
--- a/views_osmde/view-point.sql
+++ b/views_osmde/view-point.sql
@@ -47,10 +47,10 @@ tags->'wetland' as "wetland",
 osm_tag2num(tags->'width') as "num_width",
 way as "way",
 z_order as z_order,
-osml10n_get_placename_from_tags(tags,true,false,chr(10),'de',way) as localized_name_second,
-osml10n_get_placename_from_tags(tags,false,false,chr(10),'de',way) as localized_name_first,
-osml10n_get_name_without_brackets_from_tags(tags,'de',way) as localized_name_without_brackets,
-osml10n_get_streetname_from_tags(tags,true,false,chr(10),'de', way) as localized_streetname,
+tags->'name' as localized_name_second,
+tags->'name' as localized_name_first,
+tags->'name' as localized_name_without_brackets,
+tags->'name' as localized_streetname,
 COALESCE(tags->'name:hsb',tags->'name:dsb',tags->'name') as name_hrb,
 layer as layer,
 tags as "tags"
diff --git a/views_osmde/view-polygon.sql b/views_osmde/view-polygon.sql
index 189eb444..1b09fa1a 100644
--- a/views_osmde/view-polygon.sql
+++ b/views_osmde/view-polygon.sql
@@ -50,11 +50,11 @@ osm_tag2num(tags->'width') as "num_width",
 way as "way",
 way_area as way_area,
 z_order as z_order,
-osml10n_get_placename_from_tags(tags,true,false,chr(10),'de',way) as localized_name_second,
-osml10n_get_placename_from_tags(tags,false,false,chr(10),'de',way) as localized_name_first,
-osml10n_get_name_without_brackets_from_tags(tags,'de',way) as localized_name_without_brackets,
-osml10n_get_streetname_from_tags(tags,true,false,chr(10),'de', way) as localized_streetname,
-osml10n_get_country_name(tags,chr(10),'de') as country_name,
+tags->'name' as localized_name_second,
+tags->'name' as localized_name_first,
+tags->'name' as localized_name_without_brackets,
+tags->'name' as localized_streetname,
+tags->'name' as country_name,
 COALESCE(tags->'name:hsb',tags->'name:dsb',tags->'name') as name_hrb,
 layer as layer,
 tags as "tags"
diff --git a/views_osmde/view-roads.sql b/views_osmde/view-roads.sql
index 86e4d4d8..9018afc6 100644
--- a/views_osmde/view-roads.sql
+++ b/views_osmde/view-roads.sql
@@ -31,10 +31,10 @@ tags->'width' as "width",
 way as way,
 way_area as way_area,
 z_order as z_order,
-osml10n_get_placename_from_tags(tags,true,false,' - ','de',way) as localized_name_second,
-osml10n_get_placename_from_tags(tags,false,false,' - ','de',way) as localized_name_first,
-osml10n_get_name_without_brackets_from_tags(tags,'de',way) as localized_name_without_brackets,
-osml10n_get_streetname_from_tags(tags,true,false,' - ','de', way) as localized_streetname,
+tags->'name' as localized_name_second,
+tags->'name' as localized_name_first,
+tags->'name' as localized_name_without_brackets,
+tags->'name' as localized_streetname,
 COALESCE(tags->'name:hsb',tags->'name:dsb',tags->'name') as name_hrb,
 layer as layer,
 tags as tags
  1. Der deutsche Stil ist eine kontinuierlich aktualisierte Abspaltung (Fork) des internationalen Stils und erbt daher alle Git-Tags des internationalen Stils. Früher waren dies die einzigen Tags, was eine gewisse Verwirrung verursachte, weil bei der Auswahl eines Tags entgegen der Erwartung dann doch der internationale und nicht der deutsche Stil geladen wurde.