В этой статье мы расскажем про основные понятия и приемы, использующиеся в YourMaps:

  • Что такое пайплайн
  • Из чего состоит граф пайплайна
  • Как выглядят графы для некоторых типовых задач
  • Как избежать дублирования фрагментов графов с помощью шаблонов

Пайплайны

Основной рабочей сущностью в YourMaps является пайплайн.

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

Каждый объект, взятый из карты, имеет свою геометрию (как правило это либо точка, либо линия или полигон) и набор тегов (строковых пар "ключ=значение").  Фильтры и преобразования могут использовать эти данные чтобы отбрасывать часть объектов или как-либо их изменять.

Те объекты, которые добрались до выхода и являются результатами работы пайплайна. Они сохраняются и доступны для просмотра и скачивания в одном из поддерживаемых форматов.

Вот простой пример (мы его подробнее рассмотрим ниже):

Простой граф для фильтрации по одному тегу

В нем поток объектов идет от входа (кусок карты слева), проходит через фильтр, оставляющий только объекты нужного типа, и идет к выходу, где и сохраняется в файл.

С помощью YourMaps можно создавать намного более сложные процессы экспорта, включающие несколько источников данных, различные виды фильтров и пребразований, но суть их всегда будет такой же - поток объектов, идущих через промежуточные узлы от входа к выходу.

Графы и узлы

Последовательность преобразований и фильтров объектов задается с помощью графа, который вы можете нарисовать в нашем визуальном редакторе. Граф состоит из узлов и связей между ними. В узлах создаются или изменяются объекты, которые затем передаются по связям в другие узлы.

У узлов могут быть входы (в редакторе на узле они рисуются слева) и выходы (справа).

Этот узел имеет два входа (слева) и один выход (справа).

Узлы могут быть следующих видов:

  • Входы - такие узлы создают начальный поток картографических объектов на своем выходе. Например, все объекты из заданной области OpenStreetMap, или все объекты из GeoJSON файла. Эти узлы берут данные откуда-то еще, поэтому у них обычно нет своих входов, только выходы.
  • Фильтры и преобразования. Такие узлы имеют один или несколько входов, по которым в них поступают объекты. Затем над объектами производится некоторая операция, и результирующие объекты подаются на выход узла.
  • Выход - такой узел в графе должен быть один. Все объекты, которые добрались до него, становятся результатом работы пайплайна.

К выходу узла может быть подключено сколько угодно связей - в таком случае, по каждой связи-выходу будет передан один и тот же набор объектов - результат работы узла. При этом ко входу может быть одновременно подсоединена только одна связь.

Кроме связей, передающих объекты, есть связи, передающие значения. Например, узел может принимать на вход список объектов, вычислять среднее значение одного из тегов и выдавать его дальше. А другой узел будет принимать это значение и по нему фильтровать какой-то другой поток объектов.

Разные виды входов и выходов на графе отображаются разными цветами, соединять связями можно только входы-выходы одного вида.

Подробнее про поддерживаемые виды узлов можно прочитать тут.

Простой пример

Пример, который мы уже видели выше - фильтр для выборки объектов какого-либо типа по значению тега:

Простой граф для фильтрации по одному тегу

Сперва узел "OSM Input", являющийся входом графа, создаст начальный поток объектов. В данном случае он соберет все объекты из OpenStreetMap для указанной области (центр Санкт-Петербурга). Они будут переданы на выход этого узла.

Выход узла OSMInput соединен со входом узла Filter by Tag Value. Этот узел пропускает на выход только те объекты, у которых есть указанный тег с указанным значением. В данном случае он пропустит дальше только парки, то есть объекты, имеющие тег leisure со значением park (возможные значения тегов для OSM можно найти в OpenStreetMap Wiki).

Выход узла-фильтра соединен со входом узла Result. Все объекты, дошедшие досюда (то есть в данном случае - все парки в заданной области в центре Санкт-Петербурга), будут сохранены как результат работы пайплайна.

Параллельная обработка

Потоки данных можно разделять - отправлять выходы одного узла на несколько других узлов. Обрабатывать их по-разному, а затем объединять обратно.

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

Для этой цели мы разделим наш поток данных на две ветви, каждая из которых будет обрабатывать свой вид сущностей. Верхняя ветвь состоит из уже виденного нами фильтра для парков.

Нижняя сперва отфильтрует все объекты, являющиеся границами МО (boundary=administrative, admin_level=8), а затем выберет нужное нам МО по имени.

Граф для поиска всех парков в границах заданного муниципального округа

Мы соединим оба этих набора узлов с выходом узла OSM Input. Каждая из этих связей получит свою копию потока объектов и сможет работать с ней независимо.

После того, как мы выделили нужные нам сущности, нам нужно осуществить последнюю операцию - определить, какие парки лежат внутри границы нашего МО. Для этого подходит узел Area Intersection Filter. У него два входа - для объектов и для областей. Он пропускает только те объекты, которые лежат внутри хотя бы одной области.

Подадим наш список парков на вход объектов, а границу нашего МО - на вход для областей, и получим нужный нам результат.

Шаблоны

В предыдущем примере мы создали набор узлов для выделения муниципальных округов. Для этого нам надо отфильтровывать объекты по двум тегам сразу - boundary и admin_level.

Если нам часто приходится работать с подобными задачами, постоянно добавлять в граф одну и ту же последовательность узлов может быть утомительно.

В реальности часто приходится составлять и более сложные фильтры. Например, реалистичный фильтр для зеленых зон, включающий не только парки, но и газоны, городские леса и т.п., выглядит вот так:

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

Шаблон - это фрагмент графа, который можно подставлять потом в другие графы в виде узла. В данный момент шаблоны создаются администраторами платформы, в дальнейшем мы добавим создание пользовательских шаблонов.

Использование указанного выше шаблона выглядит вот так. Тут мы просто заменили прежний узел-фильтр парков на узел нашего шаблона

Таким образом с помощью шаблонов мы можем добавлять в свои графы сложный фильтр зеленых зон в один клик.