геоинформатик

Про how-old-is-this.house я узнал от Степана Сомова, руководителя Пензенского отделения Горпроектов. Мне давно интересны визуализация данных, урбанизм и география родного города, поэтому решиться на создание карты было легко.


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

CIVITAS (urban archive)

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

ПОДХОД К ОБРАБОТКЕ ДАННЫХ

Когда я приступал к анализу Пензы, на сайте how-old-is-this.house уже было пять карт и ещё две подготавливались. Это примерно 3% от всех городов России с населением свыше 100 тысяч человек (или 1,5%, если сдвинуть планку до 50 тысяч).


Каждый участник проекта был сфокусирован на одном городе и использовал удобные для себя приёмы обработки данных. Это позволяло срезать лишние углы и быстро добиваться результата в каждом отдельном случае. Тем не менее часть приобретённого опыта терялась, а количество ручных шагов со временем не уменьшалось. Сделать карты десятков городов без изменений в подходе было бы сложно.


Мне стало интересно, как далеко сможет зайти автоматизация всего процесса. Времени на эксперименты было достаточно из-за пандемии, поэтому в качестве принципа я выбрал фразу «лучше день потерять, потом за пять минут долететь». Таким образом, моей задачей стало упростить получение карты возраста домов для любого города России. Пенза и два её пригорода (Заречный и Засечное) исполнили роль пилотной территории.


Создание карты возраста домов теперь выглядит так:

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

Названия источников в схеме отсутствуют, потому что их список открыт. Данные из любого доступного ресурса приводятся к единому формату, что делает их совместимыми и взаимозаменяемыми. В стартовый набор источников вошли Опен-стрит-мап (ОСМ), Росреестр, Минкультуры, «МинЖКХ», Викигид, Викиданные и Викимапия. Роль базового слоя с геометрией взял на себя ОСМ, а остальные источники стали поставщиками характеристик (то есть «заплатками»).

Важный этап процесса — геокодирование, то есть нахождение широты и долготы здания по его адресу. Геокодирование применяется для заполнения недостающих координат в некоторых источниках, например, Росреестре. Координаты домов не всегда указаны, а без них слои не смешать.

Задачу получилось решить «перекрёстным опылением»: геокоды из всех источников помещаются в общий каталог, а потом используются для закрытия пробелов. Секрет геокодера кроется в умении анализировать адреса. Алгоритм нормализует переданные ему значения, и это сильно повышает вероятность совпадений.
Принцип работы локального геокодера на примерах
Несмотря на «перекрёстное опыление» источников, пробелы в каталоге геокодов всё равно остаются. Они закрываются сторонними сервисами (например, геокодером от Яндекса) при наличии доступа.

Заключительный этап обработки территории — это смешивание нормализованных слоёв и выбор финальных характеристик объектов.
Диаграмма работы команд (финальная часть)
Когда одна и та же характеристика здания встречается в нескольких слоях, финальное значение выбирается автоматически. Для этого учитывается ранжирование источников, качество самого значения и сопоставление площадей застройки. Если в итоговом значении всё равно ошибка, есть возможность создать специальные «ручные» слои и исправить в них обнаруженные неточности. При смешивании слоёв такие данные получают приоритет.
Автоматизировать сборку карты было бы трудно без метода визуальной аналитики. Его суть — в осознанном объединении ресурсов компьютера и человека для решения нетривиальной задачи. Тесно связав автоматизацию и интерактивную визуализацию данных, мы создаём качественную обратную связь и удешевляем проверку гипотез.

В моём случае процесс разработки команд выглядел как-то так:
Процесс разработки команд
Теперь, когда команды настроены, создание новой карты выглядит заметно скучнее:
Запущенные в терминале команды
Команды написаны на тайпскрипте и лежат на гитхабе. Инструкции прилагаются: github.com/kachkaev/tooling-for-how-old-is-this-house
КАРТОВЕЧЕРИНКА ОСМ
Ошибки в источниках данных неизбежно попадают в конечный результат. Один из способов их исправить — вручную создавать локальные слои-заплатки.

