Слой Яндекс.Пробки

программа для загрузки и просмотра спутниковых снимков Земли, Луны, Марса предоставленных сервисами Google Maps и Космоснимки. Возможность работы с GPS приёмником.

Модераторы: Tolik, zed

Слой Яндекс.Пробки

Сообщение dsd_corp » 17 мар 2009, 18:04

Всем привет.
Недавно в ветке "Чего вы хотите?" было обсуждение сабжа.
По просьбам трудящихся создаю новую тему и скомпилирую результаты предыдущих обсуждений сюда.

Итак, вот что у нас уже есть. Первое сообщение данной ветки (этот пост) будет регулярно обновляться.

настройки для слоя пробок:
GetUrlScript.txt
Код: Выделить всё
function retrieve_ts(url: string; xstart: string; xend: string):integer; external 'ytrf_retrieve_ts@maps\YaTraf.dll stdcall';
function GetIntParam(key: string): Integer; external 'ytrf_GetIntParam@maps\YaTraf.dll stdcall';
function SetIntParam(key: string; val: Integer): integer; external 'ytrf_SetIntParam@maps\YaTraf.dll stdcall';
function GetUTS: Longint; external 'ytrf_GetUTS@maps\YaTraf.dll stdcall';

function ts_update_needed(delta: integer):integer;
var
  lts, ts : integer;
  lts_key: string;
begin
  result:=0;
  lts_key:='ytrf_lts';
  lts:=GetIntParam(lts_key);
  ts:=GetUTS;
  if (ts>lts+delta) then begin
    SetIntParam(lts_key, GetUTS);
    result:=1;
  end;
end;

function get_ts(delta: integer):integer;
var
  ts_key, url, data: string;
  pt : LongInt;
begin
result:=0;
ts_key:='ytrf_ts';
if (ts_update_needed(delta)>0) then begin
   url:='http://trf.maps.yandex.net/trf/stat.js';
   result:=retrieve_ts(url, 'timestamp:"', '"');
   SetIntParam(ts_key, result);
end else begin
   result:=GetIntParam(ts_key);
end;
end;

begin
ResultURL:='';
if (GetZ<>0) then ResultURL:=GetURLBase+inttostr(GetX)+'&y='+inttostr(GetY)+'&z='+inttostr(GetZ-1)+'&tm='+inttostr(get_ts(60));
end.


params.txt
Код: Выделить всё
[PARAMS]
GUID={C32B96AD-3AC5-4170-ADD7-47B2222AFC99}
asLayer=1
name=Пробки (Яндекс.Карты)
name_9=Traffic (Yandex.Maps)
NameInCache=yatraf
DefURLBase=http://trf.maps.yandex.net/tiles?l=trf&x=
ContentType=image/png
ParentSubMenu=
Ext=.png
projection=2
sradiusa=6378137
sradiusb=6356752
separator=0
UseDwn=1
Usestick=0
UseGenPrevious=0
Usedel=1
Usesave=0
UseAntiBan=0
Sleep=0
DefHotKey=54
BanIfLen=0
DelAfterShow=1

собственно готовый zmp-файл: http://cs.911.ru/traffic/YaTraf.zmp (GUID я ему сгенерил, а слизывал формат с яндекс-гибрида)
для работы слоя необходима внешняя библиотека дополнительных функций.
Скомпилированную библиотеку можно скачать тут: http://cs.911.ru/traffic/YaTraf.dll
Этот файл нужно бросить в папку maps, то есть туда же, где лежат zmp-файлы.

исходники библиотеки(для параноиков и просто интересующихся :D ):
Последний раз редактировалось dsd_corp 16 окт 2009, 10:15, всего редактировалось 3 раз(а).
dsd_corp
Новичок
 
Сообщения: 46
Зарегистрирован: 25 фев 2009, 19:30
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Слой Яндекс.Пробки

Сообщение dsd_corp » 27 мар 2009, 19:39

svp писал(а):
dsd_corp писал(а):подключить к паскаль-компилеру в SAS.Planet

Там не компилер, а интерпретатор.

классы TPSPascalCompiler и TPSExec из RemObjects Pascal Script.
какая разница как обозвать? главное что и так понятно о чем речь.
тем более регистрация внешних функций доступна и во время компиляции и во время выполнения.
dsd_corp
Новичок
 
Сообщения: 46
Зарегистрирован: 25 фев 2009, 19:30
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Слой Яндекс.Пробки

Сообщение feya » 30 мар 2009, 18:02

dsd_corp
Скрипт для примера вроде компилит. Пробуйте.
http://SASGIS.ru | SAS.Планета | SASPlanet
Аватара пользователя
feya
Администратор
 
