Projektziel: In FlightGear sieht der Boden ab Werk aus wie ein Flickenteppich aus wiederholten Texturen. Ich wollte beim Anflug echte Felder, Dörfer und Straßen sehen, und zwar mit Bildern, die ich auch in Videos und im Stream zeigen darf. Ein kleines Python-Skript holt dafür amtliche Luftbilder aus offenen Kartendiensten und baut daraus Kacheln für den Simulator. Inzwischen sind es rund 12 GB, von Mitteldeutschland bis Spitzbergen.

Space Shuttle von oben über einer Landschaft aus echten Luftbildern
Bild 1 - Aus rund 26 km Höhe: Felder, Wälder und Stauseen stammen aus amtlichen Luftbildern. Die Trennlinien rechts sind Grenzen zwischen Kacheln und Bundesländern

Wie FlightGear Luftbilder einbindet

FlightGear legt Luftbilder als einzelne Kacheln über die Landschaft, wenn die Einstellung /sim/rendering/photoscenery/enabled an ist. Jede Kachel ist eine DDS-Datei im Ordner Orthophotos und heißt so wie der FlightGear-Bucket, den sie abdeckt. Ein Bucket ist in unseren Breiten 0,25° breit und 0,125° hoch, im hohen Norden wird er breiter. Das Skript berechnet die Buckets für ein Gebiet oder für einen Streifen entlang einer Flugroute.

Die Bildquellen

Viele Länder bieten ihre Luftbilder als offene WMS-Dienste an: Man fragt einen Ausschnitt an und bekommt ein Bild zurück, ohne Anmeldung. In Deutschland macht das jedes Bundesland selbst, deshalb stecken im Skript viele einzelne Quellen:

RegionQuelleSchärfe bei mir
Deutschland (mehrere Bundesländer)Landesvermessungsämteretwa 2–4 m pro Pixel
FrankreichIGNetwa 2–4 m
PolenGUGiKetwa 2–4 m
Kennedy Space CenterUSGS NAIPetwa 3–6 m
Schottland, Spitzbergen, LückenEOX Sentinel-2 cloudless 201610 m

Die Schärfe hängt von meiner Kachelgröße ab, die Quellen selbst sind oft genauer. Wichtig ist die Lizenz: Die meisten Bilder sind frei, verlangen aber eine Quellenangabe. Bewusst nicht genutzt habe ich Esri, Google und Bing, weil deren Bedingungen nicht zu massenhaftem Abruf und Videos passen, und die neueren EOX-Jahrgänge, die nur nicht-kommerziell erlaubt sind. Ob eine Lizenz für den eigenen Zweck reicht, muss jeder selbst prüfen.

Vom WMS-Bild zur Kachel

Das Skript fragt die Dienste für jeden Bucket ab, setzt die Antworten zusammen und füllt Lücken mit Sentinel-2. Die Umwandlung nach DDS übernimmt ImageMagick:


magick kachel.png -define dds:compression=dxt1 -define dds:mipmaps=14 1629601.dds

Fertige Kacheln überspringt das Skript, ein Abbruch verliert also nichts. Eine Kachel mit 8192 Pixeln braucht rund 45 MB.

Stolpersteine

  • Weiß heißt nicht leer: Viele Dienste liefern außerhalb ihres Gebiets weiße Flächen. Wer Weiß einfach als leer behandelt, bekommt schwarze Flecken auf hellen Dächern.
  • Grenzen der Dienste: Manche Server liefern nur bis 3000 Pixel, also muss das Skript stückeln. Über dem Meer antwortet NAIP mit einem Fehler statt mit einem leeren Bild.
  • ImageMagick: Die Standardregeln begrenzen die Bildgröße, 16384 Pixel scheiterten.
  • Größen nicht mischen: Am Flughafen setzt FlightGear die Kacheln zu einem Bild zusammen. 16000 Pixel neben 8192 Pixeln ergaben ein schwarzes Loch im Gelände, im Log stand Failed to convert component of composite orthophoto. Mit 8192 und 4096 Pixeln trat es nicht auf.
  • Grüne Seen: Wasserflächen bekommen kein Luftbild. Der Wasser-Shader nimmt die Farbe flacher Stellen aus einer groben Weltkarte, und dort sind kleine Seen offenbar noch Land. In Effects/water-inland.eff hilft eine feste Wassertiefe: use_specified_water_shallowness auf 1 und water_shallowness auf 0,3.
  • Bäume mitten auf dem Acker: Die Zufallsbäume von FlightGear wissen nichts vom Luftbild und stehen auf den Feldern. Ich habe sie abgeschaltet.
  • Schnee: Das Wetter legte Schnee auf die Mittelgebirge, während das Luftbild Sommer zeigt. Dagegen hilft, die Schneegrenze hochzusetzen.

Die Erde aus dem All

