111 заметок с тегом

проекты

Ctrl + ↑ Позднее

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

Как только я начал готовить печатный вариант карты маршрута на основе своего стиля, я обнаружил, что инструментов-то и нет. Вернее, есть, но не те. Например, подвинуть надпись в векторном изображении, выданном мапником, нетривиально: нужно выделить все буквы надписи, затем все элементы её полупрозрачного фона. Это нелёгкий процесс, с тщательным прицеливанием и нецензурными репликами, когда выделение теряется. Не двигать нельзя: алгоритм расстановки надписей в мапнике ужасен. Движок 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, чтобы обновлять тайлы в заданном регионе.

2014   проекты

Картируй это

Александр Зыков задумался о картировании OSM из твитера, но в отличие от osmitter, не стал радикально загружать данные в базу по нечёткому сигналу GPS. Он предлагает адресовать геопозиционированные твиты пользователю @osmthis, и робот добавит их как заметки. JBacc1 возмутился, что добавляют фигню, но не за этим ли заметки были сделаны?

Дата смерти OpenStreetBugs — 2 мая: именно тогда Werner2101 закрыл последний баг. Разумеется, в Москве. Он пишет, что в России багов было без счёта, но как пришло время их закрывать, помощи от русскоязычных участников было немного. Спасибо всем, кто поучаствовал.

2014   проекты

BigMap 2

Долгое время основным инструментом для скачивания тайлов и объединения их в большую картинку был BigMap: скрипт на Perl, который выдавал другой скрипт на Perl, который скачивал и склеивал тайлы. Ну или SAS.Планета, главное оружие нарушителя авторских прав. Теперь у нас есть альтернатива.

BigMap 2 — новая версия сервиса, которая также умеет выдавать скрипт на Python. Что, впрочем, меркнет перед функциями создания картинок прямо на сервере (до 100 тайлов) и генерации метаданных для OziExplorer и других программ. Лимита достаточно, чтобы создавать снимки карты до и после картовстреч на 15 масштабе.

Этого сервиса не было бы без Orbis Terrarum, программы Павла «elagin» на C# для склеивания тайлов и привязки их для Ozi. Он немного превосходит эту программу тем же, чем JTileDownloader: позволяет выбрать подложку и бережно обращается с ресурсами серверов.

2014   проекты

Открытая карта звуков

Год назад вы узнали про карту звуков Сергиевого Посада (автор которой давно сдулся), а сегодня твитер принёс ссылку на aporee maps: сайт для совместного сбора звукозаписей, где всё как полагается: CC-BY-SA на звуки и подложка OSM в комплекте (но для эффекта лучше снимки). Жмите play, random sequence, и слушайте пустой воркутинский склад, опен-эйр под Берлином, пешеходную улицу в Вильнюсе, площадь Люблянского университета, китайский вокзал, часовой магазин в Нью-Йорке, остальные 20 тысяч записей. Качество непредсказуемо: кто-то бессовестно загружает записи с мобильников, а кто-то ходит с тысячедолларовыми диктофонами.

2013   проекты

Карты для всех, даром

На форуме «Проекты Петербурга» обсуждают, в основном, дорожное строительство. Где ремонтируют, где перекрыли, где прокладывают (или уже отменили) новое шоссе. С локализацией темы обсуждения всегда проблемы: «53-81 км — это где?» Пять лет назад нормальным было дать ссылку на карты яндекса или вставить картинку, но XXI век на дворе, лифлету недавно три года исполнилось, почему нельзя просто вставить карту? Почему на местном велосипедном форуме дают ссылки на монструозный gpsies, а марафонщики до сих пор скриншотят пираченный OziExplorer?

Будучи программистом, я постоянно чувствовал, что вся эта дремучесть технологий — моя вина, но только месяц назад взялся за решение задачи. Несмотря на комментарий к коммиту от 1 октября «almost final», и через три дня — «вероятно, последний коммит», разработка идёт до сих пор, но помня об изречении, что дела нельзя закончить, можно лишь прекратить, сегодня я объявляю о выходе версии 1.0 библиотеки MapBBCode: элементарного способа встроить рисование и отображение карт во что угодно.

Основой встраивания стал bb-код [map]...[/map], внутри которого описываются объекты карты. Это простая строка текста, которую можно скопировать куда угодно или редактировать вручную. Функционально это упрощённый GeoJSON. Небольшая javascript-библиотека превращает его в карту на Leaflet и позволяет править не подбором цифр, а рисуя на карте. Посмотреть на неё в деле можно на сайте проекта. Там же есть ссылки на модули для форумов phpBB: в понедельник «Проекты Петербурга» первыми встроили карты, на очереди — велофорумы. Когда-нибудь, надеюсь, библиотеку встроят в vBulletin, SMF, WordPress и MediaWiki.

Как пример использования библиотеки, родился сайт MapBBCode Share. Идея проста: если хранить строки в базе, получится неплохой сайт для обмена картами, простой и доступный, как pastebin или imgur. А из окошка просмотра кода можно скопировать текст на форум, его поддерживающий (или наоборот). Образ сайта в голове начал потрескивать, когда ГИС-Лаб воспользовался сервисом для планирования картовстречи, выложив ссылку на редактирование в открытый доступ. А затем я добавил импорт и экспорт в десяток форматов, библиотеку кодов (чтобы не нужно было хранить закладки локально) и API. Оказалось, что обмен картами — лишь малая часть открывшихся возможностей.

Теперь можно планировать маршрут поездки вместе с друзьями, расставить маркеры, затем поместить карту на форум, и за день до выезда участники прямо из форума загружают GPX с вейпоинтами. Можно импортировать CSV (алгоритм определения его формата эпичен) и сразу получить HTML без внешних зависимостей. Никаких iframe — в отличие от всех остальных сайтов, MapBBCode Share выдаёт полноценную страницу без ссылок на себя. Загрузка треков, сгенерированных роутером OSRM, быстрое редактирование poly-файлов и неминуемый экспорт в GeoJSON — сайт конкурирует не только с geojson.io и uMap, но даже с JOSM. Безопасность на высоте: логин через OpenID (гуглояндексы подходят), немедленно хэшируется, поэтому даже администратор не знает, кто пользуется сайтом, при этом хэш никогда не покидает сервера, API для фильтрации карт по пользователю нет.

Итог работы — более 200 килобайт кода, за 60 килобайт документации, 7 новых плагинов для Leaflet, всё под максимально свободной лицензией WTFPL. Разработка продолжается, но теперь изменения протоколируются, и автор ответственен за обратную совместимость. Пользуйтесь MapBBCode Share и встраивайте модуль в новые форумы и блоги. Сделаем [map] стандартом, а обмен картами — не более сложным, чем обмен картинками или кодом.

2013   javascript   проекты
Ctrl + ↓ Ранее