Сообщения: 2035
Зарегистрирован: 13 июл 2008, 10:45
Благодарил (а): 5 раз.
Поблагодарили: 30 раз.

Re: Слой Яндекс.Пробки

Сообщение dsd_corp » 30 мар 2009, 19:02

feya писал(а):dsd_corp
Скрипт для примера вроде компилит. Пробуйте.

Спасибо огромное. все работает зае... чательно ))))

выкладываю пробки для всех:
  1. файл карты: http://cs.911.ru/traffic/YaTraf.zmp (2,6 кб)
  2. для работы нужно в каталог с SASPlanet.exe бросить эту DLL-ку: http://cs.911.ru/traffic/YaTraf.dll (18,4 кб)


а теперь исходники:
исходники DLL-ки в zip: http://cs.911.ru/traffic/YaTraf_dll_src.zip (2,8 кб zip)
исходники модуля DLL-ки как html: http://cs.911.ru/traffic/uYaTraf.pas.html (36,5 кб)

DLL пишет промежуточные данные в реестр. то есть создает ветку HKEY_CURRENT_USER\Software\SAS.Planet\YaTraf
в принципе можно переделать и писать непосредственно в память, учитывая, что DLL линкуется к программе при старте(на этапе компиляции скриптов карт), и "отпускает" ее при завершении работы программы.

теперь осталось решить вопрос с кешированием.
типа добавить для карты параметр - не писать в кеш, либо возможность управлять кешированием из скрипта GetUrlScript.txt. при чем второе было бы оптимальнее, ибо удобнее контролировать "устаревание" тайлов таких нестандартных карт, как эта.
а то получается, что если ставишь "только интернет", то с пробками все ок, тайлы обновляются, но так же все время с сервера тащится карта подложка(основная, а не слой пробок).
а надо чтоб подложка не тащилась, а тащился тока слой.

так же из скрипта было бы неплохо сделать возможность не грузить тайл (если в нужной зоне и так известно, что тайлов нет). незачем лишний раз дергать яндекс - дольше незабанят )

и еще не отображать сообщение "Такого изображения нет на сервере". а то даже в валидных зонах(в центре Москвы) бывают области, где инфы о пробках нет(напр. территория завода ЗИЛ) - в таких местах и тайлы пробок тоже отсутствуют - они пустые тайлы не генерят видимо.

P.S. напомню всем, что пробки видны только в городах Москва, Питер, Ебург и Киев.
dsd_corp
Новичок
 
Сообщения: 46
Зарегистрирован: 25 фев 2009, 19:30
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Слой Яндекс.Пробки

Сообщение feya » 30 мар 2009, 20:28

Спасибо огромное. все работает зае... чательно ))))

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

Тут можно например просто пустую строку возвращать)
http://SASGIS.ru | SAS.Планета | SASPlanet
Аватара пользователя
feya
Администратор
 
Сообщения: 2035
Зарегистрирован: 13 июл 2008, 10:45
Благодарил (а): 5 раз.
Поблагодарили: 30 раз.

Re: Слой Яндекс.Пробки

Сообщение dsd_corp » 30 мар 2009, 22:00

feya писал(а):
так же из скрипта было бы неплохо сделать возможность не грузить тайл (если в нужной зоне и так известно, что тайлов нет). незачем лишний раз дергать яндекс - дольше незабанят )

Тут можно например просто пустую строку возвращать)

то есть этот трюк с пустой строкой уже работает?
если нет, то лучше бы добавить еще одну возвращаемую из скрипта переменную, как раз управляющую статусом запроса.
чтобы был набор комманд, например:
'-dontload' - тайл не грузим
'-force' грузим из инета независимо от наличия в кеше
'-cache' если есть в кеше, берем из него, если нет - значит нет, из инета не грузим
'-auto' действие по умолчанию, т.е. кеш либо инет, либо настройка что в проге на тулбаре выставлена.
при таком раскладе статус запроса в ResultURL вместо URL уже не катит - ведь половине статусов URL как раз нужен будет )


еще в GetUrlScript.txt засунуть бы отдельной переменной(наравне с GetX, GetY...) путь к файлу тайла в кеше(ну типа GetPath), т.е. как он в кеше называется или будет называться(если еще не скачан).
в таком случае я, к примеру, посредством внешней DLL смогу получать время создания файлов кеша, чтобы сравнить с текущим и решить, обновлять его или нет.
ну как-то так...

P.S. я, конечно, зануда еще та ))) у тя и так задач дофига, а я тут прям достаю... )))

P.P.S. хотя я не очень уверен, что если файл в кеше нашелся, у тебя вообще дело доходит до выполнения GetUrlScript.txt...
dsd_corp
Новичок
 
Сообщения: 46
Зарегистрирован: 25 фев 2009, 19:30
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Слой Яндекс.Пробки

