Probleme beim Berechnen von Tiles-Nummern

Hallo Leute,

kämpfe gerade mit der Berechnung der Tile-Nummern zu bestimmten Koordinaten.

Los geht’s mit den Angaben, die mir mein GPS-Empfänger liefert:

5041,2030N
01054.8530E

Daraus wird dann:

lat_deg = 50 + (41,2030 / 60) = 50,686716667°
lon_deg = 10 + (54,8530 / 60) = 10,914216667°

Längenangabe nach Bogenmaß:

lat_rad = 50,686716667 * Pi / 180 = 0,88465093

Jetzt geht es an die Berechnung der Tile-Nummern nach http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames :

Zoom-Level ist 16, macht also 2^16 = 65536

xtile = (10,914216667 + 180) / 360 * 65536 = 34754,87250969

Das ist auch in Ordnung so. Bei der Berechnung von ytile haut es aber nicht hin:

ytile = (1 - log(tan(0,88465093) + (1/cos(0,88465093))) / Pi) / 2 * 65536 = 28104,669817149

Das ist aber nicht die Tile-Nummer zur Länge. Die müsste 22030 sein.

Offensichtlich fehlt mir da etwas, ich habe aber keine Ahnung, was. Wäre super, wenn mir jemand auf die Sprünge helfen könnte. Bin kurz davor, in die Tischkante zu beißen :wink:

Gruß,
Martin

so habe ich es gemacht…

sub tileNumber {
my ($lon,$lat,$zoom) = @_;
my $xtile = int( ($lon+180)/360 2*$zoom ) ;
my $ytile = int( (1 - log(tan($latpi/180) + sec($latpi/180))/pi)/2 2*$zoom ) ;
return(($xtile, $ytile));
}

den weg über min und sec kannst du dir sparen.

ciao und viel erfolg

gerhard

Ja, das Gefühl kenn ich ;-).
Aber die Lösung ist ganz einfach: Du (bzw. Dein Compiler/Interpreter) ha(s)t die “falsche” Logarithmus-Funktion genommen, nämlich den sog. Zehner-Logrithmus (also zur Basis 10), brauchen tust Du aber den natürlichen Logrithmus (also zur Basis e=2,7182817284590).
Dieser heißt vielleicht “ln” oder so ähnlich in Deiner Programmiersprache (die Du leider nicht erwähnt hast)
Falls es keine “ln” -Funktion gibt kannst Du ersatzweise

ytile = (1 - log(tan(0,88465093) + (1/cos(0,88465093)))        / log(2.7182818284590)       / Pi) / 2 * 65536

verwenden

Schöne Grüße

PA94

Hallo PA94,

vielen Dank für den Hinweis. Hätte ich ja auch selber drauf kommen können :wink:

Gruß,
Martin