94 заметки с тегом

mapping party

Позднее Ctrl + ↑

Обходные листы в QGIS

Шесть лет назад я написал инструкцию, как печатать обходные листы с использованием современного (на тот год) открытого софта и активно разрабатываемого (на тот год) рендерера Maperitive. Вечером перед тульской картовстречей я посмотрел на каталог этого рендерера и понял, что хватит это терпеть. Но что открыть взамен? В mapnik непросто повернуть карту (а это критично), с эзотерическими рендерерами, типа alaCarte и smrender, долго разбираться. Я уже много лет советую всем QGIS для печати карт — так возьму его сам.

Это одновременно статья про то, как непросто и одновременно несложно было разобраться в инструментах и получить файл pdf с обходными листами, и инструкция. Печатайте больше обходных листов и выводите картографов на улицы. Вам не обязательно загружать собранные объекты именно в OpenStreetMap, но мы были бы рады. А вот данные для печати, кроме как из OSM, взять неоткуда. Начнём с их подготовки.

(Если вы делаете обходные листы, не дочитав заметку до конца, советую заглянуть в главу «волшебство»).

Подготовка данных

Прежде всего, вам понадобятся QGIS версии не ниже 2.14, GDAL не ниже 2.0 и JOSM.

  1. Откройте JOSM, включите «режим эксперта», если ещё не.
  2. В меню «Файл» выберите «Загрузить с Overpass API» и введите туда запрос: (node({{bbox}});<;>);out meta;
  3. Выберите район картовстречи и качайте. А затем сохраните в файл .osm и закрывайте редактор.
  4. Теперь нужен GDAL, чтобы сделать файл для QGIS. Для сохранения тегов типа addr:housenumber нужно настроить ogr2ogr. Если коротко, берите этот osmconf.ini и положите к данным. Возможно, вы захотите добавить тегов в поля attributes разделов [lines] и [multipolygons].
  5. Выполните из командной строки:
ogr2ogr --config OSM_CONFIG_FILE osmconf.ini -t_srs EPSG:3857 -f GPKG party.gpkg party.osm

Здесь мы используем все достижения последних трёх лет: простое скачивание данных из Overpass API, хорошую поддержку формата OSM библиотекой GDAL и формат GeoPackage. Последний опубликован только три года назад и удобен для хранения данных из OSM: в отличие от шейпов, файл получается всего один и при этом непустой.

Файл osmconf.ini в комплекте GDAL разочаровывает на каждом шагу: очень мало тегов, даже адресов нет. И нет полигональных водоёмов. То ли дело файл style, приложенный к osm2pgsql. Воспользовался бы последним, но тогда цепочка получилась бы слишком сложной: osm → osm2pgsql → postgresql → ogr2ogr → gpkg. Два шага в этой цепочке выглядят лишними.

Оформление карты в QGIS

Было бы здорово сказать: «просто используйте этот стиль на ваш файл», как обычно с мапником или маперитивом, но в мире высоких ГИС не всё так просто. Нужно открывать свойства каждого слоя, кликать на цвета, делать дубликаты, фильтровать. Любое ваше действие QGIS запишет в файл проекта, поэтому я не дам свой: кто знает, какую порнографию вы откопаете в tula.qgs. Так что — пошаговая инструкция.

  1. Откройте в QGIS файл GeoPackage и добавьте слои lines и multipolygons. В первом лежат дороги, ручьи и заборы, во втором — здания, парки и водоёмы.
  2. Справа внизу кликните на «EPSG:4326», включите перепроецирование на лету и выберите проекцию EPSG:3857, привычную по растровым картам.
  3. Отфильтруем дороги. Кликните правой кнопкой на слое линий, там — «Фильтр». Выделим улицы: highway in (’trunk’, ’primary’, ’secondary’, ’tertiary’, ’residential’, ’unclassified’, ’pedestrian’)
  4. Теперь оформим: двойной клик на слое, во вкладке стиля цвет #777777 и толщину 0,3 мм.
  5. Во вкладке «Подписи» окна свойств сверху выберите «показывать подписи» и ниже поле «name». Цвет #666666 и размер шрифта 10.
  6. А что с пешеходными дорожками? Правую кнопку на слое, «Дублировать». Правите теги в фильтре на (’footway’, ’path’) и в свойствах: «простая линия», стиль линии ставите в «штриховая».
  7. Аналогично для всех остальных слоёв: линии highway=service, railway=rail, waterway NOT NULL и полигоны воды, парков и зданий building NOT NULL.
  8. Для зданий нужно указать подписи не только с номером дома, но и с этажностью. Справа от выбора поля подписи жмите на кнопку «ε» и введите формулу: addr_housenumber || ’/’ || building_levels

