====== Формат zmp и создание карт ======
Каждый картографический сервис в SASPlanet описывается в "zmp". Это папка или zip-архив с расширением ''.zmp'', в котором хранится текстовое описание сервиса в особом формате. Один "zmp" соответствует одной карте и независим от других. Сама аббревиатура является производным от слов: **z**ip **m**a**p**.
Коллекция zmp расположена в подпапках ''Maps'' в виде дерева каталогов и распространяется через [[основной_репозиторий|git-репозитарий]] отдельно от SAS.Planet. В прошлом в программе использовались только zip-архивы с расширением ''.zmp''. Сразу после установки программы обновите набор zmp.
===== Общий принцип =====
SAS.Planet скачивает [[тайл|тайлы]] с сервера и сохраняет их в тайловый кеш. В zmp описывается, как формируется ссылка на конкретный тайл и особенности HTTP-запроса на скачивание с конкретного сервера. При создании zmp чаще всего копируют поведение браузера при просмотре online-карт. Удобно пользоваться встроенными в браузер инструментами веб-разработчика, так, для Firefox нажмите //F12//, после чего откройте веб-страницу с картой.
Обучающие примеры:
* [[Простой пример]]
* [[Простой пример с плейсхолдерами]]
* [[Пример порезки на тайлы]]
* [[Описание Паскаль скриптов]] (GetUrlScript.txt)
* [[Как скачивать нужные масштабы и не скачивать ненужные]]
* Сложный пример (подключение dll)
===== Структура ZMP =====
Каждый zmp может содержать следующие файлы и папки:
* **params.txt** — описывает основные параметры карты или слоя, единственный файл, который **является обязательным**;
* **[[описание_паскаль_скриптов|GetUrlScript.txt]]** — скрипт, отвечающий за формирование ссылки на тайл карты и пользовательских заголовков; не нужен если используется [[простой_пример_с_плейсхолдерами|упрощенное добавление карт]]). Скрипты пишутся на обычном Pascal. Основными параметрами [[тайл|тайла]] являются масштаб и координаты по осям ''x'' и ''y''. Масштаб обозначается переменной ''GetZ'' (начинается с единицы), координаты по осям ''x'' и ''y'' - соответственно переменными ''GetX'' и ''GetY''. Эти переменные привязаны к [[Тайл|тайловой сетке]], принятой для [[maps:Google Maps|Google Maps]];
* **24.bmp** — файл иконки, отображаемой на панели инструментов. Содержимое этого файла — изображение произвольного размера в формате BMP, PNG, ICO и других, но имя должно быть ''24.bmp''. В ранних версиях программы требовались иконки ''18.bmp'' (BMP, 18×18 pix, цвет фона RGB(255,0,255)) и ''24.bmp'' 24×24 pix, цвет фона RGB(255,0,255)).
* **info.txt** — словесное описание карты в подмножестве HTML (в частности, абзацы надо разделять тегом
). Возможен вывод графических файлов (например, легенды карты), через тег ''''. Ссылаться можно в т.ч. на изображения в папке zmp.
* графические файлы, ссылка на которые размещена в ''info.txt'' (например, легенда карты);
* **EmptyTiles** — директория, содержащая образцы файлов, которые отдаёт сервер вместо пустых (полностью прозрачных) или отсутствующих тайлов, а также в случае бана. Такие тайлы не будут сохраняться в SAS.Planet. В некоторых случаях сервер отдаёт нормальные тайлы в одном формате (например //image/jpeg//), а «пустышки» в другом (например полностью прозрачный //image/png//). Поскольку SAS.Planet конвертирует все принятые тайлы в формат, указанный в параметре ''Ext'' (см. ниже), то в качестве образцов необходимо использовать исходные файлы, отправленные сервером, а не брать их из кэша программы.
===== params.txt =====
> Некоторые из параметров карты могут быть изменены внутри программы без редактирования файла ''params.txt''. Для этого нужно зайти в //Параметры->Параметры карты// или нажать //Ctrl+Alt+P//. Пользовательские изменения настроек карт сохраняются в файле ''Maps/maps.ini''.
Раздел **[PARAMS]**
* **asLayer** — если равно 1, карта используется как слой, накладываемый поверх основной карты.
* **pnum** — порядковый номер карты в меню. Не обязателен.
* **[[GUID]]** — случайный номер, можно [[http://www.guidgen.com/|сгенерировать онлайн]]
* **ParentSubMenu** — название пункта родительского меню для данной карты на русском языке.
* **ParentSubMenu_en** — название пункта родительского меню для данной карты на английском языке.
* **ParentSubMenu_uk** — название пункта родительского меню для данной карты на украинском языке.
* существует возможность указать иерархическое меню разделив пункты символом "\" (например ''ParentSubMenu=Google\Планеты'')
* **name** — имя карты на русском языке.
* **name_en** — имя карты на английском языке.
* **name_uk** — имя карты на украинском языке.
* **CacheType** — можно переопределить тип кэша [[https://github.com/sasgis/sas.planet.src/blob/master/Src/TileStorage/c_CacheTypeCodes.pas|из списка в исходном коде]], в который будут записываться тайлы данной карты. NB! Некоторые форматы кеша подходят только для [[Функции программы#Экспорт карт и спутниковых снимков|экспорта тайлов]].
^ CacheType ^ Название ^ Путь ^ Комментарий ^
| 0 | По умолчанию | | Ранее использовался 2, теперь 71 |
| 1 | GoogleMV | ''cache_old/ /{z+1}/{q}.{ext}'' | [[https://learn.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system|Quadkey]] |
| 2 | SAS.Planet | ''cache/'' |
| 3 | EarthSlicer 1.95 | ''cache_es/'' |
| 4 | GlobalMapper Tiles (GMT) | ''cache_gmt/ /z{z}/{x}/{y}.{ext}'' |
| 41 | GlobalMapper Aux | ''cache_gmt/'' | Не используется? |
| 42 | GlobalMapper Bing | ''cache_gmt/ /{z}/{y}/{x}.{ext}'' | [[http://www.sasgis.org/mantis/view.php?id=780|Тикет 780]] |
| 43 | **[[https://mobac.sourceforge.io/|Mobile Atlas Creator]] (MOBAC)** | ''cache_ma/ /{z}/{x}/{y}.{ext}'' | [[http://www.sasgis.org/mantis/view.php?id=1936|Тикет 1936]]. Тип кеша известен как [[https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames|Slippy map]]. Нумерация тайлов используется в [[OpenStreetMap]] и Google. Кеш подключается к QGIS, [[https://mapproxy.org/docs/nightly/caches.html#cache-file|MapProxy]]. Для использования с [[https://josm.openstreetmap.de/|JOSM]] достаточно:
tms:file:///home/user/SAS.Planet/cache_ma/vesat/{z}/{x}/{y}.jpg # Linux
tms[18]:file:///c:/SAS.Planet/cache_ma/vesat/{z}/{x}/{y}.jpg # Windows
|
| 44 | OsmAnd+ Tiles | Экспорт ''{z}/{x}/{y}.{ext}.tile'' | [[http://www.sasgis.org/mantis/view.php?id=884|Тикет 884]]. Не то же самое что "OsmAnd (SQLite3)" ''*.sqlitedb'' ([[http://www.sasgis.org/mantis/view.php?id=3577|тикет 3577]]) |
| 45 | [[https://wiki.openstreetmap.org/wiki/TMS|Tile Map Service]] (TMS) | ''cache_tms/ /{z}/{x}/{-y}.{ext}'' | [[http://www.sasgis.org/mantis/view.php?id=2848|Тикет 2848]]. ([[https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification|спецификация osgeo.org)]]. |
| 5 | Google Earth | ''cache_ge/'' |
| 51 | GoogleEarth Terrain |
| 6 | [[https://ru.wikipedia.org/wiki/Berkeley_DB|BerkeleyDB]] | ''cache_db/'' | |
| 61 | BerkeleyDB (Versioned) |
| 7 | DBMS (СУБД) |
| 71 | SQLite3 | ''cache_sqlite/ /z{z+1}/0/0/0.0.sqlitedb'' | [[http://www.sasgis.org/mantis/view.php?id=1376#c10961|Тикет 1376]]. Создаётся несколько баз SQLite. |
| 72 | [[https://wiki.openstreetmap.org/wiki/MBTiles|MBTiles]] | Экспорт ''*.mbtiles'' | [[http://www.sasgis.org/mantis/view.php?id=1376|Тикет 1376]], ([[https://github.com/mapbox/mbtiles-spec|спецификация MapBox]]). Используется одна база SQLite, но формат так ограничен, что пригоден только для экспорта. |
| 8 | GeoCacher |
| 9 | RAM (на диск не записываются) | | [[http://www.sasgis.org/mantis/view.php?id=1755|Тикет 1755]] |
* **DefURLBase** — неизменная часть адреса ссылки на тайлы карты. Или шаблон URL адреса в случае [[простой_пример_с_плейсхолдерами|упрощенного добавления карт]].
* **[[epsg_код_проекции|projection]]** — проекция карты. 1 — меркатор на сфероид, 2 — меркатор на эллипсоид, 3 — широта/долгота.
* **[[epsg_код_проекции|sradiusa]]** — радиус большой полуоси эллипсоида.
* **[[epsg_код_проекции|sradiusb]]** — радиус меньшей полуоси эллипсоида.
* **[[epsg_код_проекции|EPSG]]** — код проекции карты.
* **NameInCache** — имя папки в кэше, в которую будут записываться тайлы карты.
* **separator** — разделитель в виде горизонтальной черты, отображаемый в меню после данной карты (1 — отображать, 0 — не отображать).
* **Ext** — расширение тайла (.jpg, .png, .bmp, .gif). Задаёт формат, в котором принудительно будут сохраняться карты, если ContentType другой.
* **UseDwn** — если равно 1, то скачивать тайлы карты разрешено.
* **Sleep** — величина паузы между загрузками отдельных тайлов в миллисекундах.
* **DefHotKey** — сочетание горячих клавиш для данной карты.
* **ContentType** — список форматов изображений (например, ''ContentType=image/jpeg,image/png''), которые SAS.Planet ожидает получить от сервера. При несовпадении формата (например сервер вернул текст, а не картинку) отображается ошибка.
* **DefaultContentType** — тип, который будет использоваться, если сервер не вернул никакого типа или если стоит игнорирование типа, возвращаемого сервером.
* **IgnoreContentType** — игнорирование типа, возвращаемого сервером.
* **DetectContentType** - если равно 1, то после загрузки тайла будет выполнятся анализ его содержимого и коррекция поля //Content-Type// в заголовках ответа сервера
* **MimeTypeSubst** — подстановка типа загружаемых данных (например, «image/png8bit=image/png»).
* **TILERLEFT, TILERRIGHT, TILERTOP, TILERBOTTOM** — параметры для обрезки скачиваемых тайлов соответственно слева, справа, сверху и снизу. Если получившийся прямоугольник не совпадает с квадратом 256×256, он ещё и растягивается или сжимается до этого размера.
* **UsePreloadPage** — если равно 1, использовать предварительно загружаемую страницу (обязательно следует указать её адрес).
* **PreloadPage** — адрес предварительно загружаемой страницы.
* **RequestHead** — пользовательские HTTP-заголовки (headers), передаваемые на сервер. Поля должны отделяться символами ''\r\n'' (пример: ''RequestHead=Referer: maps.kosmosnimki.ru\r\nConnection: Keep-Alive'').
* **Version** — версия тайлов, соответствует переменной Version в ''GetUrlScript.txt''.
* **MaxConnectToServerCount** — максимальное число потоков. Значение по умолчанию устанавливается в секции **[ZmpDefaultParams]** файла ''SASPlanet.ini''
* **IsUseDownloaderInScript=1** - использование скачивания внутри скрипта [[http://sasgis.org/mantis/view.php?id=596|добавить отсюда]]
* **UseMemCache** - использовать кэш в памяти (при CacheType=9 (RAM-кэш) отключение данной опции приведёт к ошибке), включено по-умолчанию
* **MemCacheCapacity** - количество тайлов кэшируемых в память. По-умолчанию = 100
* **MemCacheTTL** - время жизни тайлов (в миллисекундах), кэшируемых в память. По-умолчанию = 60000 мс. (1 мин)
* **MemCacheClearStrategy** - стратегия очистки (по TTL) кэшируемых в память тайлов. Принимает значения:
* 0 - удалять ВСЕ тайлы из RAM-кэша, если истёк TTL у самого СТАРОГО тайла;
* 1 - удалять ВСЕ тайлы из RAM-кэша, если истёк TTL у самого МОЛОДОГО тайла (включён по-умолчанию);
* 2 - удалять только те тайлы, у которых истёк TTL;
* 3 - НЕ удалять тайлы по TTL.
* **RestartDownloadOnMemCacheTTL** - автоматически перезакачивать тайлы в пределах видимой области экрана при очистке RAM-кэша (работает только если UseMemCache=1). По-умолчанию отключено.
* **License=©** - текст лицензии, который будет выводиться в левом верхнем углу карты. Требуется для соблюдения условий распространения некоторых карт.
* **LayerZOrder** - порядок отображения слоёв, по умолчанию 0. Слои с большим значением будут отображаться поверх слоев с меньшим значением
* **IsReadOnly=1** - использовать кэш в режиме "Только чтение"
* **IteratorSubRectSize** - размеры по вертикали и горизонтали, измеряемые в стандартных тайлах (256х256 пикселей) при скачивании так называемых "мегатайлов", то есть тайлов с размерами более чем 256х256 пикселей. (Только в SACS)
* **IteratorSubRectAlign** - если 0 - всё по умолчанию, если не 0 (1 или 2), то осуществляется точная привязка к размеру мегатайла. Если же не 1, а 2 - то будет дополнительно увеличен размер просматриваемой области, чтобы возможно было скачать даже, например, один левый верхний тайл в режиме кэш+интернет при сдвиге окна влево и вверх. Толкование малопонятное, интересующимся смотреть [[http://www.sasgis.org/mantis/view.php?id=1659|здесь]]. Только в SACS.
Раздел **[ViewInfo]**
* **[[epsg_код_проекции|EPSG]]** — код проекции карты при выводе на экран.
В ночных версиях появилась возможность использовать более продвинутый хоть и медленный парсер kml, c поддержкой чтения оформления меток, линий и полигонов или принудительно задать свои настройки для конкретного zmp. Для того чтобы включить и настроить эти функции используются следующие разделы:
Раздел **[PARAMS_Vector]**
* **UseAppearance** — если равно 1, то включается использование оформления из zmp и загруженных векторных тайлов
Раздел **[PARAMS_Vector_Point]**
Настройки оформления точек.
* **IconName** — имя иконки по-умолчанию
* **IsForceIconName** — если равно 1 (это значение по-умолчанию), то будет принудительно использовать заданную в параметре **IconName**, даже если парсер смог считать имя иконки из праметров точки
* **IconSize** — размер иконки по-умолчанию
* **IsForceIconSize** — если равно 1 (это значение по-умолчанию), то будет принудительно использовать размер иконки заданный в **IconSize**, даже если парсер смог считать размер из праметров точки
Раздел **[PARAMS_Vector_Line]**
Настройки оформления линий
* **LineColor** — цвет линии по-умолчанию
* **IsForceLineColor** — если равно 1 (это значение по-умолчанию), то будет принудительно использовать цвет из **LineColor**, даже если парсер смог считать настройки из параметров линии
* **LineWidth** — толщина линии по-умолчанию
* **IsForceLineWidth** — если равно 1 (это значение по-умолчанию), то будет принудительно использовать толщину линии заданную в **LineWidth**, даже если парсер смог считать настройки из параметров линии
Раздел **[PARAMS_Vector_Poly]**
Настройки оформления полигонов
* **LineColor** — цвет границы полигона по-умолчанию
* **IsForceLineColor** — если равно 1 (это значение по-умолчанию), то будет принудительно использовать цвет из **LineColor**, даже если парсер смог считать настройки из параметров полигона
* **LineWidth** — толщина границы полигона по-умолчанию
* **IsForceLineWidth** — если равно 1 (это значение по-умолчанию), то будет принудительно использовать толщину линии заданную в **LineWidth**, даже если парсер смог считать настройки из параметров полигона
* **FillColor** — цвет заливки полигона по-умолчанию
* **IsForceFillColor** — если равно 1 (это значение по-умолчанию), то будет принудительно использовать цвет из **FillColor**, даже если парсер смог считать настройки из параметров полигона