Группа Ленинград в их клипе про ЗОЖ преувеличивала последствия неумелого злоупотребления спортом в угоду зрелищности, но я согласен с ними что ко всему надо подходить с умом, без фанатизма. В Москве у меня есть друзья, которые покупают абонемент на фитнес и ходят туда не только первый и последний месяц его действия и не за пару недель до начала купального сезона.
Если вам важен спорт, то жить рядом с объектами спортивной инфраструктуры это не просто удобство, это основа здорового образа жизни.
Поиск домов
К счастью, данные есть в 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.
Хоть в Москве все отлично со спорт площадками, фитнес центрами, залами для единоборств и игровыми видами спорта, но есть спорт который требует другой географии. Катание на вейкборде за катером или серф на искусственной волне не заменят впечатлений от волн в океане, чистой морской воды и свежего воздуха. То же самое и с горнолыжными склонами у мегаполиса - это спуски с холмов, которые не сравнить с катанием в настоящих горах.
mikelavr
Бегунам и велосипедистам можно посмотреть на карту готового сервиса.
https://connect.garmin.com/modern/popularity-heatmap
https://www.strava.com/heatmap#10.73/37.61404/55.74246/hot/all
igor_suhorukov Автор
Отличное замечание. По тепловым картам GPS треков на новом месте всегда видно где больше всего народа бегает!
ajijiadduh
гармин без логина не показывает
страва блочит рф
не претензия, предупреждение для других
mikelavr
Тогда скриншоты: