Сегодня я применю свою модель к геоданным города Краснодара. Теплый южный город, мечта многих живущих севернее. Умопомрачительные прогулки по пешеходной улице Красная, кругом зелень и солнышко! Город для аналитики выбран по совету из комментария на Хабре.
В прошлой публикации «Где бы вы точно не жили и не остановились даже на время, если бы знали и выбирали на основе фактов» читатели здорово помогли с новыми идеями в коментариях для настройки модели, которая отговаривает меня жить в определенных местах. Модель получилась достаточно прозрачная для ее чтения и проверки: не использует ChatGPT/Llama 2 и прочие новомодные штуки, и даже без old-school дифур. Она просто считает расстояние по прямой в метрах от жилого здания до тех мест в окрестности, рядом с которыми я не хотел бы постоянно находиться.
Подготовка данных и отличия в параметрах модели
Исходные данные я загружал с сайта Geofabric. Как их загрузить в для анализа
так же как и в прошлый раз
docker run -it --rm -w $(pwd) -v $(pwd):/$(pwd) -v /var/run/docker.sock:/var/run/docker.sock openstreetmap_h3:latest -source_pbf $(pwd)/south-fed-district-latest.osm.pbf -result_in_tsv true docker run --name postgis15-south-fed-district --memory=12g --memory-swap=12g --memory-swappiness 0 --shm-size=1g -v $(pwd)/database:/var/lib/postgresql/data -v $(pwd)/south-fed-district-latest_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'
И дальше работаем с PostGIS базой про которую рассказывал раньше в серии публикаций.
Так как выгрузка включает весь Южный федеральный округ, то нужно выделить только нужную часть данных:
так можно извлечь границы Краснодара
select geom from geometry_global_view where type<>'nodes' and tags->'place'='city' and tags->'name:ru'='Краснодар'
Их с помощью функции h3_polygon_to_cells(geom,8) можно превратить в геоиндексы. Что будет быстрее и удобнее в запросах к данным…
Как я сказал, спасибо всем кто прокоментировал! Учел замечания @sshikov @novoselov@avacha@SnakeSolid@kasiopeiи дополнил запрос:
новыми фильтрами
g.tags->'aeroway'='helipad' or --_шумное место_ g.tags->'landuse'='cemetery' or --_скорбное место_ g.tags->'amenity'='mortuary' or --_скорбное место_ g.tags->'amenity'='funeral_hall' or --_скорбное место_ g.tags->'shop'='pyrotechnics' or --_опасность_ g.tags->'man_made'='storage_tank' or --_опасность_ g.tags->'hazard' is not null or --_опасность_ g.tags->'hazard_prone' is not null or --_опасность_ g.tags->'flood_prone' is not null or --_опасность_ g.tags->'building'='cowshed' or --_качество воздуха_ g.tags->'building'='sty' or --_качество воздуха_ g.tags->'building'='slurry_tank' or --_качество воздуха_ g.tags->'man_made'='chimney' or --_качество воздуха_ (g.tags->'lanes' is not null and g.tags->'lanes'~'^\d+$' and (g.tags->'lanes')::integer>2 --_шумное место_
Напомню, что модель изначально является моим личным мнением о том где жить не комфортно. Добавив немного отсебятины с вертолетной площадкой, цистерной ГСМ и дымовой трубой, просматривая результаты запросов и сверяясь с данными карты. Подумаю еще как это лучше параметризовать, чтобы удобнее было указывать предпочтения. Кому-то и религиозные сооружения мешают жить судя по комментариям, а мне хватает чтобы рядом не звонили в колокол после полуночи и не будили на молитву до утра.
И конечно добавил еще субъективщины и уменьшил допустимое расстояние на 50м. Получилось что негативный фактор для жизни учитывается теперь от 150м, что не так пессимистично, как в прошлой статье. Сделал это глядя на данные и понимая что из доступных сведений все равно не понять реальную интенсивность фактора запаха/звука итп, а жить в городе где-то надо. Далеко от дискомфорта не убежать!
Посчитаем теперь новую статистику
только по Краснодару
create table h3_10_stat as select h3,h3_cell_to_boundary_geography(h3) cell ,count, reason from (select h3_10 h3, count(distinct (to_id,to_type)),array_agg(distinct reason) reason from distance where h3_8 in (select h3_polygon_to_cells(geom,8) from geometry_global_view where type<>'nodes' and tags->'place'='city' and tags->'name:ru'='Краснодар') and to_id is not null group by 1 order by 1 ) geo;
Полный список объектов рядом с которыми я бы не хотел жить
g.tags->'amenity'='waste_transfer_station' or --_качество воздуха_ g.tags->'landuse'='landfill' or --_качество воздуха_ g.tags->'man_made'='spoil_heap' or --_качество воздуха_ g.tags->'man_made'='wastewater_plant' or --_качество воздуха_ g.tags->'amenity'='crematorium' or --_качество воздуха_ (g.tags->'natural'='wetland' and g.tags->'wetland' is distinct from 'mangrove') or --_комары_ g.tags->'power'='substation' or --_промышленность_ g.tags->'power'='generator' or --_промышленность_ g.tags->'power'='plant' or --_промышленность_ g.tags->'building'='industrial' or --_промышленность_ g.tags->'landuse'='industrial' or --_промышленность_ g.tags->'landuse'='quarry' or --промышленность_ g.tags->'aeroway'='runway' or --_шумное место_ g.tags->'aeroway'='helipad' or --_шумное место_ g.tags->'railway'='rail' or --_шумное место_ g.tags->'highway'='primary' or --_шумное место_ g.tags->'highway'='trunk' or --_шумное место_ (g.tags->'lanes' is not null and g.tags->'lanes'~'^\d+$' and (g.tags->'lanes')::integer>2) or--_шумное место_ g.tags->'leisure'='stadium' or --_шумное место_ g.tags->'landuse'='construction' or --_шумное место_ g.tags->'landuse'='cemetery' or --_скорбное место_ g.tags->'amenity'='mortuary' or --_скорбное место_ g.tags->'amenity'='funeral_hall' or --_скорбное место_ g.tags->'shop'='pyrotechnics' or --_опасность_ g.tags->'man_made'='storage_tank' or --_опасность_ g.tags->'hazard' is not null or --_опасность_ g.tags->'hazard_prone' is not null or --_опасность_ g.tags->'flood_prone' is not null or --_опасность_ g.tags->'building'='cowshed' or --_качество воздуха_ g.tags->'building'='sty' or --_качество воздуха_ g.tags->'building'='slurry_tank' or --_качество воздуха_ g.tags->'man_made'='chimney' --_качество воздуха_
Краснодар. Поехали!
Если взять обратное от негатива, то что получится? Мне кажется «неплохо», но нельзя быть уверенным что отлично. Так вот с этим «неплохо» визуально в центре Краснодара лучше чем с «неплохо» в Москве в пределах МКАД:
Если сравнить со столицей в пределах МКАД
Я считаю что рядом с квартирой, ближе чем в 150м не хотел бы видеть, нюхать и слышать влияющее на:
-
качество воздуха: Станция перевалки мусора, Свалка, Террикон, Коровник, Свинарник, Жидкий навоз, Очистка сточных вод, Дымовая труба, Крематорий
-
уровень шума: Стройка, Железнодорожные пути, Взлётно-посадочная полоса, Вертолётная площадка. Автомобильные дороги регионального значения, дороги с более чем 2мя полосами движения, Автомобильные дороги федерального значения, Стадион
-
настроения из песен Егора Летова: Промышленные площади, Подстанции, Генератор, ТЭЦ, Карьер
-
скорбь: Кладбище, Морг, Место для проведения похоронной церемонии
-
опасность: Контейнер, содержащий жидкости или сжатые газы, Магазин пиротехники, Опасность, Территория подвержена стихийным бедствиям, Район или дорога, подверженная затоплению
-
комары: Заболоченые участки
Визуализирую места на карте где бы я не стал жить в Краснодаре:
Отмечу, что я не знаю какое качество и полнота данных на OpenStreetMap для Краснодара. Был в этом городе много раз, но самостоятельно без друзей по городу не разгуливал.
Выгрузил данные в geojson, можете просмотреть их по ссылке. И вам доступна детальная выгрузка какие же факторы попали в каждую ячейку, с сылкой на OSM.
Заключение
Интересно было бы услышать мнения тех кто живет или часто бывает в Краснодаре. Может есть какое-либо не учтенное в данных индустриальное «Око Саурона» или какие-либо не комфортные места в городе, что не указаны в выгрузке.
Достаточно много домов в черте города дальше 150м от негативных факторов, сравнивая с данными той же модели в столице. В следующей публикации пройдемся шестигранниками агрегации по жилью у побережья.
UPD: Судя по коментариям в статье и отзывам друзей в Краснодаре на OpenStreetMap не размечены данные о реальном состоянии города необходимые для оценки по этой модели. Проблема с полнотой и правильностью исходных данных на OSM.
ссылка на оригинал статьи https://habr.com/ru/articles/761482/
Добавить комментарий