Идея
Примерно из ниоткуда возникает идея сделать прекрасную складную карту Петербурга, показывающую возраст домов, их архитектурный стиль и на которой будут выделены здания — яркие представители стиля.
В памяти есть какие-то онлайн-проекты.
Беглый поиск дает много примеров из разных городов: Портланд, Рейкьявик, Нью-Йорк: Бруклин, Манхеттен, Барселона, Любляна, Львов, и даже проект масштаба страны, — Нидерланды.
Про Петербург тоже кое-что есть: например, отличные данные на Петроградку: «Ретроспектива застройки Петербурга» и проект Делового Петербурга: «Как застраивался Петербург: история строительства города за 68 секунд».
Цель — бумажная карта, к идее сделать how-old-is-this.house приду в процессе. Начинаю искать сырые данные.
Данные
Проекты Павла Суворова про Петроградку и Делового Петербурга ссылаются на «Технико-экономические паспорта многоквартирных домов» — это табличка на двадцать две с лишним тысячи домов, с разными характеристиками. Как я понял, она появилась благодаря программе взносов на капитальный ремонт. В таблице интерес представляют адрес и год постройки, географических координат, увы нет.
«Паспорта» лежат на портале «Открытые данные Петербурга». На нем же есть раздел «Карта» и, если хорошо искать, или у тебя знающие друзья, в разделе прочее есть слой «Объектно-адресная система Санкт-Петербурга». В нем прекрасно детализированная геометрия всех объектов, имеющих адрес в Петербурге, в атрибутах помимо названия объекта и адреса, регулярно встречается год постройки. Всего сто двадцать пять тысяч адресов, и сорок одно тысячa дат. Прекрасно подходит, только нужно избавиться от набережных, разъездных путей и прочего, что не является зданиями.
Но не каждое здание в Петербурге имеет адрес, зато почти каждое — отрисовано соавторами карты OpenStreetMap. Именно этого нам недостает для базового слоя геометрии — выгружаем все объекты с ключамиbuilding=*
и addr:city='Санкт-Петербург'
. Заодно прихватим ключи с именем, адресом и годом постройки (изредка он бывает заполнен). Получаем сто сорок три тысячи объектов, из которых про две тысячи есть информация о годе постройки.
Eсли накинуть все адреса из паспортов домов как точки и выделить полигоны с годами из «объектно-адресной системы» и OSM — можно оценить покрытие. Оцениваем: очень много серых пятен — продолжаю искать исходные данные.
Искать долго не приходится, есть прекрасный «Архитектурный сайт Санкт-Петербурга CityWalls.ru». Деликатно собираем данные с портала, получаем табличку с адресом, годами постройки, именем архитектора, архитектурным стилем, ссылками на страницу сооружения и его фотографию. Таких записей 27 тысяч, но часть из них — утраченные здания.
Быстро превращаем адреса в точки, накидываем на карту вместе с предыдущими слоями — кажется покрытые очень приличное, ура!
Теперь нужно все эти данные собрать вместе, причесать и преобразовать в симпатичный вид.
Геопроцессинг
Для решения геоинформационных задач использовал QGIS и ArcGIS Pro, если нужно было что-то автоматизировать на Python — PyCharm.
В первую очередь, готовлю слой зданий, который потом буду максимально наполнять атрибутами. Основа слоя — «Объектно-адресная система Санкт-Петербурга» с портала открытых данных Санкт-Петербура, геометрия детальная, видимо, из кадастровых паспортов, смотрится красиво, бонусом забираем все мосты. Максимально избавляемся от ненужных нам полигонов набережных, подъездных путей, площадок складирования и т.п.
Из выгрузки OpenSteetMap забираем все полигоны, которые не пересекаются с полигонами из первого слоя. Получаем вот такой результат на сто сорок две тысячи объектов, полезные атрибуты из исходных слоёв уже включены.
Базовый слой зданий «Объектно-адресная система Санкт-Петербурга»+ OpenStreetMap
«Технико-экономические паспорта многоквартирных домов» — это таблица, в которой один из столбцов — адрес. Для того, чтобы использовать эти данные, таблицу нужно геокодировать — каждой записи сопоставить точку с координатами. Пишем простой скрипт на Python, который с помощью одного из сервисов геокодирования добавляет столбцы широты и долготы в таблицу. По пути теряем небольшой процент записей — некоторые адреса не удается обработать.
На сайте СityWalls.ru простая структура, данные несложно собрать автоматически. Пишу простенький парсер, который собирает ссылку на страницу дома, его id на портале, текстовую строку: года постройки, архитектурный стиль, архитектора, название, адрес и ссылку на фотографию. Координаты с сайта не подходят — пользователи часто отмечают точки рядом с домом, а не сам дом, поэтому сам геокодирую слой, используя уже готовый скрипт. В результате — географические точки с аттрибутами на двадцать семь тысяч зданий.
По простому принципу — если точка находится на полигоне — присоединяем информацию из «Паспортов» и CityWall к зданиям. Теперь про каждый полигон у нас есть табличка с кучей информации из разных источников:
- «Объектно-адресная система Санкт-Петербурга»
- OpenStreetMap
- «Технико-экономические паспорта многоквартирных домов»
- СityWalls
Похоже на помойку. В итоге хочется иметь на каждое здание аккуратный набор атрибутов:
- название
- год постройки
- архитектор
- стиль
- адрес
- ссылку на страницу CityWalls
- ссылку на фотографию
- id
Эмпирически определяем приоритет источников для атрибутов, например, адреса лучше всего указаны в слое «Объектно-адресная система», хорошо — в «Паспортах» и примерно одинаково по качеству — в CityWalls и OpenStreetMap
Отдельный прикол с годом, для анализа нужно число, а во всех источниках — это строка, причем формат очень разнообразный: это может быть понятный "1703" или "1703г", список годов "1703,2020", период строительства "1822-1917", эпоха "до 1822", или прекрасное "1 9471 94 8", а также их комбинации и исключения.
Немного покрутив данные и пару раз сделав плохой выбор, нахожу правило, которое дает приличный результат: берем первое четырехзначное число из строки, если это не период, иначе — второе из перового периода в строке. Немного мучений с магией регулярных выражений, и в одну строку кода превращаем все текстовые поля дат в числа.
Зеленый — полигоны с годами, красный — без года
Если смотреть на процент заполнения (из ста сорока двух тысяч полигонов, года есть только для пятидесяти пяти), кажется, что покрытие вышло слабое, но если оценить на пространственное распределение, и качество объектов (например, дома против трансформаторных будок), получается прилично. Визуально кажется, что задачу слой выполняет: видны пространственные паттерны, дырок визуально мало, или они распределены равномерно. Слой интересно изучать, но перфекционист хочет полного покрытия, перфекциониста пока придушим.
Стоит оценить качество полученных данных. Из базовых методов, всегда доступно — можно посмотреть на график:
Сразу бросаются в глаза два пика — 1917 и 2008 год. Провалы после революции, Великой Отечественной войны и распада Советского союза — логичны и читаемы. Как быть с двумя выбросами? Гипотеза такая — многие дома дореволюционной постройки помечены как 1917, всякие варианты "до/предположительно" я отмечал.
2008 год — это, и вправду, период активного строительства в Петербурге. Цифры за 2008 на сайте Комитета по строительству и архитектуре меньше, но это ни о чем не говорит. К сожалению, я не помечал из какого источника взят год в итоговой таблице, расследование отложу на потом.
Беды большой в этом нет, но важно пользователя или предупредить об аномалиях, или показывать данные так, чтобы выбросы не влияли на достоверность визуализации.
Ура! Данные обработали, качество оценили, можно визуализировать.
Кстати, набор свободно доступен по лицензии CC BY-SA в разделе "Данные".
Палитра цветов
Опыт коллег подсказывает, что выигрышно смотрится представление возраста домов в непрерывной палитре от горячих цветов к холодным, на темном фоне. Попробуем:
возьмем стандартную темную базовую карту от ESRI и цветовую палитру Spectral, предустановленную в QGIS:
Смотрится эффектно, но хочется, чтобы было круто и как-то связано с Петербургом.
Задача — подобрать цвета для базовой карты и домов. Один из моих любимых фотографов Петербурга — Андрей Михайлов, цвета на его фотографиях созвучны с моим "чувством города". Из инстаграмма фотографа набираю картинки, чтобы выудить из них ключевые цвета.
Таким образом, красный цвет с фасада Пантелеймоновской церкви, желтый — с Адмиралтейства и Петропавловского собора, зеленый цвет — с башни Кунсткамеры и синий — с купола Троицкого собора собираются в палитру.
Попы грифонов с Банковского мостика и крыши Васильевского острова дают так нужный нам диапазон синих и темно-серых оттенков. Все же Петербург.
В Mapbox Studio весело и удобно делаем базовую карту:
studio.mapbox.com
Собираем все вместе. Нужно немного поэкспериментировать с распределением временной шкалы по палитре, в итоге информативным оказывается способ, когда в каждом цветовом отрезке равное число объектов.
Получается эффектно, мне нравится, эффект "светлячков" смотрится хорошо, картинка как будто светится. Переход от старого "лампового" уличного освещения к новому "светодиодному" получается обыгран в цветах, символично. При этом четко читаются эпохи, но не настолько, чтобы пики 1917 и 2008 были заметны — славно. Впереди следующий этап — нужно как-то это показать людям.
Проклятый-Старый.дом
Нужен прототип. Кидаю набор данных друзям, которые разрабатывают хаб пространственных данных «Геосемантика». На карте показываем возраст цветом, а при нажатии на дом показываем его атрибуты и фотографию, если она есть. Пробую веб карту на "ближнем круге".
Друзья-кролики положительно отзываются об исследовании карты как о процессе "залипательном", это наводит на мысль, что интерактивная веб-карта может быть хорошим способом показать собранные данные, а также их улучшить, если наладить механизм сбора правок.
Веб-разработчик я плюс-минус никакой, поэтому одновременно советуюсь с заинтересованными однокурсниками, изучаем платформы и реализации других подобных платформ. Требования примерно такие:
быстро отрисовывать наши сто двадцать тысяч полигонов в разработанном стиле на своей базовой карте
возможность фильтрации по временной шкале
показывать карточку объекта с атрибутами и фотографией
наладить сбор крауд-правок.
Получаю дружественный совет присмотреться к платформе Carto. Кроме сбора правок, так или иначе всем требованиям платформа отвечает, причем на бесплатных тарифах можно сделать довольно много. Немного шаманим с данными, чтобы они дружили с Carto, например, год, чтобы его красиво показывать на временной шкале-гистограмме, должен быть в формате DDMMYYHHMMSSZ, или длина текстового поля должна быть не более 255 знаков.
Колдуем над HTML карточкой объекта, чтобы она была красивой и показывала ссылки. Вздыхаем, что не все реализовано, как бы хотелось, а тонкая настройка возможна с API, что трудоемко и дорого. Получается довольно симпатичная, быстрая и отзывчивая веб-карта.
carto.com
Проблему сбора правок решаю в меру изящным костылем. Гугл-форму можно предзаполнить по параметрам в ссылке, а ответы она, форма, складывает в таблицу. Это нас вполне устраивает: в таком виде правки можно и проверять, и можно автоматически обновить слой. Генерирую ссылки для каждого из объектов (некоторые выходят очень длинными, но костыль есть костыль), прикручиваем ссылку в карточку здания — сбор правок готов.
Теперь надо придумать доменное имя, задача оказывается прикольная и непростая: хочется передать в названии суть проекта, быть немного оригинальным и избежать слова "каждый" (потому что дом — не каждый). В процессе выясняю, что есть доменное пространство .house — рождается вариант «how-old-is-this.house». Если вдруг появится желание сделать проект глобальным — имя уже подходит. Только жаль, что нет русского домена .дом.
Веб-разработка, как я уже говорил, это не про меня — поэтому изучаю разные онлайн-конструкторы сайтов и останавливаюсь на Тильде. Особенно хорошо, ей удается адаптировать сайт под разные размеры экрана, что важно.
Верстаю сайт, вставляю карту с carto.com, делаю его двуязычным, подключаю комментарии, адаптирую под разные размеры экрана — вообще, процесс интересный. Результат — how-old-is-this.house
"Там что-то было про бумажную карту?"
В картографии очень люблю делать вещи осязаемые: печатные или деревянные. Чтобы можно было руками потрогать, на полку поставить или на стену повесить, например, и относительно холоден к мобильным и веб историям (и в одном и в другом убедитесь в моем портфолио на Behance).
Исходной идей было сделать бумажную карту центра Петербурга, в голове её образ уже есть. Но в процессе работы стало ясно, что данных и времени на подготовку нужно больше, чем казалось в начале пути, поэтому я продолжаю работать над ней. На странице "Постер и бумажная карта" можно подписаться на уведомление о её готовности.
Стиль визуализации, разработанный для веба, прямо просится на плакат и на стену. Вооружаюсь цитатой Шарля Жозефа Минарда: "Мои карты не просто показывают, они так же рассчитывают, вычисляют для глаза; это переломная точка...", и приступаю к верстке постера. Цель — красиво показать полученные данные, желательно так, чтобы можно было увидеть каждый дом, а также показать распределение зданий на карте по годам постройки. Кажется, что если окрасить в разработанную палитру гистограмму — выйдет познавательно.
Выбираю платформы для печати на заказ постеров. Соотношу рабочий масштаб карты и доступные размеры на платформах для печати — размер постера 60*90 сантиметров.
Верстка — дело приятное, тем более, львиная часть работы сделана до этого: экспортирую растр высокого разрешения из QGIS, в Adobe Illustrator готовлю гистограмму, добавляю копирайты, логотипы. Сейчас важно не забыть показать аномалии на гистограмме и пояснить, в чем дело. Получилось симпатично.
Заказываю пробные отпечатки на обеих платформах, финальные правки — готово!
Постер можно купить на странице "Постер и бумажная карта"
Улыбчивая безымянная девушка из Printful держит виртуальный постер
Спасибо
Было весело делать этот проект, хочу сказать спасибо:
- друзьям, кто терпел меня и тестировал и вычитывал разные части и этапы проекта
- Саше Семенову из Геосемантики за технические консультации и советы
- нашей самой крутой магистерской программе по картографии Cartography M. Sc., которая дает мне возможность, круг коллег и время делать такие истории