====== Создание zmp - простой пример ======
Эта пошаговая инструкция писалась [[http://sasgis.org/forum/viewtopic.php?p=26156#p26156|на форуме]] параллельно с созданием zmp для спутникового снимка города Ма́льмё, http://malmo.se/karta.
----
**1.** Надо посмотреть, из чего состоит карта. И если она состоит из тайлов (квадратных картинок), надо определить URL каждого тайла.
Я пользуюсь браузером Firefox, установлены плагины AdBlockPlus (совершенно необходимый плагин, используется по прямому назначению, а также показывает все картинки на странице) и HttpFox (необязательный, но удобный плагин, показывает все запросы и ответы http). В клинических случаях приходится пользоваться снифером Wireshark. Также рекомендую JavaScript Deobfuscator, но это явно не для простого примера.
Часто никакие плагины и не нужны.
Первым делом надо сделать так, чтобы по правой кнопке мыши на карте вызывалось контекстное меню Firefox. Для этого идём в настройки Firefox: Tools - Options - Content - кнопка Advanced справа от Enable JavaScript - там убрать все галочки.
**Update:** в новых версиях FireFox этих настроек в меню нет. Для того, чтобы запретить JavaScript подменять контекстное меню, надо в адресной строке набрать about:config, найти параметр dom.event.contextmenu.enabled и изменить его на false.
Заходим на сайт нужной карты, для примера, http://malmo.se/karta
Выбираем интересующий вид - Fotokarta 2011.
Кликаем правой кнопкой. В контекстном меню, к сожалению, нет View Image Info, но есть View Page Info. Тоже хорошо, кликаем туда.
В этом Page Info переходим на закладку Media и ищем нужные тайлы.
Во-первых, они есть, что не может не радовать :-)
Тип jpeg, размер 256х256 - это очень хорошо, т.к. САС работает только с таким размером тайлов (если размер отличается, САС умеет сжимать или растягивать, с потерей качества, конечно).
Выглядят адреса так:
http://xyz.malmo.se/data_e/tilecache/malmo/malmo_ortofoto_2011/03/000/000/020/000/000/016.jpeg
http://xyz.malmo.se/data_e/tilecache/malmo/malmo_ortofoto_2011/03/000/000/019/000/000/016.jpeg
http://xyz.malmo.se/data_e/tilecache/malmo/malmo_ortofoto_2011/03/000/000/018/000/000/016.jpeg
http://xyz.malmo.se/data_e/tilecache/malmo/malmo_ortofoto_2011/03/000/000/018/000/000/017.jpeg
Здесь неизменная часть адреса -
http://xyz.malmo.se/data_e/tilecache/malmo/malmo_ortofoto_2011/
03 - очевидно, зум, 020 - видимо, Х, 016 - видимо, Y (а может, и наоборот), остальные 000 непонятно зачем, да и не важно.
Сразу замечаем, что карта без привязки :-(
Если бы была с привязкой, номера тайлов были бы гораздо больше.
По поводу привязки, имеет смысл проверить, насколько всё плохо.
Слева какой-то стадион на malmo.se, зум 3, справа он же на Гугле, зум 15 (если считать от нуля).
{{:malmo.jpeg|http://xyz.malmo.se/data_e/tilecache/malmo/malmo_ortofoto_2011/03/000/000/019/000/000/017.jpeg}}{{:google.jpg|http://khm3.google.com/kh/v=101&hl=ru&x=17566&y=10270&z=15&s=Ga}}
Видно, что они не совпадают, так что привязывать можно и не пытаться.
----
**2.** Теперь надо сделать **zmp**.
Берём какую-нибудь простую локальную карту, например, Maps\sas.maps\Local\visicom.zmp, копируем директорию visicom.zmp в директорию Maps, переименовываем в **malmo.se.sat.zmp**.
В директории обязательно должны быть эти 4 файла:
* 18.bmp
* 24.bmp
* GetUrlScript.txt
* params.txt
Подробнее о них написано в разделе [[zmp|Описание формата пользовательских карт zmp]]
Редактируем **params.txt**. Самые главные параметры:
GUID - обязательно должен быть уникальным (т.е. на всех zmp разным).
Если у двух карт GUID совпадает, при запуске SAS.Планеты появится сообщение об ошибке.
Рекомендуется его генерировать на сайте [[http://www.guidgenerator.com/online-guid-generator.aspx|Online GUID Generator]] или с помощью специальной программы {{:getguid.zip|}}. Можно исправить и вручную (в этом примере я просто исправил одну цифру).
GUID={63866E5D-09F2-4732-9D21-6350124302CB}
Имя карты и подменю на 3-х языках:
name=Спутник Мальмё (malmo.se)
name_en=Malmö Sat (malmo.se)
name_uk=Супутник Мальме (malmo.se)
ParentSubMenu=Локальные карты
ParentSubMenu_en=Local maps
ParentSubMenu_uk=Локальні карти
Директория, в которой хранится кэш. Тоже должна быть уникальной:
NameInCache=malmo.se.sat
Неизменная часть URL:
DefURLBase=http://xyz.malmo.se/data_e/tilecache/malmo/malmo_ortofoto_2011/
Тип файлов:
ContentType=image/jpeg
Ext=.jpg
Остальное можно пока не трогать.
----
**3.** Теперь надо написать паскаль-скрипт, который будет генерировать изменяемую часть адреса.
Редактируем **GetUrlScript.txt**.
В САСе зумы считаются от 1 до 24, во всех (или почти всех) картах от нуля.
На карте Мальмё на зуме 0, кажется, не больше 16 тайлов, X и Y от 0 до 3. Значит, зума 3 в САСе будет достаточно (на этом зуме всего 16 тайлов). Так что будем использовать GetZ-3.
Максимальный зум на сайте 6, номера тайлов не превышают 999.
Самый простой скрипт получается таким:
begin
ResultURL:=GetURLBase+IntToStr(GetZ-3)+'/000/000/'+IntToStr(GetX)+'/000/000/'+IntToStr(GetY)+'.jpeg';
end.
Вроде похоже, только X и Y на этой карте в виде 3-значных чисел, надо проверить, будет ли работать с 1- или 2-значными.
А Z должна быть 2-значной.
Берём URL одного тайла http://xyz.malmo.se/data_e/tilecache/malmo/malmo_ortofoto_2011/03/000/000/019/000/000/017.jpeg, открываем его браузером (картинка открывается), меняем 019 на 19, а 017 на 17 - фигушки, не работает.
Придётся усложнить скрипт так, чтобы добавлялись незначащие нули до трёх знаков.
Например, if...
Конечно, можно добавить для начала нули вручную и посмотреть, что получится:
begin
ResultURL:=GetURLBase+'0'+IntToStr(GetZ-3)+'/000/000/00'+IntToStr(GetX)+'/000/000/00'+IntToStr(GetY)+'.jpeg';
end;
(понятно, что работать будет только для X,Y,Z ≤ 9).
Теперь можно запустить SAS.Планету.
Запускаем, переходим на зум 3, выбираем нашу карту и смотрим, что вышло:
{{:2012-02-10_104906.gif|}}
Ну, уже как бы неплохо :-D
Как видно, на malmo.se координата Y считается снизу вверх, а в SAS.Планете сверху вниз.
Надо тоже исправить в скрипте.
----
**4.** Для того, чтобы перевернуть карту, надо написать так:
Y := round(intpower(2,GetZ-1)) - 1 - GetY
''2^(Z-1)'' - это число тайлов по каждой координате для зума Z. Использовать round приходится, чтобы получить тип integer (в Паскале с этим строго).
----
**5.** В результате получился вот такой скрипт:
var
Y: integer;
SX, SY: string;
begin
Y := round(intpower(2,GetZ-1)) - 1 - GetY;
case Y of
0..9: SY := '00'+IntToStr(Y);
10..99: SY := '0'+IntToStr(Y);
100..999: SY := IntToStr(Y);
end;
case GetX of
0..9: SX := '00'+IntToStr(GetX);
10..99: SX := '0'+IntToStr(GetX);
100..999: SX := IntToStr(GetX);
end;
if ((GetZ <= 10) and (GetZ >= 4)) then
ResultURL:=GetURLBase+'0'+IntToStr(GetZ-4)+'/000/000/'+SX+'/000/000/'+SY+'.jpeg';
end.
Кроме добавления нулей, пришлось сделать GetZ-4 вместо GetZ-3, т.к. правая часть карты на некоторых зумах не помещалась.
Так что теперь работает на зумах от 4 до 10, карта находится в левом нижнем углу.
Т.к. это попытка сделать образцово-показательный код, добавил туда [[как скачивать нужные масштабы и не скачивать ненужные|ограничение зума]]:
if ((GetZ <= 10) and (GetZ >= 4))
Обычно этого никто не делает (лень), а зря. Теперь при неправильном зуме SAS.Планета не будет слать на сервер дурацких запросов, не будет выводить на экран ошибки и сохранять в кэше ненужные tne.
----
**6.** Последние штрихи.
Можно добавить **info.txt**, его содержимое будет видно при правом клике на карту - Map Info.
Надо пользоваться тэгами html.
Например, так:
http://malmo.se/karta
Спутниковый снимок города Мальмё.
Работает на зумах от 4 до 10, карта находится в левом нижнем углу.
Можно изменить иконки **18.bmp** и **24.bmp**, их видно в меню и в тулбаре, соответственно.
Например, взять этот логотип и уменьшить его до нужного размера графическим редактором.
{{:malmo-stad-logo.png|}}
Как написано в главе [[zmp|Описание формата пользовательских карт zmp]], цвет фона - (255, 0, 255). То есть пурпурный цвет обозначает прозрачность иконки. К сожалению, сейчас поддерживаются иконки только в формате bmp, размер только 18х18 и 24х24. В последних версиях программы логотип уменьшать не обязательно, достаточно переименовать в 24.bmp (а 18.bmp удалить).
Можно подправить в **params.txt** параметры pnum и separator, чтобы изменить положение карты в меню.
Чтобы увидеть изменения, надо закрыть САС, удалить (переименовать) Maps\maps.ini и снова запустить. Я, пожалуй, оба оставлю пустыми (нулевыми).
И вот результат!
{{:malmo.se.sat.zmp.zip|}}