User:Brogo/Animation der zeitlichen Entwicklung

From OpenStreetMap Wiki
Jump to: navigation, search

Intention

Mich interessierte, wie sich wohl OSM in meiner Gegend entwickelt hat; was war zuerst da, was wurde ergänzt, was wurde verbessert, was passiert jetzt noch? Ich wollte die Entwicklung in einer kleinen Animation festhalten.

Hier beschreibe ich kurz, wie ich das ganze unter Windows bewerkstelligt habe. Das Ganze ist keine Komplettanleitung, sondern nur die Darstellung, über welche Probleme ich gestolpert bin und wie ich diese beseitigt habe. Da mir Programmierkenntnisse fehlen, klingt manche Lösung für einen Profi vielleicht etwas kompliziert, aber letztendlich bin ich doch zum gewünschten Resultat gekommen.

Die verwendeten Programme sind alle Freeware bzw. Open-Source. Einzelne Arbeitsschritte können auch mit anderen Programmen durchgeführt werden.

Die grundsätzlich Vorgehensweise ist aber gleich. Man erstellt mit einem alten Datenbestand ein einzelnes Bild, erzeugt mit einem neuerem Datenbestand ein weiteres Bild usw. Am Ende werden die Bilder zu einem Film zusammengeführt.

Vorbereitung

Um die historische Entwicklung der OSM-Daten zu visualisieren benötigt man erst einmal diese alten Daten. Der aktuelle Planet und die entsprechenden Extrakte bieten ja immer nur eine Momentaufnahme. Es ist stets nur der letzte Versionsstand der Elemente abgespeichert. Es gibt das die Full-History-Planet-Dumps, in denen ALLE Änderungen enthalten sind. Nur gibt es noch keine praktischen Tools, um daraus einen Extrakt zu einem bestimmten Zeitpunkt zu generieren.

Unter [1] findet man auch alte Planet-Files. Florian Lohoff stellt auf seinem Server auch alte Deutschland-Extrakte bereit.

Beim Umgang mit alten OSM-Daten muß man die API-Version berücksichtigen, mit der sie gespeichert wurden. Seit April 2009 haben wir API V0.6. Die Planet-Files vor diesem Datum muß man eine alte Osmosis-Version benutzen. Bei Dateien vor dem 07.10.2007 muß man diese vorher noch von API V0.4 auf API V0.5 konvertieren. Die Dateien auf Florians Server sind bereits alle auf 0.6 umgestellt.

Rendern mit Mapnik

Ich wollte, daß die Animation möglichst mit dem normalen Mapnik-Style gerendert wird. Eine funktionierende Mapnik-Installation lag bei mir vor. Für Windows hat User Ajoessen eine gute Anleitung erstellt. Deshalb gehe ich darauf nicht weiter ein.

Erstellen und Füllen der Datenbank

Mapnik rendert die Daten aus einer Datenbank heraus. Deshalb habe ich für jeden einzelnen Extrakt eine einzelne Datenbank angelegt. Um das Ganze, wie auch spätere Funktionen im Batch auszuführen, benötige ich erst mal eine Liste mit den ganzen Extrakten. Diese habe ich so erstellt:

dir /b /o:n germany*.osm.bz2 > dateiliste.txt

Der Einfachheit halber habe ich den Datenbanken den Namen der OSM-Datei gegeben.

Um eine solche Datenbank anzulegen benötigt man z.B. folgendes SQL-Script

CREATE DATABASE  "germany-20110301.osm.bz2"
WITH ENCODING='UTF8'
OWNER=postgres
TEMPLATE=template_postgis
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
GRANT ALL ON DATABASE "germany-20110301.osm.bz2" TO public;

Nun könnte man den Block kopieren und den Datenbanknamen manuell korrigieren. Das war mir zu umständlich. Da ich viel mit Tabellenkalkulationen arbeite ist mir folgender Weg eingefallen: Ich kopiere die dateiliste.txt in die erste Spalte einer Tabelle. In die nächsten Spalten kommen die konstanten Script-Teile. Mit der Funktion VERKETTEN verknüpfe die Spalten so, daß ich das ganze SQL-Script pro Datenbank in einer Zeile ab. Für einen Zeilenwechsel fügen ich ein Sonderzeichen z.B. "!" ein. Dann kopiere ich die ganze Spalte mit dem Resultat, füge sie in einen Texteditor ein, ersetze das Sonderzeichen durch einen Zeilenwechsel und speichere die Datei als db_erstellen.sql.

Mit

psql --file=db_erstellen.sql postgres

wird die SQL-Datei ausgeführt.

Für den ganzen Prozeß habe ich eine BAT-Datei erstellt, die jeden, der die nun folgenden Schritte enthält.

echo %time% > laufzeit.txt

Dieses Kommando habe ich eingefügt, um Informationen zu der Laufzeit des Script zu bekommen. Hier wird die Startzeit gesetzt.

