2008-09-02

Google Earth

Добил таки сабж.
Теперь карты егойные кешируются.
Стандартная процедура из убунты - редирект из сквида на апач.
Апач вызывает скрипт докачки если не находит нужной картинки.

Плохо, конечно, что не проверяются актуальность карт..
В принципе задача достаточно проста.
Это можно делать в фоне - когда траффик или дешёвый или бесплатный :)

Вроде капчу периодически вылезающую научился правильно обнаруживать и перенаправлять юзера на страницу распознования :)

Теперь со всех сайтов где юзается карта можно брать данные из кеша :)

Здорово. Правда и кеш расположен неоптимально - разбивка только по масштабу.
Зато я научился преобразовывать адрес картинки в формате xyz в формат tXXXX.
Главное было понять суть координат.

Начинается с "t" (z=0). Это понятно.
Каждое приближение увеличивает разрешение в 2 раза.
Итого 4 квадрата на каждое приближение. Квадраты называются по часовой стрелке - q,r,s,t;

Итого первое приближение:
tq, tr
tt, ts
Координаты xy такие: (z=1)
tq (x=0, y=0), tr (x=1, y=0), ts (x=1, y=1), tt(x=0,y=1).

Выбираем, например, квадрат tr.
Он разбивается на квадрат:
trq, trr
trt, trs
Координаты xy такие: (z=2)
trq (x=1<<1|0=2, y=0), trr (x=1<<1|1=3, y=0), trs (x=1<<1|1=3, y=1), trt (x=1<<1|0=2,y=1).

И так далее.

Как обычно - процедурки на перле чтобы это делать:

sub XY2T{my $r='';my ($x,$y,$z)=@_;
for (my $i=0;$i<$z;$i++){my $a=($y&1)<<1|($x&1);$x>>=1;$y>>=1;$_=$a.$_}
tr/0123/qrts/;"t$r"}

sub T2XY{my $r=$_[0];my ($x,$y,$z)=(0,0,length($r)-1);tr/qrts/0123/;
for (my $i=0;$i<$z;$i++){my $a=substr($r,$i+1,1);$x=$x*2+($a&1);$y=$y*2+($a>>1);}}

printf "Str: %s\n", XY2T(20007,10426,15);
printf "Dst: x=%u, y=%u, z=$u\n", T2XY('trtqsrrqtqsttrsr');
Вот вроде и всё что я хотел сказать :) А теперь домой.. По разведанным местам :)