Сообщение vdemidov » 30 мар 2009, 22:11

dsd_corp писал(а):еще в GetUrlScript.txt засунуть бы отдельной переменной(наравне с GetX, GetY...) путь к файлу тайла в кеше(ну типа GetPath), т.е. как он в кеше называется или будет называться(если еще не скачан).
в таком случае я, к примеру, посредством внешней DLL смогу получать время создания файлов кеша, чтобы сравнить с текущим и решить, обновлять его или нет.
ну как-то так...

А вот этого делать не стоит. Так как если добавить поддержку плагинов для хранилищ тайлов, то отдельного файла уже может и не существовать. Только через специальный интерфейс. А вот его нужно продумать.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1166
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 92 раз.
Поблагодарили: 52 раз.

Re: Слой Яндекс.Пробки

Сообщение dsd_corp » 31 мар 2009, 00:17

vdemidov писал(а):А вот этого делать не стоит. Так как если добавить поддержку плагинов для хранилищ тайлов, то отдельного файла уже может и не существовать. Только через специальный интерфейс. А вот его нужно продумать.

Ой. Да бросьте. Будет хранилище - не будет пути в переменной. Не будет пути - этот кусок работать перестанет.
Иными словами: вот когда появятся хранилища, тогда об интерфейсах и поговорим )
сейчас-то чего бояться? ))
Тем более я и предложил не вклеивать в программу функции для пробок, а вынести их во внешние библиотеки(плагины), именно для того, чтобы отделить нестандартный функционал от ядра программы.
И кстати, в вашем изложении "специальный интерфейс" - сильно расплывчатое понятие. COM-интерфейсами в программе пока не пахнет даже, встраивать что-то объектное в Pascal Script - тоже сомнительное решение.
В общем об этом надо говорить, когда появится предмет обсуждения.
А пока я просто стараюсь не перенапрягать автора - прошу у него только самого необходимого.
По идее я и сам могу вычислить путь к файлу, благо алгоритм несложен, путь к самому кешу можно взять из ini-файла. Но не вижу смысла, зачем - ведь прога мне сама может сообщить уже готовый путь - в проге-то он все равно уже вычисляется.
или могу периодически вычищать кеш именно этой карты(т.е. всю папку тупо чистить)...
но лучше в любом случае - если прога сама мне позволит управлять загрузкой и обновлением тайлов. в принципе мне все равно - даст она мне путь к тайлу, или даст его время создания и управление его обновлением...
dsd_corp
Новичок
 
Сообщения: 46
Зарегистрирован: 25 фев 2009, 19:30
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Слой Яндекс.Пробки

Сообщение vdemidov » 31 мар 2009, 00:34

Будет пахнуть именно COM-интерфейсами. Точнее построенными по принципу COM, но без использования системной инфраструктуры. И будет уже относительно скоро. В течении ближайших пары неденль буду пытаться прикручивать это добро. И первое что будет прикручено, это хранилища. Для начала, конечно, только стандартные в виде папок с файлами, но в ближайшем будущем будет БерклиДБ или SQLite.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1166
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 92 раз.
Поблагодарили: 52 раз.

Re: Слой Яндекс.Пробки

Сообщение dsd_corp » 31 мар 2009, 15:46

to vdemidov: ну ладно, ладно. как наворотите, там и посмотрим что получиццо )))

to feya: так все-таки, как насчет выноса в params.txt параметра "только интернет" для отдельно взятой карты? пока что это мешает пользоваться пробками больше всего. остальное терпимо, в общем-то...
dsd_corp
Новичок
 
Сообщения: 46
Зарегистрирован: 25 фев 2009, 19:30
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Слой Яндекс.Пробки

Сообщение feya » 31 мар 2009, 16:34

dsd_corp писал(а):to feya: так все-таки, как насчет выноса в params.txt параметра "только интернет" для отдельно взятой карты? пока что это мешает пользоваться пробками больше всего. остальное терпимо, в общем-то...

А как эхто разрулить в плане интерфейса пользователя? Т.е. если просто указывать в параметрах всегда загружать - пользователь об этом ничего не будет знать а прога будет грузить, тут из-за статистики на 2 килобайта часто шум поднимают) не хочется чтоб прога грузила чтолибо до того пока пользователь не укажет явно. С другой стороны можно сделать указание отдельно для карт и слоев источника, но это будет не очень удобно. Такчто тут надо думать, предлагайте.
http://SASGIS.ru | SAS.Планета | SASPlanet
Аватара пользователя
feya
Администратор
 
Сообщения: 2035
Зарегистрирован: 13 июл 2008, 10:45
Благодарил (а): 5 раз.
Поблагодарили: 30 раз.

Пред.След.

Вернуться в SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

cron