| 
20.05.2007
 | 
17:22

Historische Karten mit Generic Mapping Tools und Inkscape (Ubuntu)

Gestern habe ich gezeigt, wie man GMT unter Ubuntu mit einigem Schnickschnack zum Laufen bringt. Heute gehe ich auf die Erstellung von historischen Karten ein, die ich als Historiker manchmal brauche. Dabei sollen einige Anforderungen zu beachten sein:

  • Es sollen im Prinzip mit dem gleichen Datensatz farbige und schwarzweiße Karten erstellt werden können. Mit anderen Worten: Ich will mir doppelte Arbeit sparen, wenn ich z.B. Bildschirmpräsentationen und Ausdrucke machen will.
  • Karten sollen möglichst beliebig skalierbar sein.

Vorbereiten von Ubuntu

Zur Einrichtung von GMT unter Ubuntu bitte den gestrigen Artikel lesen (mit Windows und Cygwin ist GMT auch gut bedienbar, aber das zeige ich hier nicht).

Zusätzlich müssen noch Inkscape, ImageMagick und Ghostscript installiert werden:

sudo apt-get install inkscape imagemagick gs

Nun kann man sich ein Beispielverzeichnis einrichten:

mkdir ~/maptest
cd ~/maptest
ln -s /usr/share/gmt/dbase/etopo2v2.grd

Damit sind wir bereit!

Daten vorbereiten

Ich möchte im Folgenden eine Karte der wichtigsten Reiche in Indien um 1500 erstellen. Dafür verwende ich eine ganze Reihe von Schritten… nicht ganz einfach, aber durchaus machbar.

Zuerst erstellen wir zwei Dateien mit Farbwerten, die wir für die Farbkarten brauchen werden. Im Gegensatz zum gestrigen Artikel will ich eine dezente graue Karte für die Landwerte haben, damit die Reiche besser zur Geltung kommen.

cat >land.cpt <<EOF
# File land.cpt
# COLOR_MODEL = RGB
#
0 204 204 204 1500 153 153 153
1500 153 153 153 3000 102 102 102
3000 102 102 102 4500 51 51 51
4500 51 51 51 6000 17 17 17
6000 17 17 17 9000 17 17 17
B 255 255 255
F 255 255 255
N 255 255 255
EOF

Nun erstellen wir eine allgemeine Datei mit den Einstellungen der Karten. Diese können wir dann im Verlauf anpassen oder Ändern, um bessere Ergebnisse erzielen zu können.

cat >settings.sh <<EOF
#########################
# settings.sh
# Einstellungen zur Karte
#########################
#Dateiname
OUTFILE=india
#Projektion und Papiergröße
PROJ="-JM30c --PAPER_MEDIA=A2"
#Koordinaten, die angezeigt werden sollen
RANGE="-R64/93/5/35"
 
#Stiftgröße, etc.
GMT gmtset GRID_PEN_PRIMARY 0.75
GMT gmtset GRID_PEN_SECONDARY 0.25
EOF

Im folgenden wird diese Datei von den unten stehenden Skripten mit eingebunden. Ich könnte das Ganze natürlich auch mit Funktionen schreiben, aber ich finde einzelne Dateien didaktisch wertvoller.

Grids erstellen

Um die Karten farbig gestalten zu wollen, brauchen wir die Grids von Indien – diese werden quasi aus der Datei etopo2v2.grd herausgeschnitten:

cat >grid.sh <<EOF
#########################
# grids.sh
# Grids erstellen
#########################
#Einstellungen lesen
\. ./settings.sh
 
#Grid erstellen
GMT grdcut etopo2v2.grd $RANGE -G$OUTFILE.grd
#Schatten erstellen (Umrisse der Kontinente)
GMT grdgradient $OUTFILE.grd -A45 -Ne0.5 -G${OUTFILE}_schatten.grd
 
echo "Grid und Schatten erstellt!"
EOF

Nun erstellen wir die Grids:

chmod u+x grid.sh
./grid.sh

Es sollten zwei Dateien india.grd und india_schatten.grd im Verzeichnis entstanden sein.

Grundkarte für Inkscape

Zuerst erstellen wir eine Karte für Inkscape, um diese als Hintergrund zu importieren – das erleichtert das Arbeiten mit Inkscape sehr.

cat >preinkscape.sh <<EOF
#########################
# preinkscape.sh
# Karte für Inkscape
#########################
#Einstellungen lesen
\. ./settings.sh
 
INKOUT=${OUTFILE}_inkscape
 