Большинство локальных правок легко избежать, ведь некоторые источники открыты не только для использования данных, но и редактирования. Примерами служат ОСМ, Викигид и Викиданные — за этими проектами стоят большие сообщества волонтёров.

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

Контуры домов для how-old-is-this.house берутся из Опен-стрит-мапа (ОСМ). В Пензе, как и в других городах, есть местное ОСМ-сообщество: это люди, которые в свободное время улучшают открытые геоданные на пользу общества. Чтобы повысить качество ОСМ по Пензе, мы вместе с ребятами несколько недель ударными темпами добавляли пропущенные дома, уточняли геометрию и проставляли адреса. В ОСМ такое мероприятие принято называть «онлайн-картовечеринкой». Вот результаты нашей:
Как видно из визуализации, наша картовечеринка существенно улучшила основу для анализа возраста домов. Благодаря примерно двум десяткам тысяч (!) добавленных адресов, у Пензы теперь есть отличный набор геоданных по зданиям. Уверен, что он уже пригодился кому-то ещё!

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

ЛАСТОЧКА КАК СИМВОЛ ПЕНЗЫ

В левый-верхний угол карты how-old-is-this.house ставится логотип города. Обычно его делают на основе герба или флага. У Пензы они вот такие:
герб и флаг Пензы (жёлто-зелёные с тремя снопами)
Кроме снопов у города есть ещё один символ: ласточка. Она была частью герба с 1964 по 2001 год, а в 2019-м её восстановили в статусе эмблемы.

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

Я не умею рисовать эмблемы, поэтому пришлось воспользоваться семейным положением и заказать ласточку у графического дизайнера Марины Роот. Она поколдовала:
Процесс создания эмблемы ласточки для Пензы
И вот что получилось в результате:
Эмблема ласточки для Пензы
svg  ·  pdf  ·  png
Лицензия на файлы с ласточкой — CC0 (ограничений на использование нет).

ЦВЕТОВАЯ СХЕМА

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

Для карты возраста домов ключевая визуальная переменная — цвет, он кодирует год постройки. Авторы первых городов на how-old-is-this.house подбирали палитру на основе местных особенностей: это были цвета известных зданий и другие локальные символы. Несмотря на все плюсы такого подхода, он затрудняет повторное использование схемы и исключает возможность визуально сравнивать города.

Раз сбор данных теперь автоматизирован, логично задуматься над универсальной цветовой схемой, которая применима на всей территории РФ.

Лучшая цветовая схема практически в любой ситуации — та, которую не пришлось изобретать. Специалисты по визуализации данных перебирали палитры несколько десятилетий: проводили исследования и публиковались в научных журналах. Накопленный человечеством опыт собран в уже довольно устоявшейся коллекции схем:
Время линейно и непрерывно, поэтому для обозначения возраста домов в принципе подходит последовательная цветовая схема (по-английски sequential). В нашем случае такая палитра дала бы возможность легко сравнивать возраст домов между собой и примерно идентифицировать год постройки каждого дома. Несмотря на техническую правильность такого выбора, у него есть недостаток: последовательная цветовая схема скрывает исторический контекст.

Так получилось, что история России не поступательна. За один только 20 век страна пережила два крупных перелома: Октябрьскую революцию 1917 года и распад СССР в 1991 году. Любое резкое изменение в политике влияет на ценности общества и экономику, что неизбежно отражается на архитектуре новых домов. Таким образом, здания с разницей всего в несколько лет способны оказаться в соседних эпохах и существенно отличаться. Обозначать их почти одинаковым цветом можно, но лучше этого избежать.

Опираться на категориальную цветовую схему (categorical) мы тоже не можем. Цвета-категории не организованы в последовательность, что усложняет сравнение возраста домов. Чем больше категорий, тем сложнее держать их в памяти и тем чаще надо отвлекаться от карты.

Получается, что нам нужна палитра, которая совмещает характеристики категориальных и последовательных схем. Число категорий должно быть минимальным, но и не две, как у расходящихся схем (по-английски diverging).

