29 мая 2014-го

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Инструментарий картопечатника

Как только я начал готовить печатный вариант карты маршрута на основе своего стиля, я обнаружил, что инструментов-то и нет. Вернее, есть, но не те. Например, подвинуть надпись в векторном изображении, выданном мапником, нетривиально: нужно выделить все буквы надписи, затем все элементы её полупрозрачного фона. Это нелёгкий процесс, с тщательным прицеливанием и нецензурными репликами, когда выделение теряется. Не двигать нельзя: алгоритм расстановки надписей в мапнике ужасен. Движок Cairo, используемый мапником, не позволяет объединять элементы слоёв в группы. Поэтому месяц назад я опубликовал скрипт mapnik-group-text, который объединяет буквы во фразы. Из параметров важен только -d, который определяет максимальное расстояние между буквами.

Затем мне понадобилось сделать выгрузки огромных территорий для OziExplorer (велосипедисты, почему-то, любят этот дорогой артефакт истории). Из существующих скриптов — только nik2img, который щеголяет несколькими десятками опций (но треть из них к делу не относится). Попробовал для проверки получить картинку как на osm.org, задав центр, масштаб и размер картинки в пикселях. Скрипт разочаровал: масштаб съехал на полделения. Как получить картинку в 300 dpi, вообще непонятно: при указании scale_factor лишь все линии зачем-то становятся толще. Что делать — пришлось писать самому.

Nik4 отрендерит вам мапником картинку именно так, как нужно. Без сюрпризов. Хотите эквивалент скриншота osm.org в нужной точке? Запускайте с параметрами -c LON LAT -x 800 600 -z 13. Распечатать прямоугольник в 300 dpi на листе A5? -a 5 --ppi 300 --bbox X1 Y1 X2 Y2 — и не нужно знать, что такое scale_factor, или какое там разрешение по умолчанию. Подготовить огромный фрагмент для Ozi? --tiles 4 склеит большую картинку из 16 маленьких (чтобы не вылететь по нехватке памяти), а --ozi output.map создаст файл привязки. Подробные примеры с картинками смотрите на гитхабе, а для установки достаточно набрать pip install nik4.

Первой задачей, с которой сталкиваются установившие мапник, остаётся генерация тайлов. Для этого я много лет назад написал скрипт polytiles.py, который не только делает эти тайлы в несколько потоков, но умеет собирать их в mbtiles и фильтровать как по файлу poly, так и по произвольному полигону в базе PostGIS (например, по городу). Недавно открылось ещё одно применение скрипта: им элементарно делать списки для renderd, чтобы обновлять тайлы в заданном регионе.

Мнения, высказанные на этом сайте, отражают точку зрения лично автора сайта и ничью больше: ни его бывших или настоящих работодателей, ни семьи и знакомых.