Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Группа Ленинград в их клипе про ЗОЖ преувеличивала последствия неумелого злоупотребления спортом в угоду зрелищности, но я согласен с ними что ко всему надо подходить с умом, без фанатизма. В Москве у меня есть друзья, которые покупают абонимент на фитнес и ходят туда не только первый и последний месяц его действия и не за пару недель до начала купального сезона.
Зачем жить рядом с инфраструктурой для спорта
Если вам важен спорт, то жить рядом с объектами спортивной инфраструктуры это не просто удобство, это основа образа жизни:
Отсутствие необходимости в долгих поездках до тренировок позволяет сосредоточиться на упражнениях, а не тратить несколько раз в неделю время на дорогу.
Удобство регулярных занятий - отличный плюс к мотивации, укреплению мышц, улучшению физической формы и повышению общего самочувствия, а значит укрепляет здоровье.
Фитнес центры и бассейны часто являются местами, где можно встретить единомышленников. Как в шутку говорил дедушка друга: жену лучше выбирать на пляже. Часто видя людей, занимающихся спортом, вы тоже захотите тренироваться.
Регулярные физические упражнения способствуют выработке эндорфинов - гормонов счастья, что в свою очередь улучшает настроение и общее психологическое состояние. А главное без побочных эффектов нездорового образа жизни.
Представьте себе утреннюю пробежку или плаванье после рабочего дня в бассейне, как ежедневный способ совершенствования тела и духа, инвестиции в здоровье и качество жизни.
Но лучше не жить в доме вплотную к стадиону, а то будет как в анекдоте "с бородой":
- Бабушка, вы живете около стадиона "Динамо"?
- Да, да, да-да-да, да-да-да ...
Поиск нужных домов
К счастью, данные есть в OpenStreetMap как для спортивных объектов, так и для жилых многоэтажных домов. Нам для анализа не нужно скачивать данные всей планеты, а можно загрузить лишь регион "Central Federal District" и извлечь из него даннные для Москвы
Проект OSM позволяет пользователям самим редактировать карты в любом из множества доступных редакторов, предоставляет инфраструктуру для совместной работы и распространяет регулярные выгрузки в виде слепка базы проекта в формате PBF/XML.
Запускал импорт данных в 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'
После импорта данных подключаемся к PostgreSQL базе 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'
И список многоэтажных домов у которых указан в адресе номер дома:
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 distance
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;
Самые спортивные дома Москвы по районам
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
Хоть в Москве все отлично со спорт площадками, фитнес центрами, залами для единоборств и игровыми видами спорта, но есть спорт который требует другой географии. Катание на вейкборде за катером или серф на искусственной волне не заменят впечатлений от волн в океане, чистой морской воды и свежего воздуха. То же самое и с горнолыжными склонами у мегаполиса - это спуски с холмов, которые не сравнить с катанием в настоящих горах.