На этапе фильтрации данных в слое я понял, что импорт файлов OSM напрямую — это шляпа: на любой чих QGIS мне мерзко отвечал: «какая-то проблема в вашем SQL». Поэтому нужен GeoPackage. Можно справиться и с более старым Spatialite, но зачем.

После танцев с бубном в Maperitive (да, я помню их спустя шесть лет!) оформление карты в QGIS — праздник предсказуемости и удовольствие конфигурируемости. Не программирование, а интерактивный выбор из списков. Никаких подписей поверх линий, работает их вытеснение, а линии не меняют толщину и цвет в непонятной зависимости от масштаба. Да и вообще не нужно думать о масштабе. Первые десять минут не верил, что всё так просто, но да: быстро переписал все размеры и цвета из стиля для Maperitive и увидел красивую карту.

Пирог

  1. Добавьте новый векторный слой типа Polygon. В нём нужны поля name (строка) и rotation (целое число).
  2. В его свойствах отключите заливку, добавьте жирный контур и подпись из name.
  3. Включите редактирование и обводите листы для печати, один за другим. Левый клик — добавить точку, правый — завершить. Рисовать лучше прямо по улицам. Поле fid, если есть, заполнять не нужно. Называйте полигоны в формате «14-запад»: номер куска в пироге и указание на его часть.

Опять же, видя прямоугольники листов на карте, ощутил наступление будущего: не нужно терпеть ме-е-едленный поворот всей карты в Inkscape, элементарно переставить или подвинуть куски. Единственное, чего не хватает, — автоматического вычисления поворота, чтобы каждый кусок печатать в максимально возможном масштабе. Поле rotation придётся заполнять самостоятельно.

Печать атласа

  1. «Проекты» → «Создать макет», там во вкладке «Атлас» включите его, выберите слой, скройте его и щёлкните на «создать многостраничный документ».
  2. Добавьте карту и во вкладке «Свойства элемента» отрегулируйте положение и размер. Включите «используется для атласа» с полем 0%, выше свяжите вращение карты с полем rotation.
  3. Добавьте в угол текстовую метку с содержимым [% «name» %] и настройте её вид.

Это всё — если не нужно поворачивать карту на отдельных листах. Но, конечно, поворачивать надо. Поэтому:

  1. Включите предпросмотр атласа.
  2. В окне QGIS откройте таблицу атрибутов слоя пирога и включите редактирование.
  3. Для каждого листа оцените поворот в градусах (положительные значения — по часовой стрелке) и впишите в нужную строку. После этого в окне макета нажмите «Обновить» и проверьте угол. Поправьте, если не попали.
  4. «Следующий объект» — и так далее до последней страницы. Муторно, но всё проще и быстрее, чем в Inkscape.

Теперь точно всё. Из меню «Атлас» сразу печатайте или сохраните в PDF. Если нужно проверить оформление, напечатайте одну страничку из меню «Макет».

Нет, не всё

Боже, двадцать два шага. Пирог «наполеон» готовить проще, чем пирог к очередной картовстрече. Даже с учётом современных технологий получилось длинно и сложно. Клики правой кнопкой мыши, клики левой. Нам нужно проще. Поэтому я начал смотреть, как оптимизировать отдельные этапы. Главное — подбор углов поворота. Глазами получается неточно, а в модуле processing есть интересная функция «oriented minimum bounding box», которая делает ровно то, что нужно: находит повёрнутый прямоугольник минимальной площади, в который вписывается каждый объект слоя.

Открыл питонскую консоль, набросал короткий скрипт — и действительно, поверх слоя домиков в своём районе увидел россыпь повёрнутых прямоугольников вокруг них. А в атрибутах — размеры и углы. Сохранил скрипт, довольный. Через пару минут дошло: плагины же тоже на питоне пишутся. Если делать не только для себя — нужен плагин. А если делать плагин, то нужно идти до конца, чтобы получилось...

Волшебство

