Pull to refresh

Где бы я не жил в Краснодаре

Level of difficultyEasy
Reading time6 min
Views9K

Сегодня я применю свою модель к геоданным города Краснодара. Теплый южный город, мечта многих живущих севернее. Умопомрачительные прогулки по пешеходной улице Красная, кругом зелень и солнышко! Город для аналитики выбран по совету из комментария на Хабре.

В прошлой публикации "Где бы вы точно не жили и не остановились даже на время, если бы знали и выбирали на основе фактов" читатели здорово помогли с новыми идеями в коментариях для настройки модели, которая отговаривает меня жить в определенных местах. Модель получилась достаточно прозрачная для ее чтения и проверки: не использует 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) можно превратить в геоиндексы. Что будет быстрее и удобнее в запросах к данным...

Красным выделены границы Краснодара из OpenStreetMap
Красным выделены границы Краснодара из OpenStreetMap

Как я сказал, спасибо всем кто прокоментировал! Учел замечания @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м радиус влияния и те же фильтры
Для Москвы я пересчитал метрики с теми же параметрами что и в Краснодаре - 150м радиус влияния и те же фильтры

Я считаю что рядом с квартирой, ближе чем в 150м не хотел бы видеть, нюхать и слышать влияющее на:

Визуализирую места на карте где бы я не стал жить в Краснодаре:

Красные ячейки - негативные факторы, зеленые контуры - таких факторов нет в радиусе 150м
Красные ячейки - негативные факторы, зеленые контуры - таких факторов нет в радиусе 150м

Отмечу, что я не знаю какое качество и полнота данных на OpenStreetMap для Краснодара. Был в этом городе много раз, но самостоятельно без друзей по городу не разгуливал.

Выгрузил данные в geojson, можете просмотреть их по ссылке. И вам доступна детальная выгрузка какие же факторы попали в каждую ячейку, с сылкой на OSM.

Заключение

Дорожная развязка на выезде из спального района Краснодара в светлом будущем.
Дорожная развязка на выезде из спального района Краснодара в светлом будущем.

Интересно было бы услышать мнения тех кто живет или часто бывает в Краснодаре. Может есть какое-либо не учтенное в данных индустриальное "Око Саурона" или какие-либо не комфортные места в городе, что не указаны в выгрузке.

Достаточно много домов в черте города дальше 150м от негативных факторов, сравнивая с данными той же модели в столице. В следующей публикации пройдемся шестигранниками агрегации по жилью у побережья.

UPD: Судя по коментариям в статье и отзывам друзей в Краснодаре на OpenStreetMap не размечены данные о реальном состоянии города необходимые для оценки по этой модели. Проблема с полнотой и правильностью исходных данных на OSM.

Tags:
Hubs:
Total votes 12: ↑9 and ↓3+6
Comments46

Articles