Возможно, читатель слышал про мантру визуального поиска информации, которую Бен Шнейдерман постулировал ещё в 1996 году:
Overview first, zoom and filter, then details-on-demand
Обзор в начале, масштабирование и фильтрация, затем детали по запросу.
Эту мантру применяют для дизайна интерактивных визуализаций данных, ей следуют в том числе и карты на сайте how-old-is-this.house. Мне стало интересно, получится ли хотя бы частично перенести идею мантры на отдельную визуальную переменную «цвет», и, как мне кажется, это получилось.

Человеческий мозг хорошо справляется с классификацией и фильтрацией объектов по их раскраске — такую способность в нас заложила эволюция. Присвоив каждой исторической эпохе по базовому тону, мы добьёмся хорошего обзора данных и дадим возможность мысленно фильтровать дома по временным периодам. Когда зритель «масштабировал» своё внимание на конкретную эпоху, мы можем показать «детали по запросу», если будем варьировать тон, не сильно отступая от базового. Это позволит выявлять дополнительные пространственные закономерности и примерно определять год постройки каждого здания.

Если максимально абстрагироваться от деталей, история России последних веков делится на три эпохи: империяСССР и федерация. Второй временной сегмент можно представить как движение из одной крайности в другую: от гражданской войны и идей мировой революции до брежневского застоя и перестройки. С учётом этого перехода мы получаем четыре категории на масштабе «обзор». Их реально запомнить и держать в голове без постоянного отвлечения на легенду.

Берём четыре базовых тона (пока что неважно каких). Делаем для каждого из них градиент от светлого оттенка к тёмному:
Создание универсальной цветовой схемы для how-old-is-this.house – шаг 1
Два таких градиента переворачиваем:
Создание универсальной цветовой схемы для how-old-is-this.house – шаг 2
Забираем по половине от каждого градиента:
Создание универсальной цветовой схемы для how-old-is-this.house – шаг 3
И в результате получаем вот такую структуру:
Создание универсальной цветовой схемы для how-old-is-this.house – структура
Теперь дома легко сопоставить с историческим периодом и таким образом выявить самые общие закономерности в данных.

Для кодирования года внутри цветового отрезка есть два подхода:
Создание универсальной цветовой схемы для how-old-is-this.house – варианты кодирования года (градиент или ступеньки)
На первый взгляд плавный градиент кажется информативнее. Перед нами сотни уникальных цветов, поэтому закодировать год постройки мы можем с идеальной точностью. К сожалению, наши глаза плохо справляются с идентификацией оттенков, поэтому выяснить год, только глядя на раскраску дома будет очень трудно. Введя ступеньки каждые несколько лет, мы формально понижаем информативность визуализации. Это компенсируется тем, что людям становится проще сравнивать возраст домов и определять примерный год постройки.

После выбора четырёх базовых тонов и настройки ступенек цветовая схема получилась такой:
Универсальная цветовая схема для how-old-is-this.house
Из-за подъёма и спуска по оси яркости у нас есть 16 вполне отличимых ступенек. Их достаточно, чтобы присвоить цвет каждому десятилетию за последние сто лет. Более ранние ступеньки удлиняются, что позволяет охватить больший исторический период. Рубежи эпох округлены до 1920 и 1990 года — это вполне допустимо, учитывая инертность процесса строительства.

Логика цветовой схемы интуитивно понятна и легко запоминается.

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

На смену зелёному тону приходит красный. В результате революции экономика резко меняет курс, пересматривается подход к архитектуре. Классические стили и модерн уходят в прошлое, их заменяют рационализм и конструктивизм. Идеи коммунизма сталкиваются с реальностью и со временем трансформируются; красный цвет на временной шкале тоже постепенно бледнеет.

«Разворот» схемы происходит в 1950-е, на которые приходится восстановительный рост экономики после войны и политическая оттепель. В 1955 году выходит знаменитое постановление «Об устранении излишеств в проектировании и строительстве».

