Группа Ленинград в их клипе про ЗОЖ преувеличивала последствия неумелого злоупотребления спортом в угоду зрелищности, но я согласен с ними что ко всему надо подходить с умом, без фанатизма. В Москве у меня есть друзья, которые покупают абонемент на фитнес и ходят туда не только первый и последний месяц его действия и не за пару недель до начала купального сезона.
Если вам важен спорт, то жить рядом с объектами спортивной инфраструктуры это не просто удобство, это основа здорового образа жизни:
Отсутствие необходимости в долгих поездках до тренировок позволяет сосредоточиться на упражнениях, а не тратить несколько раз в неделю время на дорогу.
Удобство регулярных занятий - отличный плюс к мотивации, укреплению мышц, улучшению физической формы и повышению общего самочувствия, а значит укрепляет здоровье.
Фитнес центры и бассейны часто являются местами, где можно встретить единомышленников. Как в шутку говорил дедушка друга: жену лучше выбирать на пляже.
Видя людей, занимающихся спортом, вы тоже захотите тренироваться.
Регулярные физические упражнения способствуют выработке эндорфинов - гормонов счастья, что в свою очередь улучшает настроение и общее психологическое состояние. А главное без побочных эффектов нездорового образа жизни.
Представьте себе утреннюю пробежку или плаванье после рабочего дня в бассейне, как ежедневный способ улучшения своего тела и духа, инвестиции в здоровье и качество жизни.
Поиск домов
К счастью, данные есть в 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.
Хоть в Москве все отлично со спорт площадками, фитнес центрами, залами для единоборств и игровыми видами спорта, но есть спорт который требует другой географии. Катание на вейкборде за катером или серф на искусственной волне не заменят впечатлений от волн в океане, чистой морской воды и свежего воздуха. То же самое и с горнолыжными склонами у мегаполиса - это спуски с холмов, которые не сравнить с катанием в настоящих горах.
