Umrechnung von Kartendaten
Veröffentlicht: 29.11.2010Es gibt einige schöne Tile-Koordinatensysteme, die die Position eines Tiles (=engl. Fliese, in unserem Fall Kartenstück) innerhalb der Openstreetmap-Karte angeben.
Eine Übersicht findet sich z.B. unter
http://wiki.openstreetmap.org/wiki/QuadTiles
Interaktiv kann man unter folgendem Link die Tilekoordinaten herausfinden:
http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection
Wie kommt man von OSM-Koordinaten zu Quadtree-Koordinaten?
OSM Koordinaten haben einen x- und y-Anteil. Die x-Koordinate ist der Verzeichname und die y-Koordinate der Dateiname (17 ist die Zoomstufe):
\Tiles\17\69244\45081.png
Die Quadtree-Koordinaten bezeichnen jeweils Tiles mit Zahlen von 1-4. Die Numerierung erfolgt zeilenweise, in jeder Zoomstufe wird eine weitere Ziffer 1-4 angereiht.
1. Zunächst werden x und y ins Binärformat konvertiert
69244 => 10000111001111100 45081 => 01011000000011001
2. Dann werden die Binärzahlen vermischt. Abwechselnd werden die Bits aneinandergereiht. Begonnen wird mit y(!):
1 0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1
ergibt
110001010010101000001011111010010
3. Jetzt wird die Binärzahl einfach in eine Zahl mit der Basis 4 umgewandelt, z.B. mit http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm
12022111001133102
Dies ist die Quadtreekoordinate.
Wie kommt man zu den Dateinamen von Nokia Sportstracker?
Die Sportstracker-Koordinaten sind nicht mit 1-4 codiert, sondern mit q,r,t,s (ja, in dieser Reihenfolge, denn hier sind die Tiles im Viereck im Uhrzeigersinn numeriert). Außerdem wird allen Dateinamen ein t vorangestellt.
Im obigen Beispiel ergibt sich:
trtqttrrrqqrrssrqt.jpg
Software
Diese kleine Freemat -Funktion rechnet die Koordinaten um:
function coordtrans(x,y)
k=20;
for(i=1:2*k)
bc(i)=4^(2*k-i+1);
end
disp('Binärdaten:')
xbin=int2bin(x,k)
ybin=int2bin(y,k)
for(i=1:k)
interleaved(2*i)=xbin(i);
interleaved(2*i-1)=ybin(i)
end
newdec=bin2int(interleaved);
for(i=2:2*k)
multi(i-1)=floor(newdec/bc(i));
newdec=newdec-(bc(i)*multi(i-1));
end
multi(2*k)=newdec;
disp('Quadtree:');
disp(multi);
translate='qrts';
start=0;
outstring=;
for(i=1:2*k)
if(multi(i)>0 || start>0)
start=1;
outstring=sprintf('%s%s',outstring,translate(multi(i)+1));
end
end
disp(sprintf('Sportstracker-Dateiname: t%s.jpg',outstring));