BigMap: Koordinatengitter (nachträglich) in die PNG-Datei einfügen?

Ich erstelle mit BigMap (2) 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.

Ein Koordinatengitter in Google-Mercator-Koordinaten wäre einfach, aber Du willst sicher Längen- und Breitengrade. Das ist auf jeden Fall nicht ganz einfach. Für die Breitengrade - die alle gerade von links nach rechts im Bild verlaufen - könntest Du noch einigermassen leicht die richtigen Pixelpositionen ermitteln (Wikiseite http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames hat dazu wertvolle Hinweise), doch die Längengrade sind ja “gebogen” und daher aufwendiger.

Vorgehen etwa so:

  1. ermittle Eck-Koordinaten des Bildes in Google Mercator
  2. transformiere in Längen- und Breitengrade (https://lists.openstreetmap.org/pipermail/talk-de/2012-January/091560.html)
  3. runde untere linke Ecke ab, obere rechte Ecke auf
  4. jeweils getrennt für Längen und Breiten: halte eine Achse fest, gehe mit for-Schleife in Schritten von ca. 1/100 Bildbreite/Höhe durch die andere Achse, transformiere jeden Längen/Breitenpunkt wieder in Mercator und dann in Bildkoordinaten, zeichne Linie, die die so gefundenen Bildkoordinaten verbindet

Bye
Frederik

Moins,

Verlaufen die wirklich gebogen? Nach meiner Erfahrungs verlaufen geographischen Koordinatenlinien (nicht! aber UTM-Linien) auf einer Karte in Merkator-Projektion exakt senkrecht und exakt waagrecht. Nur sind die Breitengerade nicht äquidistant.

Wenn man die Koordinaten der Eckpunkte kennt und den gewünschten Linienabstand in Grad kennt, kann man daraus leicht die Befehle erzeugen, mit denen z.B. Image-Magick die gewünschten Linien in das Bild einzeichnet.

Gruß Wolf

Hm. Ich glaub, Du hast recht. – Das heisst, man kann meinen Schritt “4” vereinfachen in eine einzelne Linien-Zeichen-Operation von links ausserhalb des Bildes nach rechts ausserhalb, bzw. von unten ausserhalb des Bildes nach oben ausserhalb.

Bye
Frederik

Ich meine, es gab auch mal was dazu auf https://help.openstreetmap.org … suche da mal nach “grid”

Ich möchte “normale” Längen- und Breitengrade haben. Diese müssten durch die zunehmende Verzerrung der Karte vom Äquator in Richtung der Pole gerade sein. Ungerade müssten sie bei einer Kugel oder ohne Verzerrungen (also Lücken auf der ebenen Karte) sein.

Image-Magick werde ich mir mal anschauen.

Werde ich mir mal genauer anschauen.

Ich melde mich die Tage wieder.

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 die nicht extrem kompliziert umzusetzen ist wäre ich weiterhin dankbar. :slight_smile:

Moins,

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:

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:

Gruß Wolf

PS: Umbau des Skriptes in ein Tool, also ziehen der Parameter von der Kommandozeile und idealerweise automatische Bestimmung der Größe der Grafik, oder Einbau in das Bigmap-Tool möge ein anderer übernehmen.