x

OSM Tiles werden falsch berechnet (Problem behoben)


Geschrieben von Gibson (Gast) am 08. April 2010 21:25:46: [flux]

Hallo liebe OSM-Community,

ich arbeite an meiner Bachelorarbeit und muss dafür eine Karte auf mobilen javafähigen Geräten -J2ME- (Handy & Co) mithilfe der OpenStreetmap Rohdaten erstellen. Ich bin soweit, das ich mittels Mercator-Projektion eine Vektorkarte um einen GPS-Punkt (lat/lon) zeichnen lassen kann. Gleichzeitig unterstützt mein Renderer jedoch auch das darstellen vorgerenderter Tiles im PNG-Format. Um nun meine echte Position auch auf dem Bildschirm darstellen zu können, muss ich die Bounding Box der Tiles berechnen. Nutzen tuhe ich dafür die Java-Funktionen auf http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames.

Die Tilenummern werden richtig berechnet, jedoch nicht die Bounding Box.

So sieht das ganze bei mir aus:

public int[] getTileNumber(final double lat, final double lon, final int zoom) {
int[] tile = new int[2];
tile[0] = (int)Math.floor( (lon + 180) / 360 * (1<<zoom) ) ;
tile[1] = (int)Math.floor( (1 - log(Math.tan(Math.toRadians(lat)) + 1 / Math.cos(Math.toRadians(lat))) / Math.PI) / 2 * (1<<zoom) ) ;
return tile;
}

public double[] tile2boundingBox(final int x, final int y, final int zoom) {
double[] coord = new double[4];
coord[0] = tile2lat(y, zoom);
coord[1] = tile2lat(y +1 , zoom);
coord[2] = tile2lon(x, zoom);
coord[3] = tile2lon(x + 1, zoom);
return coord;
}

static double tile2lon(int x, int z) {
return (x / pow(2, z) * 360 - 180);
}

public static double tile2lat(int y, int zoom) {
final double n = Math.PI - ((2.0 * Math.PI * y) / (1 << zoom));
return 180.0 / Math.PI * atan(0.5 * (exp(n) - exp(-n)));
}

Zum verifizieren der Ergebnisse nutze ich den Rechner auf: http://oms.wff.ch/calc.php

Gebe ich nun zum Testen Beispielsweise lat=46 und lon=6 ein, bekomm eich als Ergebnis die Tilenummer tileX=33860 und tileY=23315 was laut Online-Rechner auch Korrekt ist. Versuche ich jetzt die Bounding Box zu berechnen, bekomme ich heraus:

Latitude: 46.12692302030414 to 46.12349698536844

Longitude: 5.998535 to 6.004028

... laut http://oms.wff.ch/calc.php müsste aber richtig sein:

Latitude: 45.996895 to 46.000711

Longitude: 5.998535 to 6.004028

Weiss jemand wo der Fehler liegt? Ich sitz schon viele Stunden an diesem Problem und finde den Fehler nicht. Ohne diese korrekte Berechnung kann ich keine Navigation auf der Karte und auf dem Handy ermöglichen.


Antworten: