суббота, 28 декабря 2013 г.

Как добавить карту вручную

Попытаемся добавить карту вручную.

Перво наперво надо найти какую карту будем работать. Это сделать довольно просто. Сервисов которые предоставляют картографические данные полным полно. Начиная от спутниковых снимков заканчивая историческими картами или аэрофотосъемкой времен второй мировой. Можно взять и скачать бесплатную программу SASPlanet в которой уже собрано огромное количество карт и сплагиатить их оттуда. Можно самому нарезать на тайлы растровую карту и добавить ее. В не зависимости какой источник какрт и где вы его найдете алгоритм будет один и тот же.

Для начала для тех кто совсем не в теме коротенькая справка.

Все карты которые есть в интернете, грубо говоря, предоставляются в виде тайлов. Что за зверь такой? Это берется огромная простыня карт, в огромном разрешении и занимающая много места. И если вы попытаетесь разом загрузить такую, то ваш интернет провайдер не порадуется, да и места на дисках не хватит, это точно. Как же быть? Хитрые товарищи подумали-подумали и сделали очень просто - разрезали это полотно на маленькие кусочки и назвали их тайлами, ну или плитками по-нашенски. И теперь когда вы смотрите на какие-нибудь Яндекс карты, то вам не нужно грузить огромный объем данных, а хитрая программа просмотра, в зависимости от того места которое вы разглядываете, просто подгружает нужные тайлы на лету. И все довольны. Обычно тайлы это картинки размером 256 на 256 пикселей, ну это типа стандарта, хотя бывают и других размеров. Вся эта процедура делается для разных масштабов карт, чтобы мы могли крутить колесико мыши.

Где же эти тайлы нам взять? Тут все несколько запутаннее. Каждый сервис предоставляет тайлы по своему. Кто-то вообще запрещает использовать свои тайлы по прямым ссылкам. Но в основном открытые данные предоставляются в виде {адрес кокой-то}/{z}/{y}/{x}.png, где z - уровень масштаба, чем меньше тем обзорнее, x и y  координаты тайла, но не обычные а в проекции меркатора (грубовато выразился, но кому интересно копайте дальше). Эта проекция ужасна чуть более чем полностью, но отлично подходит для подобных вещей.

Что ж приступим.

Выбираем жертву. Находим формат тайлов в котором эта жертва отдает. Я выбрал такую вот симпотишную карту в виде акварельного рисунка http://maps.stamen.com/watercolor/#12/54.3303/48.3875

Выбирайте в меню - Карты - Сохранить карту


Появляется окно


Это окно по сути дела редактирует настройки активной карты. А так как у нас карта пока что та что по умолчанию, то и данные там по умолчанию. Итак по пунктам:

  • ID - это идентификатор карты, лучше его писать английскими буквами и без пробелов, а то мало ли какие ошибки могут вылезти. Двух карт с этим одинаковым полем быть не может, если вы попытаетесь сохранить карту а такой id уже есть в базе, то всплывает вопрос о перезаписи, это же касается и редактирования какой-либо карты, там тоже спросит. В общем нужно тут писать коротко и по сути.
  • Заголовок - Это то что будет в меню и в правом углу снизу.
  • Тип сервера - тут либо img, либо wms. В нашем случае это img - т.к. мы получаем информацию в виде обычных тайлов, статических картинок. А wms сервера это отдельная песня, которую мы споем попозже.
  • Слои - это для wms. Можете написать туда все что угодно и это ни на что не повлияет в данный момент.
  • Группа - это для удобства навигации в меню все карты разбиты по группам. В этом поле есть автодополнение по всем группам которые у вас уже имеются. Если ничего не напишите ничего страшного, просто будет группа Undefined
  • Источник - не знаю зачем вообще этот пункт был сделан, но он есть и ни на что не влияет, типа просто выбор откуда берутся карты.
  • CRS - это очень важный пункт. У каждой карты есть не только проекция но и система координат. Это очень обширная тема если есть желание почитайте в википедии статью про систему координат. Но слава макаронному монстру в мире есть определенные стандарты и в основном все сервисы предоставляют карты в WGS-84/сферический меркатор и для таких сервисов нужно это поле оставить пустым либо выбрать EPSG3857. 95% что все будет хорощо. Но яндекс например почему-то считает что это не их путь и все карту у них в системе WGS-84/цилиндрический меркатор. Тогда надо выбрать EPSG3395. К тому же в будущем будет функция коррекции привязки на лету и если вы добавляете карту сделанную вами то поставьте EPSG3857.Ext это будет все таже EPSG3857, но программа будет добавлять дополнительный функционал именно к этой карте.
  • Ссылка - в нашем случае пишем туда http://{s}.tile.stamen.com/watercolor/{z}/{x}/{y}.jpg - x,y,z - это уже обсудили, а вместо {s} подставляются случайным образом буквы a,b,c,d когда программа запрашивает тайлы с сервера. Это сделано для того чтобы можно было паралельно загружать сразу несколько картинок и не создавать излишнюю нагрузку на сервера. В общем балансировка. При этом в этот адрес можно вобще написать произвольные переменные например {foo} и забацать для нее функцию которая будет для каждого тайла вычисляться, но я пока не придумал как сделать добавление этих функций пользователем, поэтому если вам нужно сделать что-то нестандартное то напишите мне что-нибудь придумаем.
  • maxZoom - ограничитель на максимальный уровень увеличения.
  • minZoom - ограничитель на минимальный уровень увеличения.
  • maxZoom - стартовый масштаб, если карту открывают первый раз.


Получилось как-то так. Теперь жмите отправить. И можно карту выбирать из меню.


И вот что получилось в итоге.


Теперь эта карта будет всегда с вами. А еще ей можно поделиться, чтобы кто-то другой не мучался с этим делом.

Например чтобы не набирать данный пример в ручную просто выберите в меню пункт JSON - загрузить внешние карты. И когда появится окошко введите туда вот эту строку https://api.github.com/repos/starikan/kartofan-public-feed/contents/aquamap.json?callback и нажмите OK. Все теперь карту можно выбрать и пользоваться.

Комментариев нет:

Отправить комментарий