Мы все отлично знаем, где у нас в городе парки, а где университеты. Но если мы хотим узнать, где больше школ и меньше баров. Для двух параметров большинство людей смогут выполнить такую операцию оценки в пространстве в голове, но как быть если надо 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)


  1. iSINUS Автор
    03.09.2024 08:44
    +1

    Эх как пошли все по ссылке - там VM не очень, пока не будет достаточно tiles в cache будет медленно отдавать - проявите терпение, пожалуйста.


  1. Skipy
    03.09.2024 08:44

    Наверное, это было бы хорошо, если бы оно работало

    И никаких идей, почему карта не видна. С точки зрения UX это, как бы помягче...


    1. iSINUS Автор
      03.09.2024 08:44

      В процессе - докину железа ...

      Должно подотпустить сейчас - набрало кэша уже и первая волна схлынула.


  1. Derserg
    03.09.2024 08:44

    Нихт арбайтен... Совсем


  1. AlexTmp8
    03.09.2024 08:44

    работает, спб


  1. roofcat
    03.09.2024 08:44

    Спасибо, классный хороплет. А можно добавить город? Хочется на Нови Сад посмотреть


    1. iSINUS Автор
      03.09.2024 08:44
      +1

      При следующей загрузке (20 сентября) или раньше, если сделаю инкрементальную загрузку по городам (пока не совсем готова).


    1. iSINUS Автор
      03.09.2024 08:44

      Добавлен.


  1. Goron_Dekar
    03.09.2024 08:44

    У вас в Ясенево гор. Москвы доступность парков:0.

    А это район, буквально окруженный со всех сторон лесами.


    1. nespressopixie
      03.09.2024 08:44

      лес не парк там не изнасилуют но закапают


    1. iSINUS Автор
      03.09.2024 08:44

      Да, спасибо. В OSM для Москвы много парков как просто деревья обозначены - будем фиксить.

      Для леса внутри городской черты будем считать его парком (для всех городов).


  1. GaricT
    03.09.2024 08:44

    С доступностью школ и садов по прежнему непонятное. В данном случае дом просто в кольце школ/садов - но индекс маленький. Возможно нужно как-то учитывать расстояние до объектов.

    А вот тут проблема серьезнее: два соседних октагона и дикий разброс в значениях детских садов/плотность застройки:


    1. iSINUS Автор
      03.09.2024 08:44

      Да-да - много раз обсуждали. Просто где-то есть намного больше и ближе школы и сады. Как раз для этого и был создан слой "Для всего города".

      Индекс считается не по одному ближайшему саду, а по всем в радиусе км. Гексагон со значением 58 для садов, просто ближе к садам №102 и 105.

      А вот с плотностью застройки (где 0) - да, глюк - не попала, хоть на общем индексе есть (там дом без разбиения на подъезды в OSM и он представлен гексагоном ниже


      1. GaricT
        03.09.2024 08:44

        То что считается в определённом радиусе, понятно. Речь немножко о другом, между домами меньше 100 метров и такой скачок в измерениях - имхо так быть не должно. Мой посыл ввести не линейную зависимость. 4 садика на растоянии 100м, это не тоже самое что 4 садика стоящих по краю 1км окружности.

        А вот с плотностью застройки (где 0) - да, глюк - не попала, хоть на общем индексе есть (там дом без разбиения на подъезды в OSM и он представлен гексагоном ниже

        Возможно это связано с кривизной КЛАДРа/ФИАС. Практически это дом 10 (без литеры и корпуса), но ни в кладре/фиасе его нет, в справочниках он фигурирует как дом 10 литера Г.


        1. iSINUS Автор
          03.09.2024 08:44

          То что считается в определённом радиусе, понятно. Речь немножко о другом, между домами меньше 100 метров и такой скачок в измерениях - имхо так быть не должно. Мой посыл ввести не линейную зависимость. 4 садика на растоянии 100м, это не тоже самое что 4 садика стоящих по краю 1км окружности.

          Да, соглашусь что зависимость надо подкрутить - сейчас она пропорционально расстоянию - то что ближе х8, на километре х1. Возможно экспоненциально будет более правдоподобней.

          Но тут советовали и в похожих работах тоже было - прокладывать пеший путь и уже по этому времени в пути зависимость вводить. Буду пробовать - это пример как раз хороший с вашей картинки.


  1. hobbs
    03.09.2024 08:44

    Как всегда Ижевск в пролёте. Добавьте пожалуйста


    1. iSINUS Автор
      03.09.2024 08:44

      Со следующей загрузкой (20 сентября) добавлю.