Hendrich.org

Umrechnung von Kartendaten

Veröffentlicht: 29.11.2010

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