Группа Ленинград в их клипе про ЗОЖ преувеличивала последствия неумелого злоупотребления спортом в угоду зрелищности, но я согласен с ними что ко всему надо подходить с умом, без фанатизма. В Москве у меня есть друзья, которые покупают абонемент на фитнес и ходят туда не только первый и последний месяц его действия и не за пару недель до начала купального сезона.

Если вам важен спорт, то жить рядом с объектами спортивной инфраструктуры это не просто удобство, это основа здорового образа жизни.

Поиск домов

К счастью, данные есть в OpenStreetMap как для спортивных объектов, так и для жилых многоэтажных домов. Нам для анализа не нужно скачивать данные всей планеты, а можно загрузить лишь Центральный федеральный округ и извлечь из него даннные для Москвы

Проект OSM позволяет пользователям самим редактировать карты в любом из множества доступных редакторов, предоставляет инфраструктуру для совместной работы и распространяет регулярные выгрузки в виде слепка базы проекта в формате PBF/XML.

Запускал импорт данных в openstreetmap_h3 PostgreSQL на Ubuntu, с предустановленными git, docker.io, wget:

mkdir ~/moscow && cd ~/moscow 
wget https://download.geofabrik.de/russia/central-fed-district-latest.osm.pbf
wget https://raw.githubusercontent.com/mapsme/omim/master/data/borders/Russia_Moscow.poly
docker run -rm -it -w /wkd -v $(pwd):/wkd mschilde/osmium-tool osmium extract --polygon Russia_Moscow.poly central-fed-district-latest.osm.pbf -o moscow.osm.pbf

git clone https://github.com/igor-suhorukov/openstreetmap_h3.git
cd openstreetmap_h3 && docker build -t openstreetmap_h3 .
cd postgis_docker-master && docker build -t postgres15_postgis .

cd ~/moscow
docker run -it --rm -w $(pwd) -v $(pwd):/$(pwd) -v /var/run/docker.sock:/var/run/docker.sock openstreetmap_h3:latest -source_pbf $(pwd)/moscow.osm.pbf -result_in_tsv true
docker run --name postgis15-moscow --memory=12g --memory-swap=12g --memory-swappiness 0 --shm-size=1g -v $(pwd)/database:/var/lib/postgresql/data -v $(pwd)/moscow_loc_ways:/input -e POSTGRES_PASSWORD=osmworld -d -p 5432:5432 postgres15_postgis:latest -c checkpoint_timeout='15 min' -c checkpoint_completion_target=0.9 -c shared_buffers='4096 MB' -c wal_buffers=-1 -c bgwriter_delay=200ms -c bgwriter_lru_maxpages=100 -c bgwriter_lru_multiplier=2.0 -c bgwriter_flush_after=0 -c max_wal_size='32768 MB' -c min_wal_size='16384 MB'

После импорта данных подключаемся к базе psql -h 127.0.0.1 -p 5432 -U postgres -d osmworld исоздаем список интересующих нас спортивных объектов. Здесь приведу упрощенный запрос на центроидах геометрии спорт объектов, так же как и для списка зданий:

CREATE TABLE sport_poi AS 
 SELECT id,type,
       h3_8,
       st_x(centre),
       st_y(centre),
       tags
 FROM geometry_global_view
 WHERE tags@>'amenity=>dojo'
  OR tags@>'leisure=>fitness_centre'
  OR tags@>'leisure=>fitness_station'
  OR tags@>'leisure=>golf_course'
  OR tags@>'leisure=>sports_centre'
  OR tags@>'leisure=>pitch'
  OR tags@>'leisure=>stadium'
  OR tags@>'leisure=>swimming_pool'
  OR tags@>'leisure=>track'
  OR tags@>'aerialway=>cable_car'
  OR tags@>'aerialway=>chair_lift'
  OR tags@>'aerialway=>gondola'
  OR tags@>'aerialway=>pylon'
  OR tags@>'aerialway=>station'
  OR tags?'sport'