del c:\osm\mapnik\history\temp\*.* /q

Damit räume ich das Arbeitsverzeichnis auf und lösche temporäre Dateien von vorherigen Durchläufen.

Rendern der einzelnen Bilder

Den eigentlichen Renderprozeß habe ich in eine zweite BAT-Datei ausgelagert. (Ich weiß zwar nicht mehr genau warum, es gab aber wohl technische Zwänge.)

start /B /WAIT cmd.exe /V /C history_teil2.bat

Mit diesem Kommando starte ich die zweite Batch-Datei. Die erste wartet dann so lange, bis die zweite beendet ist.

set originalfile=c:\osm\mapnik\inc\datasource-settings.xml.inc.org 
set workfile=c:\osm\mapnik\inc\datasource-settings.xml.inc
for /F  %%a in ('type c:\osm\mapnik\dateiliste.txt') do 
(  
SET DBASE=%%a
sed 's/OSM/!DBASE!/g' %originalfile% >%workfile%
generate_image_history.py
)  


Nun wird eine Schleife ausgeführt, in der die Befehle für jeden Eintrag in der Datei 'dateiliste.txt' abgearbeitet werden.

Das Phyton-Script 'generate_image_history.py' greift auf die Datei 'datasource-settings.xml.inc' zurück, in der unter anderem der Datenbankname steht. Um dort den richtigen Datenbanknamen zu benutzen, ersetzt das Skript aus der Dateivorlage den String '!DBASE!' durch den aktuellen Namen und speichert die Datei unter neuen Namen ab.

So wird ein Bild nach dem anderen generiert.

Einfügen des Dateinamens

Ich habe IrfanView benutzt um den Dateinamen, der ja das Datum enthält in jedes einzelne Bild einzufügen. Dafür habe ich im Vorfeld einmalig IrfanView gestartet unter im Menü 'Datei' 'Batch/Stapelkonvertierung' aufgerufen. Unter 'Optionen für die Batch-Konvertierung' habe ich das Häkchen 'Spezial-Optionen' gesetzt und 'Setzen' angeklickt. Im folgenden Fenster kann man die Funktion 'Text einfügen' auswählen, unter den entsprechenden Optionen kann z.B. die Variable '$F' für den Dateinamen wählen. Man sollte noch überprüfen, ob man nun alle Einstellungen für die Konvertierung vorgenommen hat und dann die Einstellungen speichern. Die entsprechende ini-Datei enthält alle Infos.

Dann muß man nur noch einen IrfanView-Batchlauf anstoßen. Z.B. mit

"c:\Program Files (x86)\IrfanView\i_view32.exe" c:\osm\mapnik\history\temp*.png /ini=c:\osm\mapnik\history /advancedbatch /convert="c:\osm\mapnik\history\temp\*.png"

Erstellung der Animation

Ich benutze VirtualDub um die einzelnen Bilder zu einem Film zusammenzufügen.

Als Vorarbeit müssen die PNG-Dateien umbenannt werden. VirtualDub erwartet ein fortlaufende Numerierung der Bilddateien. Ich habe dazu die Kommandozeilenversion des Bulk Rename Utilitys benutzt.

Der entsprechende Aufruf sieht bei mir so aus:

brc /removename /autonumber:1:1:p::10:4 /dir:"c:\osm\mapnik\history\temp\" /pattern:"germ*.png" /execute

Das Erstellen des AVI-Files ist relativ einfach. Wieder müssen wir im Vorfeld einmalig die GUI starten. Man öffnet in VirtualDub die erste Bilddatei. Das Programm erkennt automatisch die Sequenz und öffnet alle weiteren Bilder. Nun kann alle weiteren Einstellungen wie Kompression und Framerate einstellen

Dann wähl man den Punkt 'File/Queue Batch Operation/Save as AVI' aus. VirtualDub hat nun eine Datei VirtualDub.jobs' erstellt, die alle notwendigen Informationen enthält. Diese Datei können wir über

"c:\Program Files (x86)\VirtualDub\vdub.exe" /s c:\osm\mapnik\history\VirtualDub.jobs

als Batch ausführen.

Damit ist Filmchen komplett.

Zum Abschluß schreiben wir mit

echo %time% >> laufzeit.txt

noch einmal die aktuelle Zeit in die Datei 'laufzeit.txt'.

Anmerkungen

So eine Animation spiegelt nur den Datenbestand in OSM wieder. Daraus kann man keine tatsächliche Entwicklung der Infrastruktur ableiten.

Die Art der Erstellung zeigt auch genau nicht an, wie die Karte damals tatsächlich ausgesehen hat. Der Mapnik-Stil wurde zwischenzeitlich oft verändert. Wir arbeiten hier durchgängig mit dem aktuellen Stil.

Ebenso werden die Veränderungen der Küstenlinien nicht dargestellt. Mapnik verwendet für diese Shape-Files welche wir auch nur in einer Version nutzen.