«Технико-экономические паспорта многоквартирных домов
» —
это таблица, в которой один из столбцов — адрес. Для того, чтобы использовать эти данные, таблицу нужно
геокодировать — каждой записи сопоставить точку с координатами. Пишем простой скрипт на Python, который с помощью одного из сервисов геокодирования добавляет столбцы широты и долготы в таблицу. По пути теряем небольшой процент записей — некоторые адреса не удается обработать.
На сайте СityWalls.ru простая структура, данные несложно собрать автоматически. Пишу простенький парсер, который собирает ссылку на страницу дома, его id на портале, текстовую строку: года постройки, архитектурный стиль, архитектора, название, адрес и ссылку на фотографию. Координаты с сайта не подходят — пользователи часто отмечают точки рядом с домом, а не сам дом, поэтому сам геокодирую слой, используя уже готовый скрипт. В результате — географические точки с аттрибутами на двадцать семь тысяч зданий.
По простому принципу — если точка находится на полигоне — присоединяем информацию из «Паспортов» и CityWall к зданиям. Теперь про каждый полигон у нас есть табличка с кучей информации из разных источников:
- «Объектно-адресная система Санкт-Петербурга»
- OpenStreetMap
- «Технико-экономические паспорта многоквартирных домов»
- СityWalls
Похоже на помойку. В итоге хочется иметь на каждое здание аккуратный набор атрибутов:
- название
- год постройки
- архитектор
- стиль
- адрес
- ссылку на страницу CityWalls
- ссылку на фотографию
- id
Эмпирически определяем приоритет источников для атрибутов, например, адреса лучше всего указаны в слое «Объектно-адресная система», хорошо — в «Паспортах» и примерно одинаково по качеству — в CityWalls и OpenStreetMap
Отдельный прикол с годом, для анализа нужно число, а во всех источниках — это строка, причем формат очень разнообразный: это может быть понятный "1703" или "1703г", список годов "1703,2020", период строительства "1822-1917", эпоха "до 1822", или прекрасное "1 9471 94 8", а также их комбинации и исключения.
Немного покрутив данные и пару раз сделав плохой выбор, нахожу правило, которое дает приличный результат: берем первое четырехзначное число из строки, если это не период, иначе — второе из первого периода в строке. Немного мучений с магией регулярных выражений, и в одну строку кода превращаем все текстовые поля дат в числа.