В шедевральном мультфильме "Падал прошлогодний снег" строгая, но авторитетная жена послала мужика за ёлкой в лес. Главный герой же не особо сконцентрирован на основной цели своей предновогодней прогулки и отвлекался по пути на все что только можно. Представим теперь, через 40 лет их дом попал под программу реновации, а они переехали почти в центр Москвы и живут теперь в башне типовой советской постройки. И отправила жена его, в этот раз со списком покупок к Новому году.
Как и демотивированный программист, мужик подвержен прокрастинации. Поручение не выполнил и бесцельно обошел все что представляет хоть какой-то интерес в радиусе 1.5км от квартиры в башне Вулыха.
Как "готовить" открытые данные OpenStreetMap я рассказывал в "Где 15 минут пешком от дома до метро в Москве и как различать панельные дома…", не будем перед праздником распыляться в деталях. На этот раз для расчета дистанций нужны только дома построенные по типовому проекту "башня Вулыха":
create table focus_on_building as
select id,type
from geometry_global_view
where tags->'design:ref'='Башня Вулыха';
Проект дома в виде башни подходит сказку сказывать - он обычно одноподъездный и пешеходные пути от входа в здание до POI в окрестностях получаются почти в форме снежинок. А для людей живших в эпоху СССР это были одни из самых комфортных квартир из типовых новостроек.
Скоро сказка сказывается, да не скоро код пишется. Библиотека для расчета расстояний GraphHopper умеет выдавать маршрут в виде ломаных линий, а мы легко можем превратить ее объект в строку WKT (Well-known text representation of geometry)
String path = bestRoute.getPoints().toLineString(false).toString();
И при сохранении расчитанного маршрута в таблицу PostGIS:
osmworld=# \d footpath_distance
Column | Type |
---------------+---------------------------|
building_id | bigint |
building_type | table_reference |
poi_id | bigint |
poi_type | table_reference |
distance | geometry(LineString,4326) |
GraphHopper маршрут из WKT легко превращается в линию:
ST_SetSRID(ST_GeomFromText(path),4326)::geometry(LineString,4326)
Можно добавить еще больше зимней сказки, если приближение окрестностей делать шестигранниками геоиндексов H3 H_3_CORE.gridDistance( centreIdx, H_3_CORE.latLngToCell(ghPoint.lat, ghPoint.lon,8))<MAX_DISK_DISTANCE
. Сходство пешеходных дистанций вокруг дома со снежинкой-изохроной будет ближе.
В данных OSM столицы оказалось 293 башни Вулыха, так что возможно он гулял в других окрестностях:
Выгружу данные в GeoJSON и поделюсь с вами:
\copy (select json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type', 'Feature','geometry', st_AsGeoJSON(path)::json))) from (select distance path from footpath_distance) fp) to '~/moscow_snowflake.json';
Пока со стороны кажется, что в этом нет особой практической пользы, кроме предновогоднего настроения. Но это только кажется? До встречи в новом году, будет интереснее!
Если вы ищете только полезную информацию, то весь год я публиковал здесь модели "без цензуры" и данные полезные для поиска жилья, вот лишь некоторые из них:
Где бы вы точно не жили и не остановились даже на время, если бы знали и выбирали на основе фактов
Я бы не жил в Сочи в этих местах…
Поиск удобных мест для жизни в Москве на GitHub Pages с помощью DuckDB в браузере
А начинался этот год с того что я поделился своим проектом Как поместить весь мир в обычный ноутбук: PostgreSQL и OpenStreetMap. и выступал на PGConf.Russia 2023 перед дружелюбной аудиторией специалистов по PostgreSQL. За год я получил море практики в работе с данными OpenStreetMap, а также выиграл джекпот "поисковой деоптимизации". Покинул привычную "тепличную" обстановку офиса чтобы набраться нового для себя опыта и научиться новым навыкам, необходимым чтобы выжить в изменяющейся реальности, где со стороны может казаться что "пошел за ёлкой, а уже продает шкуру зайца".
Уважаемые программисты и сочувствующие нам читатели, поздравляю всех с наступающим Новым годом!