- Python 100%
| .gitignore | ||
| example.png | ||
| example_dop.png | ||
| README.md | ||
| render_orchard.py | ||
| requirements.txt | ||
osm-orchard-render
Rendert eine PNG-Karte eines OSM-Gebiets (z. B. einer Streuobstwiese) und
beschriftet jeden in OSM erfassten Baum mit seinem loc_name.
Anhand einer OSM-Way-ID führt das Skript folgende Schritte aus:
- Lädt die Geometrie des Ways über die Overpass-API.
- Fragt alle
natural=tree-Knoten innerhalb der (leicht erweiterten) Bounding-Box des Ways ab. - Klassifiziert jeden Baum per Punkt-in-Polygon-Test als innerhalb des Polygons (dunkelgrün) oder außerhalb, aber im Rendering-Bereich (hellgrün).
- Fügt OSM-Raster-Kacheln zu einer Grundkarte zusammen, die passgenau auf die Bounding-Box zugeschnitten ist.
- Zeichnet darüber die Polygonumrandung, Baummarker und Beschriftungen mit einer einfachen Kollisionserkennung.
Beispiel
example.png wurde aus
OSM-Way 1373324442 erzeugt —
einer Streuobstwiese in Deutschland:
.venv/bin/python render_orchard.py 1373324442 --output example.png
Mit NRW-Luftbild als Hintergrund (example_dop.png):
.venv/bin/python render_orchard.py 1373324442 --basemap nrw-dop --output example_dop.png
Die OSM-Way-ID einer Streuobstwiese finden
Das Skript akzeptiert jede OSM-Way-ID für eine geschlossene Fläche (Streuobstwiese, Park, Kleingartenanlage usw.). So findest du sie:
-
Öffne https://www.openstreetmap.org und navigiere zum gewünschten Gebiet.
-
Wenn du noch keine konkrete Wiese im Blick hast, hilft Overpass Turbo (https://overpass-turbo.eu) mit einer Abfrage wie
landuse=orchard, um Streuobstwiesen aufzuspüren. -
Klicke das Polygon der Streuobstwiese auf der Karte an. In der rechten Seitenleiste erscheinen die Tags des Objekts und eine OSM-URL der Form
https://www.openstreetmap.org/way/1373324442. Die Zahl am Ende ist die Way-ID. -
Übergib sie als erstes Positions-Argument:
python render_orchard.py 1373324442 python render_orchard.py 987654321 -o meine_wiese.png
Wenn die Fläche als Relation (Multipolygon mit Löchern) erfasst ist, funktioniert die Way-ID nicht direkt — das Skript erwartet derzeit einen einzelnen geschlossenen Way.
Installation
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
Verwendung
python render_orchard.py <way_id> [--output map.png]
[--width 4000] [--height 4000]
[--padding 0.04] [--zoom N]
[--scale 2]
[--basemap osm|nrw-dop|nrw-vdop]
[--cache-dir .tile_cache]
way_id— OSM-Way-ID der zu rendernden geschlossenen Fläche.--output / -o— Pfad der Ausgabe-PNG (Standard:map.png).--width / --height— Maximale Leinwandgröße in Pixeln. Die Leinwand wird automatisch auf die gepolsterte Bounding-Box beim gewählten Zoom zugeschnitten, sodass die Streuobstwiese das Bild ausfüllt.--padding— Rand um die Bounding-Box als Bruchteil ihrer Größe (Standard:0.04).--zoom— erzwingt einen bestimmten OSM-Kachel-Zoom; standardmäßig wird der höchste Zoom gewählt, bei dem die Bounding-Box noch in die maximale Leinwand passt. Standard-OSM-Kacheln gehen maximal bis Zoom 19.--scale— Supersampling-Faktor für schärfere Beschriftungen und Marker (Standard:2). Die Kacheln werden per Lanczos hochskaliert, Text und Vektor-Overlays werden jedoch nativ in höherer Auflösung gezeichnet — Beschriftungen bleiben also scharf, obwohl OSM bei Zoom 19 endet. Mit--scale 1erhältst du 1:1-Kachel-Pixel.--basemap— Hintergrundkarte (Standard:osm):osm— Standard-OpenStreetMap-Kacheln.nrw-dop— NRW Digitale Orthophotos (Luftbild, validiert). Nur für Flächen in Nordrhein-Westfalen. Bei Aktivierung wird das Polygon ohne Füllung gezeichnet und Marker als gelbe Kreise ausgegeben, damit das Luftbild gut lesbar bleibt.nrw-vdop— NRW Vorläufige Orthophotos (neueste, noch nicht validierte Bilddaten). Hinweis: vDOP-Abdeckung ist sehr lückenhaft. Liefert der Server für das Gebiet ein weißes Bild mit "vDOP"-Wasserzeichen statt eines Luftbilds, gibt es noch keine vDOP-Daten — nutze dannnrw-dop.
--cache-dir— Festplatten-Cache für Kacheln/Luftbilder (Standard:.tile_cache). Erneute Läufe sind dadurch schnell.
Beschriftungen
- Der
loc_namejedes Baums (typischerweise die interne Baumnummer der Streuobstwiese) wird rechts neben dem Marker dargestellt. - Hat der Baum zusätzlich ein
ref-Tag, erscheint dieses links daneben in kleinerer Schrift. - Bäume mit nur
ref(ohneloc_name) zeigen denref-Wert allein. - Bäume ohne beide Tags werden als unbeschriftete Punkte gezeichnet.
Wenn du stattdessen den botanischen Namen anzeigen möchtest, kannst du
tree_label() in render_orchard.py anpassen:
def tree_label(tags: dict) -> str | None:
taxon = tags.get("taxon") or tags.get("species") or tags.get("genus")
loc_name = tags.get("loc_name")
if taxon and loc_name:
return f"{taxon} #{loc_name}"
return taxon or loc_name
Hinweise
- Die Kacheln werden von
tile.openstreetmap.orgmit lokalem Festplatten-Cache geladen. Bitte halte dich an die OSM Tile Usage Policy — also keine Massenabrufe über viele Gebiete in engen Schleifen. - Kartendaten © OpenStreetMap-Mitwirkende.