В запросе спортивных объектов учитываются:

  • Додзё — официальное место обучения любому из японских боевых искусств.

  • Фитнес-центр, оздоровительный клуб или тренажёрный зал с тренажёрами для
    упражнений, занятия фитнесом, место с тренажёрами и/или с танцевальным
    залом, залом для занятием фитнесом. Сюда приходят, чтобы позаниматься
    упражнениями. Также известен как качалка, клуб здоровья или фитнес-клуб.

  • Спортивные уличные тренажёры, воркаут, оборудование для гимнастики или снаряды для уличной физподготовки — сооружение на открытом воздухе, где люди могут выполнять различные физические упражнения.

  • Спортивный центр — отдельное сооружение, где спортивные занятия проходят на закрытой территории. Это может быть здание (крытый спортивный центр), расположенное снаружи (открытый спортивный центр) или сочетающее в себе крытые и открытые спортивные сооружения. В спортивном центре могут быть: плавательные бассейны, спа-салоны, солярий, сауна и/или парилки, спортивные залы, корты для сквоша, фитнесс-центр, студии аэробики, площадки с травяным или искусственным покрытием для футбола, хоккея на траве и другое, а также сопутствующие кафетерии, бары и другие объекты.

  • Стадионы могут представлять собой целый комплекс спортивных сооружений, арен, тренировочных полей и других объектов.

  • Площадка специально отведённых для конкретного вида или нескольких видов спорта, как правило, обозначенных соответствующей разметкой.Примеры: теннисный корт, бейсбольная, баскетбольная площадка.

  • sport как обозначение одного или нескольких видов спорта, в которые можно играть внутри или на каком-либо физическом объекте.

  • Поле для гольфа — территория, на которой играют в гольф.

  • Плавательный бассейн — место, построенное для плавания в качестве развлекательной деятельности или спорта, обычно имеющее форму выкопанного и облицованного бассейна. Они могут находиться на открытом воздухе или внутри зданий.

  • Специальная дорожка для бега, езды на велосипеде и других немоторизованных гонок.

  • Станция, на которой пассажиры могут входить и/или выходить на канатную дорогу (горнолыжный подъемник или фуникулёр).

И список многоэтажных домов у которых указан в адресе номер дома:
CREATE TABLE multi_storey_building AS WITH 
 building_parts_ AS
