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));