Мы все отлично знаем, где у нас в городе парки, а где университеты. Но если мы хотим узнать, где больше школ и меньше баров. Для двух параметров большинство людей смогут выполнить такую операцию оценки в пространстве в голове, но как быть если надо 4-5 параметров объединить и еще с разной важностью (детские сады важны, но школы важнее в два раза, а парки это вообще приоритет). Для этого был создан новый слой на карте.
Возможность получить индекс по всему городу (без привязки к многоэтажной застройке) была добавлена на основе комментариев к первой версии карты - статья (посмотрите первоначальное описание - в этой статье только укажу основные моменты и новый функционал). Больше всего пользователей смущало наличие пустых гексагонов и неравномерность индексов.
Теперь этого можно избежать выбрав в меню "Для всего города". В этом случае вам будут доступны все индексы, но строить мы их будем для всего города (и нормализовать соответственно). Напомню (кто читал ранее) индекс это не абсолютное количество объектов, это относительная мера по всему городу или выделенной области. Индекс учитывает удаленность, а также либо площадь объекта (парка), либо количество маршрутов общественного транспорта и так далее.
Доступные на данный момент индексы:
Плотность застройки - Чем ниже значение индекса тем плотнее застройка с учётом этажности.
Доступность детских садов - Чем выше значение индекса тем больше детских садов в радиусе доступности (до 1 км). Чем ближе объект, тем больше его вклад в значение индекса.
Доступность школ - Чем выше значение индекса тем больше школ в радиусе доступности (до 1 км). Чем ближе объект, тем больше его вклад в значение индекса.
Доступность транспорта - Чем выше значение индекса тем больше маршрутов общественного транспорта в радиусе доступности (до 1 км). Чем ближе остановка, тем больше его вклад в значение индекса.
Доступность парковок - Чем выше значение индекса тем больше общественных (без контролируемого доступа) парковок для автотранспорта в радиусе доступности (до 1 км). Чем ближе парковка, тем больше его вклад в значение индекса.
Доступность баров-ресторанов - Чем выше значение индекса тем больше кафе,баров,ресторанов и прочих точек питания в радиусе доступности (до 1 км). Чем ближе объект питания, тем больше его вклад в значение индекса.
Доступность медицины - Чем выше значение индекса тем больше поликлиник, клиник и больниц в радиусе доступности (до 2 км для клиник и 5 км для больниц). Чем ближе объект и если это больница, то тем больше его вклад в значение индекса.
Доступность спорта - Чем выше значение индекса тем больше спортивных центров и площадок в радиусе доступности (до 1 км). Чем ближе объект, тем больше его вклад в значение индекса.
Доступность парков - Чем выше значение индекса тем больше парков в радиусе доступности (до 2 км). Чем ближе парк и больше его площадь, тем больше его вклад в значение индекса.
Доступность объектов образования - Чем выше значение индекса тем больше университетов и колледжей в радиусе доступности (до 2 км). Чем ближе объект. и больше его площадь, тем больше его вклад в значение индекса.
Описание всех функций можно найти в Описании к сайту.
Техническая составляющая
Доступ к карте бесплатный для всех (пока будет разумная нагрузка - не миллионы пользователей :)). Никакой монетизации не предвидится поэтому простите, если где-то забыта лицензия или упоминание кого-либо. Ссылку на исходный код пока не даю - там всё не очень красиво (пока делалось чтобы работало). Могу только сказать что все расчеты делаются на локальном компьютере (и за разумное время - все города и индексы пересчитать на данный момент около часа занимает) без GPU и ChatGPT :).
Источники данных, инструменты и библиотеки:
Данные 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.
UPD
По отзывам @Goron_Dekar,@GaricTи других неравнодушных пользователей (не с этого сайта) сделаны следующие изменения:
скорректирован признак парк - в Москве и некоторых других городах они не отмечены в OSM как парки, а просто "область с деревьями". Теперь индекс "Доступность парков" более правильный;
скорректирован отбор остановок/маршрутов общественного транспорта - в выборку не попадали маршруты (relations в OSM) состоящие только из точек, без линий - обновлен индекс "Доступность транспорта";
вклад расстояния в индекс для объектов теперь квадратичный - это значит, например, что детский сад прямо в ячейке с домом имеет вес 64, в соседней ячейке 49, а на расстоянии 1км - вес 1. Пересчитаны все индексы.
Комментарии (17)
Goron_Dekar
03.09.2024 08:44У вас в Ясенево гор. Москвы доступность парков:0.
А это район, буквально окруженный со всех сторон лесами.
iSINUS Автор
03.09.2024 08:44Да, спасибо. В OSM для Москвы много парков как просто деревья обозначены - будем фиксить.
Для леса внутри городской черты будем считать его парком (для всех городов).
GaricT
03.09.2024 08:44С доступностью школ и садов по прежнему непонятное. В данном случае дом просто в кольце школ/садов - но индекс маленький. Возможно нужно как-то учитывать расстояние до объектов.
А вот тут проблема серьезнее: два соседних октагона и дикий разброс в значениях детских садов/плотность застройки:
iSINUS Автор
03.09.2024 08:44Да-да - много раз обсуждали. Просто где-то есть намного больше и ближе школы и сады. Как раз для этого и был создан слой "Для всего города".
Индекс считается не по одному ближайшему саду, а по всем в радиусе км. Гексагон со значением 58 для садов, просто ближе к садам №102 и 105.
А вот с плотностью застройки (где 0) - да, глюк - не попала, хоть на общем индексе есть (там дом без разбиения на подъезды в OSM и он представлен гексагоном ниже
GaricT
03.09.2024 08:44То что считается в определённом радиусе, понятно. Речь немножко о другом, между домами меньше 100 метров и такой скачок в измерениях - имхо так быть не должно. Мой посыл ввести не линейную зависимость. 4 садика на растоянии 100м, это не тоже самое что 4 садика стоящих по краю 1км окружности.
А вот с плотностью застройки (где 0) - да, глюк - не попала, хоть на общем индексе есть (там дом без разбиения на подъезды в OSM и он представлен гексагоном ниже
Возможно это связано с кривизной КЛАДРа/ФИАС. Практически это дом 10 (без литеры и корпуса), но ни в кладре/фиасе его нет, в справочниках он фигурирует как дом 10 литера Г.
iSINUS Автор
03.09.2024 08:44То что считается в определённом радиусе, понятно. Речь немножко о другом, между домами меньше 100 метров и такой скачок в измерениях - имхо так быть не должно. Мой посыл ввести не линейную зависимость. 4 садика на растоянии 100м, это не тоже самое что 4 садика стоящих по краю 1км окружности.
Да, соглашусь что зависимость надо подкрутить - сейчас она пропорционально расстоянию - то что ближе х8, на километре х1. Возможно экспоненциально будет более правдоподобней.
Но тут советовали и в похожих работах тоже было - прокладывать пеший путь и уже по этому времени в пути зависимость вводить. Буду пробовать - это пример как раз хороший с вашей картинки.
iSINUS Автор
Эх как пошли все по ссылке - там VM не очень, пока не будет достаточно tiles в cache будет медленно отдавать - проявите терпение, пожалуйста.