#Clipping festlegen
GMT pscoast -Gc -Di $RANGE $PROJ -P -K > $INKOUT.ps
#Karte zeichnen
GMT grdimage $OUTFILE.grd -I${OUTFILE}_schatten.grd -Cland.cpt $RANGE \
$PROJ -P -K -O >> $INKOUT.ps
#Clipping aufheben
GMT pscoast -Q -K -O >> $INKOUT.ps
#Küsten und Flüsse zeichnen
GMT pscoast -Di -Bs10g10 $RANGE $PROJ -A0 -I1/2/40/40/120 -I2/1/40/40/120 \
-A10 -P -O -W0.05pt >> $INKOUT.ps
echo "PS-Karte erstellt!"
 
#EPS erstellen
gs -dNOPAUSE -sDEVICE=epswrite -dNOCACHE -sOutputFile=$INKOUT.eps \
-q -dBATCH $INKOUT.ps
#In PNG umwandeln
convert $INKOUT.eps $INKOUT.png
#alte Dateien löschen
rm $INKOUT.ps $INKOUT.eps
 
echo "Karte für Inkscape erstellt!"
EOF

Das Erstellen geht wieder äquivalent:

chmod u+x preinkscape.sh
./preinkscape.sh

Es sollte nun eine Datei india_inkscape.png im Verzeichnis liegen.

Inkscape-Overlays erstellen

Jetzt haben wir eine schöne Grundkarte und können nun beginnen, diese Grundkarte mit Inkscape zu verschönern…

Wir laden Inkscape und erstellen ein neues Bild. Mit Umschalt+Strg+L kommen kommen wir zum Ebenendialog. Hier legen wir 4 Ebenen an. Die oberste Ebene bekommt eine Deckkraft von 50%:

Wir aktivieren Ebene “Karte” und importieren das besagte india_inkscape.png-Bild. Am besten skaliert man es auch noch ‘runter. Ich habe es auf 268,768×298,043 Pixel skaliert:

 

Danach können wir die Ebene “Karte” sperren…

Auf der untersten Ebene “Weißer Rand” müssen wir nun ein weißes Rechteck in der Größe der Karte anlegen. Das hilft uns später beim Export. Auch diese Ebene können wir danach sperren. WICHTIG: Die Deckkraft dieser Ebene sollte 0% sein, damit später der Hintergrund durchsichtig ist!

Nun können wir in Ruhe die Reiche eintragen – auf Küstenlinien müssen wir hier nicht achten, da diese später ausgeschnitten werden. Man kann die Reiche als verschiedenfarbig gefüllte Polygone erstellen, die sich überlappen:

Auf der Ebene “Schrift” kann man nun die Beschriftungen erstellen:

Nun können wir die beiden Ebenen exportieren. Dafür ändern wir die Sichtbarkeiten der Ebenen: Für die politischen Regionen sollten die Ebenen “Reiche” und “Weißer Rand” sichtbar sein, für die Schrift “Schrift” und “Weißer Rand”. Wir exportieren die Karten über Bitmap exportieren… (Umschalt+Strg+E) als “indien_reiche.png” und “indien_schrift.png”. Die Bilder sollten als “Zeichnung” gespeichert werden und die Größe sollte ungefähr 863×957px betragen…

Hier die Bilder als Referenz: indien_reiche.png und indien_schrift.png. Inkscape-Datei: indien.svg

Farbkarte erstellen

Nun haben wir den schwersten Teil hinter uns… Nun müssen wir nur noch die Karten zusammenbasteln… Zuerst der einfachere Part: die Farbkarte.

Hier das Skript, nicht ganz ideal zwar, aber insgesamt passend:

cat >india_farb.sh <<EOF
#########################
# india_farb.sh
# Farbkarte
#########################
#Einstellungen lesen
\. ./settings.sh
 
OUT=${OUTFILE}_farb
 
#Clipping festlegen
GMT pscoast -Gc -Di $RANGE $PROJ -P -K > ${OUTFILE}_grund.ps
#Karte zeichnen
GMT grdimage $OUTFILE.grd -I${OUTFILE}_schatten.grd -Cland.cpt $RANGE \
$PROJ -P -K -O >> ${OUTFILE}_grund.ps
#Clipping aufheben
GMT pscoast -Q -K -O >> ${OUTFILE}_grund.ps
#Küsten und Flüsse zeichnen
GMT pscoast -Di -Bs10g10 $RANGE $PROJ -A0 -I1/2/40/40/120 -I2/1/40/40/120 \
-A10 -P -O -W0.05pt >> ${OUTFILE}_grund.ps
 
