При выборе где снять или купить жилье (когда есть большой выбор в разных районах, кварталах города) мы руководствуемся либо своим представлением о «хорошем районе», либо советом друзей/знакомых. Чтобы выбор основывался чуть больше на конкретных фактах, чем чувствах, родилась идея построить карту с количественными показателями (индексами), которые помогут сформировать решение о покупке/аренде недвижимости. Так же эти показатели можно использовать в качестве помощи при выборе места для открытия, например, точки общественного питания.

Идея

Области с многоэтажной застройкой разбиты на гексагоны на основе Uber H3 Геоиндекса. Плотность застройки рассчитывается на основе площади и этажности зданий в соответствующем гексагоне. Доступность объектов рассчитывается на основе расстояния до центра гексагона. Индекс строится как сравнительная характеристика для города (области карты), а не количество объектов.

Общий индекс рассчитывается как сумма отдельных индексов с весами и последующей нормализацией. Веса можно выбрать от -5 до 5. При указании 0 - индекс не будет использоваться в расчетах. Индексы нормализованы по городу или выбранной области (нормализован только общий индекс, индивидуальные индексы остаются нормализ��ванными по городу). Перед нормализацией выполнятся замена экстремальных значений (max, min) на граничные используя подход IQR для нахождения всплесков индекса.

Расчеты основываются на данных из OpenStreetMap (OSM). Вся информация о застройке, транспорте, школах, барах и прочих взята из тэгов различных объектов OSM. Да, информация не всегда точна и есть задержка в актуальности, но ее можно править самостоятельно (при нахождении неточности) и через месяц (связано с периодичностью выгрузки pbf - ориентировочно 20 числа месяца) она попадет на эту карту и нет необходимости в лицензиях-оплате данных из геоинформационных/градостроительных баз.

На данным момент карта содержит данные для крупных городов Республики Беларусь (просто потому что я оттуда), Москвы и Санкт-Петербурга. Также добавлены города: Новосибирск, Екатеринбург, Казань, Нижний Новгород, Красноярск, Челябинск, Самара, Уфа, Ростов-на-Дону, Краснодар, Омск, Воронеж, Пермь, Волгоград, Саратов, Тюмень, Вильнюс, Рига, Таллин, Тбилиси, Батуми, Ереван, Баку, Астана, Белград, Варшава, Гданьск, Вроцлав, Краков, Стамбул.

Развития функционала в статье.

Реализация

Доступные на данный момент индексы:

  • Плотность застройки - Чем ниже значение индекса тем плотнее застройка с учётом этажности.

  • Доступность детских садов - Чем выше значение индекса тем больше детских садов в радиусе доступности (до 1 км). Чем ближе объект, тем больше его ��клад в значение индекса.

  • Доступность школ - Чем выше значение индекса тем больше школ в радиусе доступности (до 1 км). Чем ближе объект, тем больше его вклад в значение индекса.

  • Доступность транспорта - Чем выше значение индекса тем больше маршрутов общественного транспорта в радиусе доступности (до 1 км). Чем ближе остановка, тем больше его вклад в значение индекса.

  • Доступность парковок - Чем выше значение индекса тем больше общественных (без контролируемого доступа) парковок для автотранспорта в радиусе доступности (до 1 км). Чем ближе парковка, тем больше его вклад в значение индекса.

  • Доступность баров-ресторанов - Чем выше значение индекса тем больше кафе,баров,ресторанов и прочих точек питания в радиусе доступности (до 1 км). Чем ближе объект питания, тем больше его вклад в значение индекса.

  • Доступность медицины - Чем выше значение индекса тем больше поликлиник, клиник и больниц в радиусе доступности (до 2 км для клиник и 5 км для больниц). Чем ближе объект и если это больница, то тем больше его вклад в значение индекса.

  • Доступность спорта - Чем выше значение индекса тем больше спортивных центров и площадок в радиусе доступности (до 1 км). Чем ближе объект, тем больше его вклад в значение индекса.

  • Доступность парков - Чем выше значение индекса тем больше парков в радиусе доступности (до 2 км). Чем ближе парк и больше его площадь, тем больше его вклад в значение индекса.

  • Доступность объектов образования - Чем выше значение индекса тем больше университетов и колледжей в радиусе доступности (до 2 км). Чем ближе объект. и больше его площадь, тем больше его вклад в значение индекса.

Описание всех функций можно найти в Описании к сайту.

Карта со всеми элементами управления
Карта со всеми элементами управления

Слой с данными реализован как векторное множество тайлов. Подложка карты это растровые тайлы 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.