Кадый день вы совершаете почти одни и те же действия - просыпаетесь, чистите зубы, завтракаете, кто-то из вас отводит детей в садик или начальную школу, потом вы идете на работу, возвращаясь с работы вы идете на спортивную тренировку, заходите в магазин или в пункт выдачи заказов и возвращаетесь домой. На выходных идете в парк или в торговый центр на шоппинг, возможно в театр или ночной клуб.

Поиски и сравнения места для жительства включают в себя оценку окрестностей вокруг. А можно пойти с обратной стороны и присмотреть дома где все нужное вам по соседству. Чтобы меньше времени проводить в дороге и больше моментов жизни было с пользой.

Моя программа расчитала десятки миллионов пешеходных дистанций от жилых зданий Москвы в 2км от метро и опубликовал их на Github в виде поисковика жилья для гиков. Про который я рассказал в прошлой статье.

Если интересуют технические подробности про обработку данных, можете почитать мои статьи здесь "Где в Москве жить «неплохо»", "Где 15 минут пешком от дома до метро в Москве", "Жилье в 500м от сетевых продуктовых магазинов в Москве.".

Источник геоданных - OpenStreetMap позволяющий любому пользователю редактировать данные, поэтому если вдруг там не обнаружили ваш любимый магазин, школу, площадку для выгула собак или вдруг жилое здание на карте в реальности является зданием магазина... Читайте документацию, хорошо подумайте о правильности ваших правок и только после этого редактируйте данные. Не относитесь просто как потребитель - улучшайте, как вы возможно уже делали в Народных картах от Яндекс. Главное отличие от Народных карт - эти данные вы можете скачивать и анализировать, в этом главная ценность которую дарит проект OSM.

В этой статье я приведу полезные запросы для поиска места жительства.

Синтаксис предикатов для поиска в официальной документации duckdb. В запросе доступны следующие колонки:

    Column     |      Type       |
---------------+-----------------+
 distance      | smallint        | 
 categories    | text[]          | 
 name          | text            | 
 amenity       | text            | 
 leisure       | text            | 
 shop          | text            | 
 healthcare    | text            | 
 tourism       | text            | 
 historic      | text            | 
 sport         | text[]          | 
 education     | text            | 
 religion      | text            | 
 office        | text            | 
 brand         | text            | 
 network       | text            | 
 operator      | text            | 

Значения для которых можете найти в вики OSM:

Метро

  • Дома в 500м от входов в МЦК: network='МЦК' and 'transport'=any(categories) and distance <= 500

  • Дома в 500м от входов в метро: network='Московский метрополитен' and 'transport'=any(categories) and distance <= 500

  • Если вам нужено найти дома у метро или МЦК в 15 минутах ходьбы: (network='МЦК' or network='Московский метрополитен') and 'transport'=any(categories) and distance <= 1250

Магазины

  • Жилье в 1.5км от Ашана или Атак: distance <= 1500 and (shop='supermarket' or shop='convenience') and brand in ('Ашан','Ашан Сити','Атак')

  • Пятёрочка, ВкусВилл, Дикси, Магнит, Магнолия, Перекрёсток в 500м: distance <= 500 and (shop='supermarket' or shop='convenience') and brand in ('Пятёрочка','ВкусВилл','Дикси','Магнит','Магнолия','Перекрёсток')

  • Пункты выдачи distance <= 1500 and brand in ('Wildberries','Ozon')

  • Торговый центр в 1.5км от жилья:distance <= 1500 and shop='mall'

Дети и учеба

  • Детский садик у дома: distance <= 500 and amenity='kindergarten'

  • Школа рядом: distance <= 1500 and amenity='school'

  • Коледж недалеко: distance <= 1500 and amenity='college'

  • ВУЗ на районе: distance <= 1500 and amenity='university'

Кафе, рестораны и точка

  • Кафе distance <= 1500 and amenity='cafe'

  • Рестораны: distance <= 1500 and amenity='restairant'

  • Фастфуд:distance <= 1500 and amenity='fast_food'

Медицина

  • Аптека поблизости:distance <= 500 and amenity='pharmacy'

  • Поликлиника: distance <= 1500 and amenity='clinic'

  • Больница: distance <= 1500 and amenity='hospital'

  • Стоматолог рядом: distance <= 1500 and amenity='dentist'

Религия

  • Место где проводят службы: distance <= 1500 and amenity='place_of_worship'

  • Мечеть рядом: distance <= 1500 and amenity='place_of_worship' and religion='muslim'

  • Можно указать другие конфессии поблизости, например: distance <= 1500 and amenity='place_of_worship' and religion='christian' или religion='buddhist' religion='jewish' religion='hindu'

Места для прогулок

  • Парки и сады:distance <= 1500 and (leisure='park' or leisure='garden')

  • Либо если вам все равно что на открытом воздухе: distance <= 1500 and 'outdoor'=any(categories)

Спорт

Спортцентр или фитнесс центр поблизости:distance <= 1500 and (leisure='sports_centre' or leisure='fitness_centre')

И можно уточнить какой спорт интересует distance <= 1500 and (leisure='sports_centre' or leisure='fitness_centre') and 'soccer'=any(sport) или fitness, basketball, tennis, table_tennis, running, athletics, volleyball, yoga, ice_hockey, swimming, gymnastics, hockey, skateboard, chess, futsal, football, badminton

Домашние животные

  • Площадка для выгула собак без намордников: distance <= 1500 and leisure='dog_park'

  • Ветеренар поблизости: distance <= 1500 and amenity='veterinary'

  • Приют для бездомных животных рядом: distance <= 1500 and amenity='animal_shelter'

Если не хочется жить прямо у ...