Именно по этой причине эта заметка задержалась на три недели. Забудьте все шаги выше. Забудьте Overpass, забудьте ogr2ogr, забудьте свойства слоёв и составление атласов. Теперь подготовка пирога так же проста, как его обход:

  1. Установите модуль «Walking Papers».
  2. Найдите кнопку с синими прямоугольничками и после нажатия выберите «Скачать данные OSM».
  3. На новом слое нарисуйте (слева вверху карандашик и какая-то область) полигон вокруг области картовстречи. Затем снова жмите «Скачать».
  4. Ура, есть карта! В слое «Pie Overview» наметьте широкими линиями границы кусков пирога.
  5. В слое «Pie Sheets» обведите кварталы, которые войдут на каждый лист. Обычно это два-три листа на кусок пирога. Давайте им названия в виде «4-запад», с номером куска и ориентиром внутри него.
  6. Снова под той же синей кнопкой «Подготовить к печати». Всё, просмотрите листы и экспортируйте в PDF.
Картинка со старой версией модуля, где был лишний шаг

Невероятно! Шесть шагов, из которых только два требуют осмысленной работы, чесания головы, пристального взгляда на спутниковые снимки, ворошения прошлых пирогов, захлопывания крышки ноутбука с возгласом «да ну его, завтра нарисую!» Печать качественных обходных листов больше не удел гиков, которые «на ты» с таким осмерским софтом, который вы бы не захотели встретить в тёмной подворотне. Жду не дождусь августа, чтобы воспользоваться модулем по назначению.

Внутри QGIS

Осталась одна ма-аленькая проблемка. Если повернуть страницу атласа, то её масштаб станет мельче, чтобы вместить все данные с неповёрнутой страницы. А если карта управляется объектами с отдельного слоя, то на вычисление масштаба размеры этих объектов не влияют (посмотрите на отступ до дороги сверху на правом листе на фотографии в начале статьи). Вот незадача: хотели повернуть кварталы вдоль листа, чтобы приблизить их до упора и не мельчить при обходе, а получилось наоборот. Из-за этого поворот карты становится бесполезным. Что же делать?

Как известно, открытый софт развивается через боль. Если вас что-то не устраивает в QGIS, вы либо идёте жаловаться в телеграм, либо оплачиваете разработку в NextGIS, либо делаете git clone и открываете Qt Designer сами. Будучи ленивым, я пропустил первые два шага, нашёл в исходниках вычисление размеров объекта и всунул в нужное место geometry.rotate(). Пул-реквест отправился в ветку будущего релиза QGIS 3.0.

А дальше я начал узнавать, чем гостеприимный опенсорс отличается от пассивно-агрессивного, как принято в OSM. «Офигенное решение проблемы, спасибо!» — поприветствовал меня один из разработчиков QGIS. И сразу такое тёплое чувство внутри: меня ждали, мне рады, я не зря изучал исходники. «Только допиши тест на питоне, пожалуйста» — и окрылённый, я пошёл изучать систему тестирования QGIS и писать нужную функцию.

В процессе наткнулся на неудобство API прямоугольников и дописал функции их сдвига. Так я узнал про SIP bindings и зачем нужен скрипт prepare_commit.sh, который нужно запускать до git commit. На каждом этапе я мог кинуть клавиатуру в окно от очередного «сделай ещё тут кое-что», но благодаря вежливости и доброжелательности участников проекта я был рад делать ещё и ещё. Только метафорической линейкой по пальцам удержало меня от новых правок и улучшений в коде QGIS. Зачем оставаться в OSM и всё это терпеть, когда там так приятно и легко, и говорят спасибо после мёржа?

Встреча приятных людей в Эссене, фотография Аниты Грейзер

Но проблема осталась

Версия QGIS 2.18 останется в большинстве репозиториев до сентября 2018 года: моя правка в неё не попадёт. Пользоваться модулем хочется прямо сейчас, не дожидаясь новых версий QGIS. Поэтому нужно как-то обойти ошибку. С пул-реквестом за плечами решение оказалось несложным: модуль делает копию слоя пирога с модифицированной геометрией и новыми атрибутами. Новый слой невидимо управляет параметрами карты, чтобы у вас были идеальные обходные листы.

Как ещё можно улучшить? Ну, например, сделать рисование листов пирога сразу прямоугольниками пропорций листа А4. Тогда этап вычисления углов поворота станет ненужным. Слой тайлов OpenStreetMap пока приходится подключать вручную через QuickMapServices: возможно, лишние клики стоит оптимизировать, общаясь с этим модулем напрямую. Это поможет и для подготовки обзорных страниц в атлас. Наконец, оформление обходных листов зашито в модуль: чтобы его поменять, нужно править файл внутри каталога, но после обновления модуля правки потеряются.

