Koordinatengitter in Bild-Datei einfügen

Im OSM-Forum wurde gefragt:

Ich erstelle mit BigMap ab und zu Karten im PNG-Format. Zuletzt eine Europakarte. In dieser hätte ich gerne ein Koordinatengitter. Ich habe im Internet einige Tools angeschaut und ausprobiert, in keinem habe ich eine derartige Funktion gefunden. Die Programme sind teils extrem komplex, vielleicht habe ich etwas übersehen. Ich habe auch nach einem Tileserver gesucht, der ein Overlay mit Koordinaten anbietet, ebenfalls erfolglos.

Kann mir jemand einen Tipp geben wie ich ein Koordinatengitter reinbekomme? Entweder per Tool oder über eine Erweiterung des Perl-Skripts.

Und:

Nach etwas mehr als ein "paar Tagen" muss ich leider sagen, dass mir weder eines der zig ausprobierten Tools weitergeholfen haben (QGIS ist extremst kompliziert), noch https://help.openstreetmap.org.

Bei letzterem wurde derartiges zwar mehrfach erwähnt, aber letztendlich fand ich keine brauchbare Lösung für meine bereits generierten PNGs, von BigMap ganz zu schweigen. Die Programme zum erstellen von karten haben alle einen Nachteil: sie nutzen die "normale" OSM, ich bevorzuge aber andere Kartenstile.

Wenn jemand noch eine Idee hat, die nicht extrem kompliziert umzusetzen ist, wäre ich weiterhin dankbar.

Das Tool convert aus dem Programmpaket Imagemagick kann Grafik-Dateien laden, mit der -draw-Option verunstalten und wieder speichern.

Bleibt die Aufgabe, die Parameter für den “-draw "line x1,y1 x2,y2"”-Befehl zu bestimmen.

Dazu brauchen wir Höhe und Breite der Karte in Pixeln sowie die Länge von linkem und rechtem und die Breite von oberem und unterem Kartenrand. Und natürlich den gewünschten Rasterabstand.

Die Längengrade sind einfach: aus kleinster und größter Länge sowie dem gewünschten Raster bestimmen wir die zu zeichnenden Längengrade:

my $min = ceil  ($MIN_LON / $GRID_LON);
my $max = floor ($MAX_LON / $GRID_LON);

for (my $i=$min; $i<=$max; $i++) {

        my $lon = $i * $GRID_LON;
        ... Längengrad zeichnen ....
}

Der so bestimmte Längengrad wird linear auf die Pixelkoordinaten abgebildet:

my $x = floor (($lon - $MIN_LON) / ($MAX_LON - $MIN_LON) * $WIDTH);

Und dann der Zeichenbefehl erzeugt: “line $x,0 $x,$HEIGHT”.

Voila.

Bei den Breitengraden gibt es zwei Unterschiede: zum einen wenden wir die Merkator-Transformation auf die geographische Breite an:

my $MIN_LAT_M = mercator($MIN_LAT);
my $MAX_LAT_M = mercator($MAX_LAT);
[…]
for (my $i=$min; $i<=$max; $i++) {

        my $lat_m = mercator ($i * $GRID_LAT);

Zum anderen läuft die Breite von unten nach oben, die Pixel-Y-Koordinaten aber von oben nach unten, daher ist der erste Klammerausdruck umgestellt:

my $y = floor (($MAX_LAT_M - $lat_m) / ($MAX_LAT_M - $MIN_LAT_M) * $HEIGHT);

Das alles fassen wir zu einem hochaufwendigen Skript zusammen, wobei wir uns für die Merkator-Breitentransformation bei Wikipedia bedienen können:

sub mercator {
        my ($lat) = @_;
        my $PI = 3.1415926535;
        my $lat_rad = $lat * $PI / 180.0;
        my $lat_mercator = log(tan($PI/4 + $lat_rad/2));
        return $lat_mercator;
}

Zum Test ziehen wir die 6 Kacheln “http://a.tile.openstreetmap.org/2/{1..2}/{0..2}.png” und kleben diese zu einer 512×768-Pixel-Graphik zusammen:

Karte ohne Koordinatenlinien
Karte ohne Koordinatenlinien

Die Koordinaten der linken unteren Ecke kann man hier zu MIN_LON=-90°, MIN_LAT=-66.51326° bestimmen, die der rechten oberen Ecke analog zu MAX_LON=+90°, MAX_LAT=85.051129°.

Auf diese Graphik wenden wir das Skript an und erhalten dieses Ergebnis:

Karte ohne Koordinatenlinien
Karte mit Koordinatenlinien

Heureka.