#EPS erstellen
gs -dNOPAUSE -sDEVICE=epswrite -dNOCACHE -sOutputFile=${OUTFILE}_grund.eps \
-q -dBATCH ${OUTFILE}_grund.ps
#In PNG umwandeln
convert ${OUTFILE}_grund.eps ${OUTFILE}_grund.png
 
echo "Grundkarte erstellt!"
 
#Maske erstellen
GMT pscoast -Bs -Di $RANGE $PROJ -A0 -A10 -S200/200/255 \
-W0.05pt > ${OUTFILE}_mask.ps
#Maske zu eps
gs -dNOPAUSE -sDEVICE=epswrite -dNOCACHE -sOutputFile=${OUTFILE}_mask.eps \
-q -dBATCH ${OUTFILE}_mask.ps
#Zu PNG
convert ${OUTFILE}_mask.eps -rotate 90 -transparent "#FFF" ${OUTFILE}_mask.png
 
echo "Maske erstellt!"
 
#Karten zusammenfügen
#Ausgeschnittene Reiche
composite indien_reiche.png -compose src-out \
${OUTFILE}_mask.png farb_temp1.png
#Reiche als Overlay
#Geometry ist wegen einer Verschiebung in meinen Bildern... naja
composite farb_temp1.png -dissolve 40 -geometry -1+0 \
${OUTFILE}_grund.png farb_temp2.png
#Schrift darüber legen: Finale Karte
composite indien_schrift.png -compose src-over farb_temp2.png \
$OUT.png
 
#Temporäre Bilder löschen
rm farb_temp1.png farb_temp2.png
 
echo "Farbkarte erstellt!"
EOF

Wie immer, ausführen:

chmod u+x india_farb.sh
./india_farb.sh

So, das ist nun die Farbkarte (verkleinert):

Schwarzweißkarte erstellen

Nun kommt die Schwarzweißkarte. Sie baut auf der Farbkarte auf und ändert einige Dinge, z.B. die Transparenz der Reiche, damit diese auch im S/W einigermaßen gut sichtbar sind:

cat >india_sw.sh <<EOF
#########################
# india_sw.sh
# S/W-Karte
# Baut auf Farbkarte auf!
#########################
#Einstellungen lesen
\. ./settings.sh
 
OUT=${OUTFILE}_sw
 
#Küsten und Flüsse zeichnen
GMT pscoast -Di -Bs10g10 $RANGE $PROJ -I1/2/40/40/40 -I2/1/40/40/40 \
-A100 -W0.05pt >> ${OUTFILE}_linien.ps
 
#EPS erstellen
gs -dNOPAUSE -sDEVICE=epswrite -dNOCACHE -sOutputFile=${OUTFILE}_linien.eps \
-q -dBATCH ${OUTFILE}_linien.ps
#In PNG umwandeln - muss rotiert werden
convert ${OUTFILE}_linien.eps -rotate 90 ${OUTFILE}_linien.png
 
echo "Linienkarte erstellt!"
 
#Reiche als SW
convert indien_reiche.png -type Grayscale indien_reiche_sw.png
 
#Karten zusammenfügen
#Ausgeschnittene Reiche
composite indien_reiche_sw.png -compose src-out \
${OUTFILE}_mask.png sw_temp1.png
#Reiche als Overlay
#Geometry ist wegen einer Verschiebung in meinen Bildern... naja
composite sw_temp1.png -dissolve 70 -geometry -1+0 \
${OUTFILE}_linien.png sw_temp2.png
#Schrift darüber legen: Finale Karte
composite indien_schrift.png -compose src-over sw_temp2.png \
$OUT.png
 
#Temporäre Bilder löschen
rm sw_temp1.png sw_temp2.png
 
echo "S/W-Karte erstellt!"
EOF

Nun ausführen:

chmod u+x india_sw.sh
./india_sw.sh

Hier eine verkleinerte Form der S/W-Karte. Die Farbkombination ist nicht ganz ideal, das kann man aber in Inkscape anpassen. Mit einer kleinen Anpassung könnte man auch in Inkscape gestrichelte Linien als Grenzen erstellen o.ä. – das aber vielleicht ein ander Mal.

 

  •  
  • 2 Kommentare
  •  
Gravatar: VilleVille
02.06.2009
09:48

Download?

Die Karte sieht sehr gut aus. Aber woher kann man Generic Mapping Tools und Inkscape herunterladen?

Gravatar: MaxMax
02.06.2009
13:49
Mein Kommentar
Ich möchte über jeden weiteren Kommentar benachrichtigt werden.

Zurück