Если вам не хочется чтобы что-то было рядом с домом то можете указать это в поле "Что не хотим:"

Не жить близко к инфекционной больнице или психбольнице в поле "Что не хотим:": distance < 300 and'_specialHealthcare'=any(categories)

Дальше 100м от шумных мест "Что не хотим:": distance < 100 and '_noisy_place'=any(categories)

Например жить не ближе 300м от метро или МЦК в поле "Что не хотим:": distance < 300 and (network='МЦК' or network='Московский метрополитен') and 'transport'=any(categories)

Дома не дальше 1500м но и не ближе 300м от метро и МЦК
Дома не дальше 1500м но и не ближе 300м от метро и МЦК

Технологии

База данных DuckDB Wasm работает прямо в вашем браузере и запрашивает исходные данные с GitHub Pages, поэтому производительность зависит от сетевого соединения и вашего браузера. Но это же дает гибкость и возможности формулировать запросы так, как вам хочется, почти любой сложности, ведь DuckDB Wasm - полноценная аналитическая база данных. И неявное следствие из архитектуры системы - мне не нужно платить за хостинг некомерческого проекта и придумывать способы монетизации. Как следствие для вас - пользователей не будет типичной для онлайн карт бизнес модели "кто заплатил больше, того и чаще и лучше показали" а не то что искали.

Отрисовка карты происходит с помощью WebGL виджета MapLibre GL JS. Данные загружены с OpenStreetMap, предобработаны в OpenStreetMap H3 базе данных PostGIS и выгружены в parquet файлы.

Информацию по разметки данных вы можете найти в вики OpenStreetMap, либо спросить в комментариях к статье.

Спасибо

Надеюсь что этот поисковик вам пригодится https://igor-suhorukov.github.io

Комментарии (10)


  1. mikegordan
    17.11.2023 09:49

    очень долго выполняются запросы.. минуты 3 на запрос про

    distance <= 1500 and shop='mall'

    И правильность вызывает большие сомнения. Смотрите вокруг Авиапарка большая часть как раз жилых отмечена как неподходящая, сервис выделил зеленым только какие то дома на юго-востоке , бред в общем.

    2) и еще такой вопрос, есть запрос для выбора здания где работают IT компани? Тоесть выбрать места где больше всего скоплений IT компаний , ну или бизнес центров на крайняк

    3) не нашел даже в ваших предыдущих статьях что такое фильтр "опасность" ?


    1. freeExec
      17.11.2023 09:49

      Потому что "Авиапарк" в данных потерялся

      D SELECT building_id, shop, name FROM read_parquet('igor-suhorukov.github.io-main/data/data_*.parquet', union_by_name=True) WHERE name = 'Авиапарк';
      ┌─────────────┬─────────┬─────────┐
      │ building_id │  shop   │  name   │
      │    int64    │ varchar │ varchar │
      ├─────────────────────────────────┤
      │             0 rows              │
      └─────────────────────────────────┘


      1. igor_suhorukov Автор
        17.11.2023 09:49
        +1

        Отвалились мультиполигоны, прикрученные синей изолентой. Ищу как догрузить только эту часть данных


    1. igor_suhorukov Автор
      17.11.2023 09:49
      +2

      3) ищите по строке "опасность" в статье указаной здесь первой. Это действительно быстро

      2) не знаю, поищу как с данными мультиполигонов закончу

      бред в общем.

      У меня встречный вопрос, почему вы неуважительно относитесь к моему труду? Потому что он бесплатный и не покупали подписку на этот сервис и данные достались бесплатно? Спасибо, уважаемый читатель. После этой фразы мне сразу же "захотелось" отвечать на все ваши вопросы.


    1. igor_suhorukov Автор
      17.11.2023 09:49

      distance <= 1500 and shop='mall'
      distance <= 1500 and shop='mall'

      Данные для мультиполигонов догрузил и карту обновил.

      1. и еще такой вопрос, есть запрос для выбора здания где работают IT компани? Тоесть выбрать места где больше всего скоплений IT компаний , ну или бизнес центров на крайняк

      Не интересовался этой темой, так как фокус был на то что нужно для жизни, а не работы в офисе. Сейчас работа в офисе скорее исключение из правил для программистов. Соответственно, в расчитанных POI таких объектов пока не было. Формально при наличии данных должен сработать следующий предикат:

      office in ('it','company','telecommunication')

      очень долго выполняются запросы.. минуты 3 на запрос про

      Посмотрю как в будущем изменить модель данных, чтобы запросы работали быстрее, возможно сохраню предрасчитанные агрегаты по типовым запросам.

      Спасибо что нашли проблему в данных!


  1. freeExec
    17.11.2023 09:49

    Не стоит завязываться исключительно на brand, он появляется если данные вносят с помощью шаблонов, а это не всегда так. Руками не кто бренд не добавляет и уже тем более всякие викидаты и инстаграммы.


    1. igor_suhorukov Автор
      17.11.2023 09:49

      Я готов выслушать вариант как правильно сделать эту часть запроса, чтобы работала всегда на 100%.


      1. mikegordan
        17.11.2023 09:49

        хорошо бы если вы ответили на 2 и 3й пункт (вроде это быстро) )))


        1. AlexGluck
          17.11.2023 09:49

          Я отвечу вам за него. Это опенсорс, вам здесь не рады.


          1. igor_suhorukov Автор
            17.11.2023 09:49

            Я отвечу вам за него.

            — Вы, чего, и конфеты за меня есть будете? — Ага! (c)Двое из ларца

            Это опенсорс, вам здесь не рады.

            Подмена понятий. Причина конкретно случае в другом: когда по-человечески общаются, то и ответить в радость! А с некоторыми товарищами и врагов не надо)