Town Cloud

From Planetk.de

Jump to: navigation, search

Manche Leute haben wirklich kranke Ideen. Wenn ich mir dann aber die Arbeiten dieser Leute ansehe, kann ich oft nicht anders und muss nachbauen, was ich sehe. Tatendrang eines Verrückten...

So auch bei dem aktuellen Projekt. Neurdings versteht der Funktionenplotter Gnuplot neben Balken, Linien, Punkten und jede Menge neuem Zeug einen neuen Darstellungstyp: labels. Eine sinnvolle Anwendung sind uns die Entwickler bis heute genau genommen schuldig geblieben, allerdings kann man damit immerhin richtig coole 'Landkarten' erstellen. Alles, was man braucht sind ein paar Geodaten. Ein richtig geniales Beispiel dafür ist die mittlerweile recht berühmte Weltkarte von Ethan A. Merritt.

Ich wollte klein anfangen, also hab ich mir eine Saarlandkarte vorgenommen. Die Ort ist wie bei Merritts Karte durch die Position der Ortsnamen gegeben und die Einwohnerzahl durch die Schriftgröße. Zusätzlich habe ich an topografische Karten angelehnt die mittlere Ortshöhe farbcodiert. Die benötigten Daten habe ich mit einem kleinen Crawler aus Wikipedia geparst.

Als nächsten Versuch bin ich etwas größenwahnsinniger geworden, diesmal sollten es alle deutschen Städte mit mehr als 1000 Einwohnern werden. Leider wird es irgendwann unpraktisch, den Wikipedia-Server auszulasten, zumal ich einem gemeinnützigen Angebot diese Serverload auch nicht wegen eines solchen Projektes zumuten möchte. Also musste eine neue Datenquelle her. Gefunden habe ich die in OpenGeoDB, deren SQL-Quellcode ich mangels Lust, das ganze auf einen eigenen Server einzuspielen, stümperhaft mit einem Shellscript geparst habe.

Leider sind die von diesem Dienst angebotenen Koordinaten für einige Städte recht ungenau, viele Orte erst gar nicht vorhanden, und Höhendaten gibts für die meisten Orte auch nicht. Für mein Projekt ist das ganze aber vollkommen ausreichend, wie man am Ergebnis sieht. Auf einer alternative Karte von deutschen Städten mit mehr als 10000 Einwohnern kann man dann fast schon was erkennen ;-).

Und dann kam der Pälzer. Des wär schee, wenn ma des auch von da Palz hett. Also hab ich ihm schnell eine Karte der 100 wichtigen pfälzischen Städte erstellt, bestehend aus einem leeren weißen Blatt...

Ist er sich doch prompt verarscht vorgekommen, dabei hab ich doch ernsthaft versucht in der Pfalz 100 wichtige Orte zu finden, aber außer Bäumen nicht viel gefunden. Jetzt wollte er jedenfalls die 100 größten pfälzischen Städte. Hätte er das doch gleich gesagt. Also schnell wieder meinen Parser angeworfen und fertig. Ich sollte mich wirklich mit einem Kartenservice selbstständig machen...


Galerie

Weils so schön war, gleich noch eine Übersicht der bisher verfügbaren Town Clouds. Ich empfehle dabei den PDF-Link unter den Grafiken, der dank Vektorisierung auf kleinere und trotzdem bedeutend höher aufgelöste Grafiken verweist.

Code

Das Plotfile für die Saarlandkarte ist immer noch sehr übersichtlich:

set terminal postscript enhanced "Helvetica" color
set output './towns.ps'
set encoding iso_8859_15
set palette model RGB functions 1.0-6*(gray-0.7)**2, 0.8-1.5*(gray-0.5)**2, (0.4-gray)
set xrange [6.3:7.5]
set yrange [49.05:49.65]
set cbrange [180:460]
unset colorbox
unset xtics
unset ytics
unset key
CityName(String,Size) = sprintf("{/=%d %s}", Size**0.35/2, String)
plot 'towns' using 2:1:(CityName(stringcolumn(4),$3)):5 with labels tc pal

Für die Deutschlandkarte fällt die Höhenspalte weg, hier wird's dann noch einfacher, das Zeug zu plotten. Als am wichtigsten hat sich die Skalierung der Schrift sowie der Höhencodierung herausgestellt. Hier muss man je nach Plotgröße manuell etwas herumspielen, bis es einigermaßen passt. Aber da das auch bei normalen wissenschaftlichen Plots, die man veröffentlichen möchte, nicht anders ist, sollte das eigentlich einleuchtend sein. Die Saarland-Eingabedatei sieht wie folgt aus:

49.396155 6.695042 15583 "Beckingen"   206
49.354931 7.263340 18457 "Bexbach"     249
49.237624 7.245526 22422 "Blieskastel" 218
49.263738 6.783259  7290 "Bous (Saar)" 229
...

Man sollte bei deutschen Ortsnamen die Datei unbedingt nach ISO 8859-1 konvertieren, da Gnuplot zumindest in meiner Version nicht mit UTF-8-Dateien (und damit Umlauten etc.) zurechtkommt. Daher auch der iso-Eintrag oben im Plotfile.

Lizenz

Alle hier aufgeführten Karten sowie die Codefragmente stehen unter Creative Common CC-BY-SA-Lizenz:

Creative Commons
Namensnennung Weitergabe unter gleichen Bedingungen
Diese Datei wurde unter den Bedingungen der „Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen“-Lizenz (abgekürzt „cc-by-sa“) in der Version 3.0 veröffentlicht.
Personal tools
Select Language