Буду ли я улучшать модуль? Нет, он достаточно хорош и мне лень.

Писать модули прикольно. Что для JOSM, что для QGIS. По окончании радует ощущение, что операции, которые требовали времени и внимательности, переложены на машину и делаются одной кнопкой. Оформление модуля трудоёмко: нужно копаться в API, разбираться с репозиторием, рисовать значки и не забыть про переводы. Альтернатива — короткие куски кода для консоли python или плагина JOSM Scripting. Писать их не проще, а найти потом, когда через год-другой возникнет похожая задача, — почти невозможно. Так что лучше неделю потерять, но потом несколько часов сэкономить.

 3 комментария   2017   josm   mapping party   overpass   qgis

Тульская выездная картовстреча

10-11 июня мы едем в Тулу. Рисовать карту. Это всё, что вам нужно знать, чтобы отметиться на вики-странице встречи, забронировать гостиницу и закрасить выходные в календаре. Увидимся!

Прошлая картовстреча была два года назад в Костроме. Приехала дюжина осмеров, мы обошли весь центр, посмотрели на все достопримечательности, нагулялись и наговорились на полгода вперёд. Но прошло уже два года, и хочется ещё.

На этот раз мы едем недалеко от Москвы: до Тулы всего три часа езды (из Петербурга — чуть больше). Несмотря на близость к столице, город отрисован очень плохо: в нём долго не было хороших спутниковых снимков, и до сих пор почти нет картографов. Снимки появились — нарисуйте дома, пожалуйста. А недостаток картографов на пару дней мы исправим.

Если вы ни разу не были на выездной картовстрече, сочувствую: воспоминания о них формируют представления о сообществе. Не ругань на форуме и не зайцы в телеграме, а личное общение. Приезжайте на выходные. Узнаете город так, как не позволит даже «Бегущий город», и поймёте, что схемы тегирования — не главное. Если вы живёте в Туле, приходите тем более: расскажете, что почём.

Я буду рад любым предложениям мест встречи и идеям для культурной программы. Пишите их на форум или в телеграм.

 1 комментарий   2017   mapping party

Годовщина в Долгопрудном

13 августа, в субботу, мы традиционно отмечаем день рождения OpenStreetMap на природе. Проекту исполняется 12 лет, а мы — часть из нас, кто проснётся пораньше — займёмся тем же, чем в 2011 и последующих годах: картированием. Но в этом году совместим мероприятие со «схемотехникой»: у шашлыка вечером можно будет не только обсудить, как круто развивается OSM, но и произнести что-нибудь связное. Будет интернет, будут компьютер и видеозапись.

План такой: встречаемся в 11:02 в центре платформы Долгопрудная. Я раздаю обходные листы или учу пользоваться maps.me, и мы расходимся по окрестным населённым пунктам. Там много неотрисованного: улица Мичурина сразу у платформы, деревни Виноградово и Горки, военный городок. Велосипедисты могут прокатиться до Клязьмы и канала, собрать треки грунтовок.

В 16:00 собираемся в парке у Долгих прудов. Это 20 минут пешком от станции, достаточно далеко, чтобы не было толп людей. Там жарим шашлык, знакомимся, травим байки, рассказываем про интересные задачи и новости. Если будет шумно от Дмитровского шоссе, спрячемся в чаще. Обратные электрички ходят до полуночи, но думаю, все влезут в автомобили.

Если едете, записывайтесь в вики или отмечайтесь на форуме. Жду каждого, независимо от опыта в осме. Мы такие же интроверты, как и вы!

(Фотография © Moscow-Live.ru, CC-BY-NC-SA 2.0)

2016   mapping party

Грозный

Позавчера закончилась онлайн-картовстреча, на которой мы полторы недели рисовали город Грозный. Прошлое совместное рисование было почти два года назад, и стало скучновато, поэтому я прошерстил список городов в вики и нашёл единственный плохо отрисованный город в категории 200к+. Кроме того, Грозный — единственный федеральный центр, над картой которого почти никто не работал.

