Mapki bitmapowe again
: 08 kwie 2008, 12:01
W nawiązaniu do:
http://www.garniak.pl/viewtopic.php?t=2224&highlight=
http://www.garniak.pl/viewtopic.php?t=783&highlight=
Sorki za kompletnie rozwalone formatowanie.
Procedura na przykładzie map z e-góry.pl, podobnie jest na mapyonline.pl gdzie ze względu na brak zabezpieczeń jest łatwiej, w podobny sposób można sobie radzić z mapa.targeo.pl, zumi.pl etc. Jak na razie nie udało mi się wyczaić jak działa viamichelin.com
1. Wyczajenie adresacji
1.1. Stawiamy sobie prozy - może być na naszym lokalnym komputerze (np.: FreeProxy 3.x http://www.handcraftedsoftware.org/)
1.1.1. Ustawiamy logowanie adresów do pliku txt (np.: c:\log\access.txt)
1.1.2. Uruchamiamy podgląd logów (np.: tail –f c:\log\access.txt )
1.2. Odpalamy przeglądarkę i ustawiamy żeby wszystkie połączenia wykonywała przez nasz lokalny proxy.
1.3. W pliku access.txt widzimy pobierane pliki.
1.4. Wchodzimy na stronkę z mapami.
1.4.1. W międzyczasie ładowania przeglądarki mapy powinien się załadować plik „ImageProperties.xml” <IMAGE_PROPERTIES WIDTH="11571" HEIGHT="7996" NUMTILES="1969" NUMIMAGES="1" VERSION="1.8" TILESIZE="256" />
W pliku tym mamy rozmiar obrazka docelowego (11571x7996) oraz liczbę kafelków (1969) i ich rozmiar (256)
1.4.2. Przeglądając mapkę (pion, poziom, zoom) zauważamy, że format pliku to Z-X-Y.jpg gdzie Z – zoom, X - współrzędna X, Y -współrzędna Y. W zależności od wielkości mapy max zoom jest 5 lub 6
1.4.3. Kolejne obrazki są w katalogach TileGroupN, gdzie N 0..max, w jednym katalogu jest 256 kafelków w kolejnych zoomach.
1.4.4. Rozłożenie kafelków można wyczaić na piechotę patrząc gdzie się zmienia N lub wyliczyć (dzielimy rozmiar przez 256 i zaokrąglamy w górę, apotem przez dwa zaokrąglając w górę aż otrzymamy rozmiar 1x1 który odpowiadz zoom’owi 0):
1.4.5. Jak już wszystko wiemy to należy wygenerować listę plików do ściągnięcia wgetem lub total commanderem. Ja używam darmowego VStudio2008 Express ale to kobyła więc można użyć dowolnego innego języka skryptowego
2. A na koniec sklejamy używając ImageMagic (http://www.imagemagick.org/), poniżej generator skryptu
Jeśli dotarłeś do tego miejsca to gratuluję zacięcia 
http://www.garniak.pl/viewtopic.php?t=2224&highlight=
http://www.garniak.pl/viewtopic.php?t=783&highlight=
Sorki za kompletnie rozwalone formatowanie.
Procedura na przykładzie map z e-góry.pl, podobnie jest na mapyonline.pl gdzie ze względu na brak zabezpieczeń jest łatwiej, w podobny sposób można sobie radzić z mapa.targeo.pl, zumi.pl etc. Jak na razie nie udało mi się wyczaić jak działa viamichelin.com
1. Wyczajenie adresacji
1.1. Stawiamy sobie prozy - może być na naszym lokalnym komputerze (np.: FreeProxy 3.x http://www.handcraftedsoftware.org/)
1.1.1. Ustawiamy logowanie adresów do pliku txt (np.: c:\log\access.txt)
1.1.2. Uruchamiamy podgląd logów (np.: tail –f c:\log\access.txt )
1.2. Odpalamy przeglądarkę i ustawiamy żeby wszystkie połączenia wykonywała przez nasz lokalny proxy.
1.3. W pliku access.txt widzimy pobierane pliki.
1.4. Wchodzimy na stronkę z mapami.
1.4.1. W międzyczasie ładowania przeglądarki mapy powinien się załadować plik „ImageProperties.xml” <IMAGE_PROPERTIES WIDTH="11571" HEIGHT="7996" NUMTILES="1969" NUMIMAGES="1" VERSION="1.8" TILESIZE="256" />
W pliku tym mamy rozmiar obrazka docelowego (11571x7996) oraz liczbę kafelków (1969) i ich rozmiar (256)
1.4.2. Przeglądając mapkę (pion, poziom, zoom) zauważamy, że format pliku to Z-X-Y.jpg gdzie Z – zoom, X - współrzędna X, Y -współrzędna Y. W zależności od wielkości mapy max zoom jest 5 lub 6
1.4.3. Kolejne obrazki są w katalogach TileGroupN, gdzie N 0..max, w jednym katalogu jest 256 kafelków w kolejnych zoomach.
1.4.4. Rozłożenie kafelków można wyczaić na piechotę patrząc gdzie się zmienia N lub wyliczyć (dzielimy rozmiar przez 256 i zaokrąglamy w górę, apotem przez dwa zaokrąglając w górę aż otrzymamy rozmiar 1x1 który odpowiadz zoom’owi 0):
- Z - zoom 6 5 4 3 2 1 0
Y 8171 31,91797 32 16 8 4 2 1 1
X 11776 46 46 23 12 6 3 2 1
NumTiles 1969 1472 368 96 24 6 2 1
1969 1969 497 129 33 9 3 1
TileGroup 1-7 0-1 0 0 0 0 0
Kod: Zaznacz cały
6 5 4 3 2 1 0
8171 =C3/256 32 =ZAOKR.GÓRA(E3/2;0) =ZAOKR.GÓRA(F3/2;0) =ZAOKR.GÓRA(G3/2;0) =ZAOKR.GÓRA(H3/2;0) =ZAOKR.GÓRA(I3/2;0) =ZAOKR.GÓRA(J3/2;0)
11776 =C4/256 46 =ZAOKR.GÓRA(E4/2;0) =ZAOKR.GÓRA(F4/2;0) =ZAOKR.GÓRA(G4/2;0) =ZAOKR.GÓRA(H4/2;0) =ZAOKR.GÓRA(I4/2;0) =ZAOKR.GÓRA(J4/2;0)
=SUMA(E5:K5) =E3*E4 =F3*F4 =G3*G4 =H3*H4 =I3*I4 =J3*J4 =K3*K4
1969 =E5+F6 =F5+G6 =G5+H6 =H5+I6 =I5+J6 =J5+K6 =K5
1-7 0-1 =ZAOKR.DÓŁ(G6/256;0) =ZAOKR.DÓŁ(H6/256;0) =ZAOKR.DÓŁ(I6/256;0) =ZAOKR.DÓŁ(J6/256;0) =ZAOKR.DÓŁ(K6/256;0)Kod: Zaznacz cały
// bniski_ws
#define URLFORMAT "http://www.compass.krakow.pl/kopie_mapy/compass/bniski_wschod/TileGroup%d/5-%d-%d.jpg\n"
#define TILEGR_START 0
#define TILEGR_END 2
int gTGStartX[TILEGR_END] = { 11, 15} ;
int gTGStartY[TILEGR_END] = { 3, 15} ;
#define MAX_X 20
#define MAX_Y 23
int _tmain(int argc, _TCHAR* argv[])
{
int tg = TILEGR_START;
for( int y = MIN_Y; y <= MAX_Y; ++y )
for( int x = MIN_X; x <= MAX_X; ++x )
{
if( x == gTGStartX[ tg ] && y == gTGStartY[ tg ])
++tg;
printf( URLFORMAT, tg, x, y ); //compass
}
return 0;
}Kod: Zaznacz cały
#define MAP_NAME "bniski_ws"
#define TILE_SIZE "21x"
#define MAX_X 20
#define MAX_Y 23
#define ZOOM_LEVEL "5"
#define IM_PATH "\"C:\\Tools\\ImageMagick-6.3.9-Q16\\montage\""
const char params[] = IM_PATH \
" -tile " \
TILE_SIZE \
" -geometry x256 -gravity NorthWest ";
const char params1[] = IM_PATH \
" -tile 1x -geometry x256 -gravity NorthWest ";
int _tmain(int argc, _TCHAR* argv[])
{
for(int y = 0; y <= MAX_Y ; ++y )
{
printf("%s", params );
for( int x = 0; x <= MAX_X ;++x )
printf( ZOOM_LEVEL "-%d-%d.jpg ", x, y );
printf("out%d.jpg\n",y);
}
printf( params1 );
for(int y = 0; y <= MAX_Y; ++y )
printf("out%d.jpg ", y );
printf(MAP_NAME ".jpg\n");
return 0;
}