(
  SELECT building.id,
       building.type,
       part.id part_id,
       part.type part_type,
       part.tags part_tags,
       building.tags,
       area
FROM
  (SELECT *,
          (CASE
               WHEN TYPE='ways'
                    AND ST_IsClosed(geom) THEN st_area(ST_MakePolygon(geom)::geography)
               WHEN TYPE='multipolygon' THEN st_area(geom::geography)
               ELSE 0
           END) area
   FROM geometry_global_view
   WHERE tags?'building'
     AND tags?'building:part'
     AND ST_IsClosed(geom)) part,

  (SELECT *,
          (CASE
               WHEN TYPE='ways'
                    AND ST_IsClosed(geom) THEN ST_MakePolygon(geom)
               ELSE geom
           END) shape
   FROM geometry_global_view
   WHERE tags?'building'
     AND not(tags?'building:part')
     AND ST_IsClosed(geom)) building
WHERE st_contains(shape, part.geom)
),
 building_w_parts AS
  (SELECT id,
          TYPE,
          sum((CASE
                   WHEN part_tags->'building:flats' ~ '^[0-9]+$' THEN part_tags->'building:flats'
                   ELSE NULL
               END)::smallint) flats,
          max((CASE
                   WHEN part_tags->'building:levels' ~ '^\d+(\.\d+)?$' THEN part_tags->'building:levels'
                   ELSE NULL
               END)::real) levels,
          sum(area) area
   FROM building_parts_
   WHERE tags?'addr:housenumber'
   GROUP BY id,type),                                         
 flats_precalc AS
  (SELECT g.id,
          g.type,
          centre,
          (CASE
               WHEN g.tags->'building:levels' ~ '^\d+(\.\d+)?$' THEN g.tags->'building:levels'
               ELSE NULL
           END)::real levels,
          (CASE
               WHEN g.tags->'building:flats' ~ '^[0-9]+$' THEN g.tags->'building:flats'
               ELSE NULL
           END)::smallint flats,
          (CASE
               WHEN g.type='ways'
                    AND ST_IsClosed(g.geom) THEN st_area(ST_MakePolygon(g.geom)::geography)
               WHEN g.type='multipolygon' THEN st_area(g.geom::geography)
               ELSE 0
           END) area
   FROM geometry_global_view g
   WHERE type<>'nodes'
     AND tags->'building' not in --в перечисленных ниже зданиях не живут на постоянной основе
        ('service','garages','industrial','retail','office','roof','commercial','garage','kiosk','warehouse','church',
        'parking','public','shed','hangar','train_station','guardhouse','transportation','terrace','greenhouse','bridge',
        'government','chapel','gazebo','civic','ruins','supermarket','sports_centre','semidetached_house','toilets',
        'sports_hall','clinic','farm_auxiliary','stable','grandstand','bunker','gatehouse','store','temple','ventilation_kiosk',
        'carport','cowshed','barracks','shop','cabin','barn','cathedral','wall','townhouse','manufacture','shelter',
        'fire_station','stadium','stands','sport_hall','theatre','storage_tank','checkpoint','houseboat','abandoned','dovecote','mosque','museum','military','container','observatory','lift','tent','factory','sport','mall','riding_hall','depot',
        'prison','gate','triumphal_arch','water_works','public_building','pavilion','bank','institute','works','collapsed',
        'car_repair','crossing_box','fuel','tree_house','presbytery','yesq','farm','outbuilding','police','porch','sauna',
        'monastery','cinema','tower','boathouse','library','transformer_tower','heat_exchange_station','ice_rink','entrance','construction','transformer')
     AND not(tags?'building:part')),
 building_precalc AS
  (SELECT fp.id,
          fp.type,
          centre,
          coalesce(fp.flats, p.flats) flats,
          coalesce(p.area, fp.area) area,
          coalesce(fp.levels, p.levels) levels
   FROM flats_precalc fp
   LEFT JOIN building_w_parts p ON p.id=fp.id
   AND p.type=fp.type)
SELECT id,
       type,
       st_x(centre),
       st_y(centre),
       levels,
       coalesce(flats, (levels*area*
                          (SELECT avg((flats/levels)/area)
                           FROM flats_precalc
                           WHERE area>0
                             AND flats>0))::smallint) flats
FROM building_precalc
WHERE levels>2;

Как считать пешеходные расстояний я рассказывал в публикации Где 15 минут пешком от дома до метро в Москве. Поскольку это ресурсозатратная операция, REST API бесплатного GraphHopper тут не особо поможет, только in-process вызовы роутера, поэтому нужно писать свою программу для расчета. Перед этим еще ограничил выборку многоэтажных домов только домами в 2км пешком от входа в метро для учета лучшей транспортной доступности жилья.

Расчитаем число спортивных объектов в пешей доступности от жилых домов в Москве:

CREATE TABLE moscow_district AS select tags->'name' name,polygon from multipolygon where tags->'admin_level'='8' and tags->'boundary'='administrative';

CREATE INDEX idx_moscow_district_geometry ON moscow_district USING gist (polygon);

 CREATE TABLE infrastructure_for_sport AS
  select 
     (select name 
      from moscow_district 
      where st_contains(polygon, centre) limit 1) district,
  tags->'addr:street' street, 
  tags->'addr:housenumber' housenumber,  
  totalscore