Рисовать пирог всегда тяжело: не технически, но поди оцени размер кусков. Слишком маленькие — и люди не захотят совместно одолевать дорогу в 400 ступеней. Слишком большие — все будут делать по половине или по трети, и отсутствие 100% деморализует. Впрочем, MapCraft принимает пирог только в одном формате, поэтому технически тоже пришлось проявить смекалку. Выделил все линии, разбил на перекрёстках (это utilsplugin2), собрал из всего мультиполигоны и затем последовательно превратил в обычные полигоны (с reltoolbox).

Зато когда пирог готов и залит, здорово каждый день наблюдать за его медленным озеленением. Вот появился зелёный островок, вот кто-то порисовал с краю города, а теперь проводим непрерывный зелёный пояс от одного конца города к другому. Словно компьютерная игра, вот только за каждой клеточкой — несколько часов работы картографа.

На сервере с мапником поднял обновление Грозного раз в 10 минут и запуск nik4 при каждом обновлении. Все скрипты складываю на гитхаб, документацию пишу помаленьку. Сначала думал сделать автоматические анимированные гифки из картинок, но было лень, поэтому раз в два дня давал ссылки на обычные png «до» и «после». Порадовал pfg21, наскоро сделавший из этих картинок анимацию. Теперь же можно показать окончательную анимированную гифку: на ней видна разница между утром 28 февраля, когда удалили огромный полигон landuse=residential, и утром 9 марта.

Скрипт также считал длины линий и количество домиков (хотел добавить подсчёт адресов, но достойного источника не нашли). На форуме восхищался внезапными тысячами деревьев, а в итоговой заметке можно и графики показать (время на них в UTC).

Удивило даже не количество заборов в Грозном, а тщательность их отрисовки осмерами. Обычно на заборы обращают внимание только в промзонах, а в частном секторе их обклацывать слишком муторно. Но тут будто конкурс какой прошёл: длины заборов исчислялись в сотнях километров. На карте, конечно, их найти элементарно: хоть чуть-чуть, но есть в каждом куске.

Файл pbf с картой Грозного до картовстречи занимал 17% от всей Чечни (380 килобайт), после — 46% (1668 килобайт). То есть, за неделю подрос в 4,4 раза. Нарисовали так много, что картинка с разницей похожа на шум. Подзабытый скрипт osmdiff, написанный gary68 семь лет назад, помог с числами. Всего в картировании участвовали примерно 35 человек. Добавили больше пяти тысяч точек восемь осмеров: Serzhanya, Семён Семёнов, Felis Pimeja, Danidin9, asdqweasd, Kazykan, aks46, Batareikin. Я — только 3700. В целом точек было 30 тысяч, стало 210; линий было 5 тысяч, стало 43.

Пока обклацывал кусочки, воплотил давнюю мысль: записать летсплей, как когда-то Kilkenni. А Felis Pimeja отличился круче: не только нарисовал поребрики в центре города (как водится, по особому смещению подложки), но и поманьячил в 3D:

Наконец, анимация правок. С помощью ffmpeg получил видео из набора подписанных картинок. А дальше — разбавить сорокасекундный ролик фрагментами с 14-го масштаба, кадрами других картостилей и, конечно, maps.me, и найти не слишком бесячую музыку в библиотеке ютуба. Картовстреча завершена, но теперь проще будет проводить следующие, так что ждём их. То есть, уже дождались: неделю назад Макс Васильев запустил обклацывание Симферополя.

 1 комментарий   2016   mapping party

Схемотехника

Прежде всего, в это воскресенье, 24 января, в Краснодаре «Спутник» проводит картовстречу. Есть пирог на 5 кусков. Встреча в 12 в центре города, где именно — сейчас решают.

Традиционная январская встреча в Москве не состоится. Вместо неё мы попробуем начать новую традицию. Встречи будут каждый месяц, всегда в помещении, и одновременно двух сообществ: OpenStreetMap и ГИС-Лаб. Отчасти это миниконференции, так как небольшие доклады в начале приветствуются. Отчасти — просто встреча, потому что большая часть времени отдана под свободное общение. Иногда формат будем менять: например, сделаем мастер-класс, code-sprint или конкурс на скоростное рисование домиков.

Первая «Схемотехника» (название, кажется, окончательное) пройдёт в офисе Mail.Ru Group, где была конференция «Открытые ГИС», 6 февраля, в субботу. Займёт весь день с 12 до примерно 18. Регистрация обязательна, кликайте в ссылку на сайте. Будут пицца, интернет и проектор.

 1 комментарий   2016   mapping party   просто party
Ранее Ctrl + ↓

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