1960-е начинают фиолетовый сегмент цветовой схемы. Это время массового строительства типового жилья и экономии на архитектуре. Фиолетовый с годами «тяжелеет»: время надежд сменяется застоем 1970-х, экономической стагнацией и назревшей перестройкой.

На месте исчерпавшего себя СССР образуется Российская Федерация, и фиолетовый цвет меняется на синий. Более светлый оттенок для домов 1990-х отсылает к флагу России 1991-1993 годов, символу демократических реформ.

Что важно, получившаяся палитра совместима с разными формами дальтонизма:
Универсальная цветовая схема для how-old-is-this.house – совместимость с дальтонизмом
Трюк с подъёмом и спуском по оси яркости не работает только для людей с монохромным зрением (один случай на десятки тысяч). Если вы знаете кого-то с ахромазией, давайте поэкспериментируем с другими цветовыми схемами или попробуем штриховку.

Уверен, что профессиональные колористы или картографы найдут, как улучшить цветовую схему. Проверка палитры на дальтонизм и обновление карты автоматизированы, поэтому я с удовольствием помогу!
ИТОГ
У Пензы теперь есть карта возраста домов, а у всей России — возможность создавать такие же карты практически без ручного труда.

Кроме интерактивной онлайн-версии карты есть ещё и настенный постер, который вы можете кому-нибудь подарить:
Карта возраста домов в Пензе — постер
Данные из открытых источников не претендует на абсолютную точность — достичь её для десятков тысяч домов на практике нельзя. Самая распространённая и грустная ошибка в данных — вот этот пик на гистограмме годов постройки:
Гистограмма возраста домов Пензы + аномалия у 1917 года
Из-за гражданской войны конца 1910-х многие архивы были утрачены, и в советский реестр недвижимости было нечего вписать. 1917-й год постройки стал использоваться как отметка «до революции», и эту ошибку в данных мы видим даже через сто с лишним лет. Похожие по природе аномалии наблюдаются и у нескольких дореволюционных годов, но те пики существенно меньше.

Исправить прошлое уже не получится, а вот уточнить данные по сохранившимся домам мы всё-таки можем. Сайт how-old-is-this.house позволяет предлагать уточнения, которые добавляются на карту после проверки модератором. Не стесняйтесь и делайте вклад, если что-то нашли!

Все наборы данных (включая исправления от посетителей сайта) доступны для скачивания под свободной лицензией.
ЧТО ДАЛЬШЕ?
Изучайте карту возраста домов Пензы, делитесь картинками в соцсетях и чатах, обсуждайте историю дорогих для вас мест!

Архитектурное наследие имеет не меньшую ценность, чем литература, живопись и музыка, ведь оно тоже формирует многие поколения людей. Чем больше мы знаем про историю города, тем меньше ошибок мы как общество совершим.
«Реставрация» дома по улице Урицкого 56
Если вы из Пензы, присоединяйтесь к нашему уютному сообществу Опен-стрит-мап или вступайте в местное отделение Городских проектов. Будем улучшать свободные геоданные или городскую среду, а лучше всё вместе!

Если вы краевед или студент-архитектор, давайте обсудим, что делать с неточными данными в центре. Замена «1917» на реальные года — это очень увлекательный и полезный для общества проект!

Если вас заинтересовала автоматизация сбора данных, подписывайтесь на мой твиттер: @kachkaev_ru. Спрос на эту тему замотивирует меня написать статью на Хабре и поделиться ссылкой в ленте.
СПАСИБО
  • ребятам из сообщества Опен-стрит-мап за невероятную активность на картовечеринке (было очень круто!)
  • Степану Сомову из Пензенского отделения Горпроектов за предложение проанализировать возраст домов
  • Марине Роот за качественную векторную эмблему ласточки
  • Ивану Шумилину из Твери и Андрею Вагину из Кургана за помощь в тестировании и улучшении команд
  • всем, кто помогал с поиском и уточнением данных
  • Никите Славину за идею проекта за создание сообщества вокруг него
Добавляйте свой город на how-old-is-this.house — теперь это намного проще!