from (select building_id,building_type,count(*) totalscore
      from calculated_distance where distance<=2000
        group by 1,2) stat 
  inner join  geometry_global_view g 
    on stat.building_id=id and stat.building_type=type 
  inner join multi_storey_building USING(id,type) -- только многоэтажные дома
 order by totalscore desc;

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

select district, street, housenumber,
        totalscore
from 
 (select *, row_number() over (partition by district order by totalscore desc) 
   from infrastructure_for_sport) a 
where row_number=1 and district is not null
order by totalscore desc;

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

Выгрузил результат как GeoJson:

\copy (select json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type', 'Feature','geometry', st_AsGeoJSON(centre)::json,'properties', json_build_object('district',district ,'street',street, 'housenumber',housenumber, 'totalscore', totalscore )))) from (select *, row_number() over (partition by district order by totalscore desc) from infrastructure_for_sport) buildings where row_number=1  and district is not null) to 'best_houses_near_sport.json';

Самые спортивные дома Москвы по районам

Список не включает фильтраций по году постройки дома, типовой проект строения или нет. Просто дома с максимальным балом по доступной пешком в окрестностях спортивной инфраструктуре:

            district             |            street             | housenumber | totalscore 
---------------------------------+-------------------------------+-------------+------------
 Тверской район                  | улица Большая Дмитровка       | 7/5         |       6241
 Пресненский район               | Малый Кисловский переулок     | 7           |       5727
 район Арбат                     | Романов переулок              | 5           |       5595
 Красносельский район            | Сретенский бульвар            | 6/1 с1      |       5434
 Мещанский район                 | Рождественский бульвар        | 11          |       5366
 Басманный район                 | улица Маросейка               | 9 с1        |       5343
 район Хамовники                 | улица Знаменка                | 13 с1       |       5195
 Таганский район                 | Яузский бульвар               | 14/8        |       4840
 район Якиманка                  | улица Серафимовича            | 2/20        |       4439
 район Замоскворечье             | улица Большая Ордынка         | 7           |       4187
 район Беговой                   | Ленинградский проспект        | 2           |       2891
 район Марьина Роща              | улица Сущёвский Вал           | 3/5А        |       2820
 Бутырский район                 | Бутырская улица               | 4           |       2439
 Савёловский район               | Вятская улица                 | 1           |       2395
 Даниловский район               | Большая Серпуховская улица    | 56          |       2365
 Донской район                   | улица Шаболовка               | 32          |       2259
 Гагаринский район               | улица Вавилова                | 72/13       |       2154
 Хорошёвский район               | улица Викторенко              | 2/1         |       2141
 район Дорогомилово              | Большая Дорогомиловская улица | 4           |       2104
 район Сокольники                | Русаковская улица             | 18/20       |       2079
 Академический район             | улица Ивана Бабушкина         | 24          |       2079
 район Черёмушки                 | Нахимовский проспект          | 67 к3       |       2075
 Ломоносовский район             | улица Панфёрова               | 18          |       2073
 Южнопортовый район              | 3-й Крутицкий переулок        | 15          |       2055
 район Аэропорт                  | Ленинградский проспект        | 56          |       2038
 район Сокол                     | Чапаевский переулок           | 12 к3       |       2007
 район Северное Тушино           | улица Героев Панфиловцев      | 2           |       1968
 Тимирязевский район             | Дмитровский проезд            | 1           |       1932
 район Южное Тушино              | бульвар Яна Райниса           | 1           |       1890
 район Митино                    | Митинская улица               | 21          |       1831
 Орехово-Борисово Южное          | Ореховый бульвар              | 20/2        |       1740
 район Зябликово                 | Ореховый бульвар              | 29/49       |       1738
 Обручевский район               | улица Гарибальди              | 20/29 к2    |       1737
 район Орехово-Борисово Северное | улица Генерала Белова         | 33/19       |       1737
 район Марьино                   | Братиславская улица           | 5           |       1669
 район Люблино                   | улица Верхние Поля            | 35 к3       |       1656
 район Преображенское            | Преображенская улица          | 2 к1        |       1650
 район Измайлово                 | Верхняя Первомайская улица    | 51          |       1604
 район Северное Измайлово        | Сиреневый бульвар             | 37/40       |       1579
 район Лефортово                 | Волочаевская улица            | 19          |       1575
 район Восточное Измайлово       | 11-я Парковая улица           | 34          |       1545
 Войковский район                | 1-й Новоподмосковный переулок | 2/1         |       1511
 Алексеевский район              | проспект Мира                 | 124 к3      |       1457
 район Гольяново                 | Чусовская улица               | 2           |       1457
 район Соколиная Гора            | Большая Семёновская улица     | 21          |       1449
 Останкинский район              | улица Кондратюка              | 2           |       1448
 район Богородское               | Краснобогатырская улица       | 79 к3А      |       1417
 Бескудниковский район           | Дмитровское шоссе             | 105 к1      |       1408
 Бабушкинский район              | Енисейская улица              | 34          |       1389
 район Котловка                  | улица Кржижановского          | 27          |       1375
 район Проспект Вернадского      | улица Удальцова               | 1 к1        |       1373
 район Бибирево                  | Шенкурский проезд             | 10          |       1365
 район Щукино                    | улица Маршала Рыбалко         | 1           |       1365
 район Лианозово                 | Алтуфьевское шоссе            | 85          |       1348
 Дмитровский район               | Дмитровское шоссе             | 107 к1      |       1345
 район Восточное Дегунино        | улица 800-летия Москвы        | 14          |       1335
 Головинский район               | Флотская улица                | 28 к1       |       1317
 район Перово                    | Зелёный проспект              | 39 к1       |       1311
 район Кузьминки                 | Волгоградский проспект        | 52 к1       |       1307
 район Коптево                   | улица Космонавта Волкова      | 29          |       1303
 район Текстильщики              | 11-я улица Текстильщиков      | 12          |       1303
 район Коньково                  | Профсоюзная улица             | 102/47      |       1298
 район Раменки                   | проспект Вернадского          | 10 к1       |       1288
 район Северное Медведково       | Сухонская улица               | 9           |       1279
 район Южное Медведково          | Сухонская улица               | 5           |       1266
 район Левобережный              | Фестивальная улица,           | 4           |       1262
 Лосиноостровский район          | улица Лётчика Бабушкина       | 40          |       1260
 район Новогиреево               | Новогиреевская улица          | 39          |       1255
 район Тёплый Стан               | Профсоюзная улица             | 126         |       1242
 район Ховрино                   | Флотская улица                | 7 к2        |       1235
 район Ростокино                 | улица Сергея Эйзенштейна      | 2           |       1233
 район Западное Дегунино         | Коровинское шоссе             | 9 к1        |       1217
 Рязанский район                 | Зеленодольская улица          | 7 к3        |       1209
 Алтуфьевский район              | Костромская улица             | 10          |       1205
 район Свиблово                  | Кольская улица                | 13          |       1178
 район Братеево                  | улица Борисовские Пруды       | 20 к1       |       1154
 район Ивановское                | Свободный проспект            | 11 к1       |       1142
 район Хорошёво-Мнёвники         | улица Маршала Тухачевского    | 21 к1       |       1127
 район Зюзино                    | Азовская улица                | 23          |       1122
 район Выхино-Жулебино           | улица Академика Скрябина      | 7 к1        |       1121
 район Чертаново Центральное     | Кировоградская улица          | 30          |       1120
 район Филёвский Парк            | улица Барклая                 | 5 к4        |       1118
 Нагорный район                  | Симферопольский бульвар       | 15 к5       |       1074
 район Кунцево                   | Полоцкая улица                | 2           |       1071
 район Отрадное                  | Юрловский проезд              | 27          |       1033
 район Вешняки                   | Кетчерская улица              | 12          |       1003
 район Марфино                   | улица Академика Королёва      | 14          |        987
 район Чертаново Южное           | Кировоградская улица          | 42 к1       |        980
 Тропарёво-Никулино              | улица Коштоянца               | 47 к2       |        976
 район Царицыно                  | Кантемировская улица          | 31          |        972
 район Чертаново Северное        | Кировоградская улица          | 10 к1       |        959
 Можайский район                 | улица Маршала Неделина        | 34 к1       |        952
 Ярославский район               | Хибинский проезд              | 26          |        944
 район Крылатское                | Рублёвское шоссе              | 34 к1       |        936
 район Печатники                 | улица Полбина                 | 30          |        920
 район Фили-Давыдково            | Минская улица                 | 5           |        908
 район Ясенево                   | Новоясеневский проспект       | 3           |        882
 район Нагатино-Садовники        | Каширский проезд              | 1/1         |        854
 район Нагатинский Затон         | проспект Андропова            | 19          |        812
 район Покровское-Стрешнево      | Полесский проезд              | 2 к1        |        806
 район Южное Бутово              | Южнобутовская улица           | 36          |        797
 район Москворечье-Сабурово      | Кантемировская улица          | 20 к2       |        794
 район Строгино                  | Строгинский бульвар           | 15          |        787
 район Солнцево                  | улица Богданова               | 26 к3       |        773
 район Косино-Ухтомский          | улица Наташи Качуевской       | 5           |        757
 Нижегородский район             | Подъёмная улица               | 10          |        731
 район Новокосино                | Суздальская улица             | 10 к4       |        730
 район Северное Бутово           | бульвар Дмитрия Донского      | 16          |        709
 район Очаково-Матвеевское       | Озёрная улица                 | 17          |        695
 Ново-Переделкино                | улица Скульптора Мухиной      | 7           |        618
 поселение Внуковское            | улица Анны Ахматовой          | 10          |        573
 поселение Московский            | улица Зелёная Горка           | 1 к3        |        569
 район Бирюлёво Восточное        | 6-я Радиальная улица          | 3 к1        |        543
 район Северный                  | Дмитровское шоссе             | 122Д к4     |        482
 район Некрасовка                | Рождественская улица          | 29 к3       |        475
 поселение Сосенское             | Фитарёвская улица             | 21          |        443
 район Метрогородок              | Открытое шоссе                | 24 к2       |        412
 район Внуково                   | Спортивная улица              | 2/11        |        364
 поселение Воскресенское         | Чечёрский проезд              | 128         |        306

Выгрузка этих домов в виде карты доступна на GitHub.

Хоть в Москве все отлично со спорт площадками, фитнес центрами, залами для единоборств и игровыми видами спорта, но есть спорт который требует другой географии. Катание на вейкборде за катером или серф на искусственной волне не заменят впечатлений от волн в океане, чистой морской воды и свежего воздуха. То же самое и с горнолыжными склонами у мегаполиса - это спуски с холмов, которые не сравнить с катанием в настоящих горах.

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


  1. mikelavr
    20.12.2023 07:57

    Бегунам и велосипедистам можно посмотреть на карту готового сервиса.

    https://connect.garmin.com/modern/popularity-heatmap

    https://www.strava.com/heatmap#10.73/37.61404/55.74246/hot/all


    1. igor_suhorukov Автор
      20.12.2023 07:57

      Отличное замечание. По тепловым картам GPS треков на новом месте всегда видно где больше всего народа бегает!


    1. ajijiadduh
      20.12.2023 07:57

      гармин без логина не показывает

      страва блочит рф

      не претензия, предупреждение для других


      1. mikelavr
        20.12.2023 07:57

        Тогда скриншоты:

        Garmin heatmap
        Garmin heatmap
        Strava heatmap
        Strava heatmap