![](https://habrastorage.org/getpro/habr/upload_files/019/824/9e8/0198249e8e01a20db14f315413e19972.png)
При выборе где снять или купить жилье (когда есть большой выбор в разных районах, кварталах города) мы руководствуемся либо своим представлением о «хорошем районе», либо советом друзей/знакомых. Чтобы выбор основывался чуть больше на конкретных фактах, чем чувствах, родилась идея построить карту с количественными показателями (индексами), которые помогут сформировать решение о покупке/аренде недвижимости. Так же эти показатели можно использовать в качестве помощи при выборе места для открытия, например, точки общественного питания.
Идея
Области с многоэтажной застройкой разбиты на гексагоны на основе Uber H3 Геоиндекса. Плотность застройки рассчитывается на основе площади и этажности зданий в соответствующем гексагоне. Доступность объектов рассчитывается на основе расстояния до центра гексагона. Индекс строится как сравнительная характеристика для города (области карты), а не количество объектов.
Общий индекс рассчитывается как сумма отдельных индексов с весами и последующей нормализацией. Веса можно выбрать от -5 до 5. При указании 0 - индекс не будет использоваться в расчетах. Индексы нормализованы по городу или выбранной области (нормализован только общий индекс, индивидуальные индексы остаются нормализованными по городу). Перед нормализацией выполнятся замена экстремальных значений (max, min) на граничные используя подход IQR для нахождения всплесков индекса.
Расчеты основываются на данных из OpenStreetMap (OSM). Вся информация о застройке, транспорте, школах, барах и прочих взята из тэгов различных объектов OSM. Да, информация не всегда точна и есть задержка в актуальности, но ее можно править самостоятельно (при нахождении неточности) и через месяц (связано с периодичностью выгрузки pbf - ориентировочно 20 числа месяца) она попадет на эту карту и нет необходимости в лицензиях-оплате данных из геоинформационных/градостроительных баз.
На данным момент карта содержит данные для крупных городов Республики Беларусь (просто потому что я оттуда), Москвы и Санкт-Петербурга. Также добавлены города: Новосибирск, Екатеринбург, Казань, Нижний Новгород, Красноярск, Челябинск, Самара, Уфа, Ростов-на-Дону, Краснодар, Омск, Воронеж, Пермь, Волгоград, Саратов, Тюмень, Вильнюс, Рига, Таллин, Тбилиси, Батуми, Ереван, Баку, Астана, Белград, Варшава, Гданьск, Вроцлав, Краков, Стамбул.
Реализация
Доступные на данный момент индексы:
Плотность застройки - Чем ниже значение индекса тем плотнее застройка с учётом этажности.
Доступность детских садов - Чем выше значение индекса тем больше детских садов в радиусе доступности (до 1 км). Чем ближе объект, тем больше его вклад в значение индекса.
Доступность школ - Чем выше значение индекса тем больше школ в радиусе доступности (до 1 км). Чем ближе объект, тем больше его вклад в значение индекса.
Доступность транспорта - Чем выше значение индекса тем больше маршрутов общественного транспорта в радиусе доступности (до 1 км). Чем ближе остановка, тем больше его вклад в значение индекса.
Доступность парковок - Чем выше значение индекса тем больше общественных (без контролируемого доступа) парковок для автотранспорта в радиусе доступности (до 1 км). Чем ближе парковка, тем больше его вклад в значение индекса.
Доступность баров-ресторанов - Чем выше значение индекса тем больше кафе,баров,ресторанов и прочих точек питания в радиусе доступности (до 1 км). Чем ближе объект питания, тем больше его вклад в значение индекса.
Описание всех функций можно найти в Описании к сайту.
![Карта со всеми элементами управления Карта со всеми элементами управления](https://habrastorage.org/getpro/habr/upload_files/bd8/4ac/6a5/bd84ac6a558577793421c07934c13abf.png)
Слой с данными реализован как векторное множество тайлов. Подложка карты это растровые тайлы OSM. Тайлы строятся на лету на основе данных в базе и переданных параметров (город, область, параметры). Общий индекс не хранится, а рассчитывается в момент обращения за тайлом.
Планы
Если кто-то будет следить за картой, то планируются следующие доработки (скорее всего в таком порядке как и указаны):
Добавить крупные города «близкого зарубежья».Сделать интерфейс приложения более современным.
Переехать на более производительный сервер - чтобы не дорого и хватало.
Добавить еще индексов и готовых комбинаций параметров.
Подготовить и открыть исходный код.
Техническая составляющая
Доступ к карте бесплатный для всех (пока будет разумная нагрузка - не миллионы пользователей :)). Никакой монетизации не предвидится поэтому простите, если где-то забыта лицензия или упоминание кого-либо. Ссылку на исходный код пока не даю - там всё не очень красиво (пока делалось чтобы работало).
Источники данных, инструменты и библиотеки:
Данные OSM загружаются с https://download.geofabrik.de/. Подложка карты - тайлы
https://tile.openstreetmap.org/{z}/{x}/{y}.png
.Обработка данных, построение индексов и подготовка тайлов PostgreSQL с установленными PostGIS и h3-pg.
Cервер тайлов - Martin.
Карты и элементы управления для нее - MabLibre GL JS.
Сервер HTTP - nginx.
Развернуто пока все на Yandex Cloud.
Комментарии (19)
aborouhin
20.08.2024 16:10+1Потыкал по центру Питера. Гексагон, в центре которого павильон метро, имеет меньший индекс доступности транспорта, чем гексагон, от которого до ближайшего метро километр. Вероятно, наземный и скоростной транспорт никак не различаются в алгоритме оценки, тогда как в действительности между ними огромная разница т.зр. реального удобства жителей.
iSINUS Автор
20.08.2024 16:10Спасибо! Действительно упустил подземку. Изменю расчет - будет больше влияния от нее.
aborouhin
20.08.2024 16:10Вообще говоря, и в рамках наземного транспорта нужна бы дифференциация. Наличие рядом остановки автобуса, который ходит раз в 10 минут до поздней ночи и наличие рядом остановки автобуса, который ходит 3 раза в день, - с т.зр. транспортной доступности - две кардинально разные ситуации. Вот только эти данные уже из OSM не вытянуть...
iSINUS Автор
20.08.2024 16:10Да, в OSM такого не будет - максимум длина маршрута. Остальное это уже как развитие - надо будет искать источники и подключать информацию о маршрутах ОТ.
iSINUS Автор
20.08.2024 16:10Если какой-то из садов/школ и прочих объектов на ремонте - то да, это не учитывается. Такая информация редко есть в OSM.
Так же совсем новых объектов может и не быть - задержка от месяца до 3 может оказаться пока внесут данные.
aborigen81
20.08.2024 16:10ИМХО.
Очень хорошая идея.
Уместно было бы добавить доступность медицинских учреждений: хотя бы поликлиник. Особенно детских.
Про доступность детских садов и школ. Правильно ли я понимаю, что транспортная или пешеходная доступность не учитывается ?
Пояснение к вопросу. Есть города, у которых по карте соответствующее образовательное учреждение на расстоянии "вытянутой руки", а на самом деле между ними может быть речушка, мостик через которую находится в паре километров.iSINUS Автор
20.08.2024 16:10Спасибо.
Медицина в планах на добавление. Там скорее всего будет больше "радиус достижимости" и не только поликлиники, но и более крупные медицинские учреждения.
Да, доступность пока просто радиусы (ну если раскрывать подноготную - путь по H3 гексагонам на самом деле). Случаи когда маршрут значительно больше, чем "прямая видимость", не доминирующие - поэтому пока на "радиусах". Расчет используя какую Valhalla значительно удлинит время подготовки данных, но в общем большого влияние не внесет. Оставляем это улучшение уже на "коммерческую" версию (если такая будет кому-то нужна).
vedmed007
20.08.2024 16:10Интересный проект, но все как обычно упирается в качество данных - даже для человейников сданных 10 лет назад плотность застройки 0, а с парковкой и доступностью все ок, хотя дело как раз наоборот + берег левый берег правый сильно влияет на путь)
iSINUS Автор
20.08.2024 16:10С индексами просто интуитивно каждый по разному понимает - с плотностью застройки у всех возникают проблемы. Там в подписи с полю указано - что как раз 0 значение (на карте красное - типа плохо) говорит о высокой плотность застройки, и соответственно если застройка не плотная, то значение ближе к зеленому (типа зеленый хорошо).
Доступность транспорта говорит именно о доступности - мы же не знаем куда конкретно хочет ездить человек. Для построения изохрон есть другие сервисы, например https://commutetimemap.com/map. Но как идея иметь все в одном месте очень хорошая.
LonFas
А можно Краснодар добавить? Я думаю это будет востребовано.
iSINUS Автор
Да, легко - чуть поднакоплю отзывов. Через день-два добавлю.
Altf1
Интересные данные по Санкт-Петербургу получились. Спасибо за статью.
Добавьте, пожалуйста города-миллионники РФ
iSINUS Автор
Принято
iSINUS Автор
Добавлены:
Новосибирск
Екатеринбург
Казань
Нижний Новгород
Красноярск
Челябинск
Самара
Уфа
Ростов-на-Дону
Краснодар
Омск
Воронеж
Пермь
Волгоград
Саратов
Тюмень