Breitengrad bzw. Latitude auf OSM Karte umrechnen

Hallo Forum,

ich habe eine OSM Welt-Karte aus PNG-Tiles erstellt und möchte gerne zur geographischen Ortsbestimmung eine Position mittels Breitengrad und Längengrad auf der Karte anzeigen.

Die OSM Karten liegen ja in der Mercator-Projektion vor. Laut meinem Verständniss und meinen Berechnungen müssten somit die Längengrade “normalisiert” sein bzw. Am Equator UND Nord-/Südpol jeweils einen Abstand von ~112,09 km haben.

Mein Problem ist nun die Berechnung der Breitengrade. Die OSM-Karten (bzw. meine Tiles) sind quadratisch. Eine Weltkarte aus 4x4 Tiles ergibt beispielsweise eine Weltkarte von 1024*1024 Pixeln wobei “links-oben” der Geo-Position +85,0 -180,0 und “rechts-unten” der Position -85,0 +180.0 entspricht.
Um nun eine Geo-Position auf solch einer Karte anzuzeigen, möchte ich die Position in Prozent von 0% bis 100% (links->rechts, oben->unten) umrechnen.

Die Normalisierung der Längengrade macht es einfach:
% Horizontal = (longitude+180.0) / 360.0

Bei dem Breitengrad beiße ich mir aber die Zähne aus…Spitzbergen sollte demnach auf ca. ~12,5% der Karte liegen…Schweden ~25%…Italien ~37,5%…Equator ~50%…und so weiter.

Falsch (ist nur linear):
% Vertikal = (latitude - 85.0)/-170.0

Falsch:
% Vertikal = cos(latitude * PI / 180) / 2.0

Falsch:
% Vertikal = cos(latitude * PI / 180) - cos(85 * PI / 180)) / (cos(0 * PI / 180) - cos(85 * PI / 180))

1 Like

Kennst du die Wiki-Seite Slippy map tilenames? Dort ist erklärt, wie man von Koordinaten auf die zugehörige Kachel kommt und umgekehrt. Inklusive Pseudocode und beispielhaften Implementierungen in verschiedenen Script- und Programmiersprachen.

6 Likes

Vielen DANK! Ich hatte so viel im Netz recherchiert und gesucht und mich in die Berechnungen eingearbeitet…aber die Seite habe ich weder über Google noch über die Suche hier im Forum gefunden. Ich wäre auch nie auf die Formel gekommen. Top!!!
Richtig…in “JS”:
% Vertikal = (1 - Math.log(Math.tan(position.coords.latitudeMath.PI/180) + 1 / Math.cos(position.coords.latitudeMath.PI/180)) / Math.PI) / 2.0