Für das Space Shuttle zeigt FlightGear die Erde mit Earthview. Ab Werk hat das Modell nur 2048 Pixel pro Kachel, grob 5 km pro Pixel, und Städte werden nachts zu Klötzchen. Die NASA stellt beides viel schärfer frei zur Verfügung: Blue Marble für den Tag und Black Marble für die Stadtlichter. Mein Skript rechnet sie zu 16.384 Pixeln pro Kachel zusammen, die acht Kacheln brauchen rund 2,7 GB.

Stadtlichter Mitteleuropas bei Nacht aus rund 400 km Höhe in FlightGear
Bild 2 - Mitteleuropa bei Nacht aus rund 400 km Höhe. Quelle der Lichter: NASA Black Marble 2016
Space Shuttle in der Umlaufbahn über der Arabischen Halbinsel in FlightGear
Bild 3 - Das Shuttle über Arabien. Quelle der Erde: NASA Blue Marble Next Generation

Dabei gab es vier Stolpersteine:

  • Stadtlichter im Alphakanal: Der Shader rechnet night_light = 1 - alpha. Black Marble zeigt auch das Land schwach, darum zählen erst hellere Werte als Licht.
  • Gespiegelte Erde: DDS liegt anders herum als PNG. Ungespiegelt lag die Arktis am Äquator.
  • Furchen im Meer: Die NASA-Fassung mit Topografie und Bathymetrie zeigt den Meeresboden. Die Fassung ohne Relief hat einheitliches Wasser.
  • Bildgröße: ImageMagick schafft 16.384 Pixel nicht am Stück. DXT5 komprimiert aber jeden Block aus 4 × 4 Pixeln für sich, also lassen sich Streifen einzeln umwandeln und aneinanderhängen. Die Mipmaps kommen aus einer halb so großen Fassung.

Was es noch nicht löst

An Grenzen zwischen zwei Ländern ändern sich oft Farbe und Jahreszeit, weil jede Behörde eigene Aufnahmen hat. Aus großer Höhe sieht man diese Kanten deutlich. Am Horizont endet die geladene Landschaft außerdem als harte Kante. Die Umrisse von Seen und Lagunen stammen weiter aus der FlightGear-Landschaft, sie sind eckig und passen nicht immer zum Luftbild.

Fazit

Der Aufwand steckt weniger im Skript als im Suchen der Quellen und im Lesen der Lizenzen. Dafür ist der Unterschied im Anflug enorm: Man erkennt echte Orte, Flüsse und Autobahnen wieder.

Quellen und Download

Die Luftbilder kommen aus diesen WMS-Diensten. Der Link zeigt jeweils die Beschreibung des Dienstes mit Ebenen, Gebiet und Bedingungen. Dahinter steht die Quellenangabe, die ich verwende.

  • Thüringen: WMS-Dienst, Ebene th_dop. © GDI-Th, CC BY 4.0
  • Niedersachsen: WMS-Dienst, Ebene ni_dop20. LGLN, CC BY 4.0
  • Nordrhein-Westfalen: WMS-Dienst, Ebene nw_dop_rgb. Geobasis NRW
  • Sachsen-Anhalt: WMS-Dienst, Ebene lsa_lvermgeo_dop20_2. © GeoBasis-DE / LVermGeo ST, dl-de/by-2-0
  • Sachsen: WMS-Dienst, Ebene sn_dop_020. Geodaten Sachsen (GeoSN), dl-de/by-2-0
  • Brandenburg: WMS-Dienst, Ebene bebb_dop20c. © GeoBasis-DE/LGB, dl-de/by-2-0 (Daten geändert)
  • Hessen: WMS-Dienst, Ebene he_dop_rgb. Hessische Verwaltung für Bodenmanagement und Geoinformation (HVBG)
  • Rheinland-Pfalz: WMS-Dienst, Ebene rp_dop20. ©GeoBasis-DE / LVermGeoRP (2026), dl-de/by-2-0, www.lvermgeo.rlp.de [Daten bearbeitet]
  • Saarland: WMS-Dienst, Ebene sl_dop20_rgb. Geoportal Saarland
  • Frankreich: WMS-Dienst, Ebene HR.ORTHOIMAGERY.ORTHOPHOTOS. BD ORTHO®, IGN, Licence Ouverte 2.0
  • Polen: WMS-Dienst, Ebene Raster. Główny Urząd Geodezji i Kartografii, geoportal.gov.pl
  • Kennedy Space Center: WMS-Dienst, Ebene USGSNAIPPlus. USDA NAIP über USGS The National Map
  • Schottland, Spitzbergen, Lücken: WMS-Dienst, Ebene s2cloudless. EOxCloudless by EOX IT Services GmbH (Contains modified Copernicus Sentinel data 2016 & 2017), CC BY 4.0

Die NASA-Bilder gibt es als Einzeldateien zum Herunterladen, Quelle jeweils NASA Earth Observatory: