Я бы не жил в Сочи в этих местах…

в 5:56, , рубрики: openstreetmap_h3, postgis, безопасное жилье, Сочи

В этот раз спустимся южнее, в городской округ Сочи и Сириус! Найдем места где могут быть проблемы из-за близости к жилью не самых лучших мест для уютной жизни на побережье Черного Моря и в горах у Красной Поляны.

Я бы не жил в Сочи в этих местах… - 1

Виртуально переместимся в этот курортный город на побережье Черного моря, который известен своим уникальным сочетанием природных красот и мягкого климата:

  • город Сочи окружен великолепной природой. Здесь вы найдете горные хребты, пляжи, леса и водопады. Недалеко горы и национальные парки.

  • Олимпийский парк, где вы найдете множество интересных мест, включая стадионы, арены и музей Олимпийских игр.

  • Сочи славится своими пляжами на Черном Море, а один из самых известных пляжей - "Ривьера".

  • Дендрарий: Этот ботанический сад на побережье Черного моря представляет собой коллекцию уникальных растений со всего мира. Это прекрасное место для прогулок и отдыха.

Также город известен некоторыми риэлторами, пытающимися впарить втридорога неликвид. С тысячами мемов про них в соцсетях.

Готовим данные

Исходные данные я загружал с сайта 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'

openstreetmap_h3 нужен для преобразования дампов OpenStreetMap. Позволяет параллельно загружать их в PostGIS, используя партиционирование данных, либо экспортировать в набор parquet/arrow файлов для Spark/Hadoop. Про этот инструмент подробно рассказывал в серии публикаций на Хабре. Теперь его можно использовать в Docker!

Границу городского округа Сочи для аналитики

извлекаем таким запросом
select geom from geometry_global_view where 
tags->'addr:region'='Краснодарский край' and 
tags->'admin_level'='6' and 
(tags->'name'='городской округ Сочи' or tags->'name'='городской округ Сириус')

Эти полигоны с помощью функции h3_polygon_to_cells(geom,8) можно превратить в геоиндексы. С ними будет быстрее и удобнее работать в запросах к геоданным...

Я бы не жил в Сочи в этих местах… - 2

"Готовим" выборку из расчетов всего ЮФО для дистанций в Сочи и Сириус
create table distance_sochi as 
  select * from distance 
  where h3_8 in (select h3_polygon_to_cells(geom,8) 
                   from geometry_global_view 
                   where tags->'addr:region'='Краснодарский край' and tags->'admin_level'='6' and (tags->'name'='городской округ Сочи' or tags->'name'='городской округ Сириус'));

create table h3_10_stat_sochi 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_sochi 
            where to_id is not null
            group by 1 
            order by 1
       ) geo;

Что учитывается, а что нет

Это моя субъективная модель, которая отговаривает меня жить в определенных местах. Главный её фильтр - расстояние по прямой от жилья на котором учитываются негативные факторы.

В ней не учитываются автомобильные пробки, количество солнечных дней в году, рейтинги, недоступна информация которой сейчас нет и не будет на OpenStreetMap. Если в OSM нет важной информации, например о районах подверженных затоплению, вы можете их обозначить самостоятельно, следуя инструкциям с wiki. OpenStreetMap доступен каждому и похож на принцип редактирования данных на википедии - в основе проекта коллективная правка геоданных. Но учтите, что сообщество борется с вандализмом данных - когда кто-либо начинает искажать действительность или портить существующие данные.

Модель - это всего лишь грубое приближение реальности, тем более что данные о материалах дома и реальное качество строительства не учитываются. Как и года постройки здания, название типового проекта. Не учитывается слышимость из соседних квартир и с улицы. Так же как нерасчитывается затухание шума на деревьях/ на шумозащитном экране у трассы( детальная информация о высоте деревьев и плотности их размещения на OpenStreetMap отсутствует), какие соседи из каких квартир уходят в запой и поколачивают свою семью, где есть агрессивные к другим людям индивиды во дворах и парках, качество водоснабжения и можно ли безопасно пить воду из-под крана. Живут ли в доме тараканы. Работает ли вентиляционная труба или ее замуровал сосед сверху расширив за ее счет объем свей жилплощади. Как часто ломает лифт сосед перегружая его до потолка стройматериалами. Есть ли хулиганы жгущие пластиковые кнопки в лифте и побелку в подъезде, изрисовывают ли стены дома. И многое другое не менее важное для комфорта остается вне модели.

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

Если вам так же как и мне все это не добавляет комфорта в жилье, то продолжим.

Я проверил исходные данные OSM для Сочи в поисках разметки обозначающей опасность:

  1. tags->'hazard' - отмечена одна точка, где есть опасность оползней https://www.openstreetmap.org/node/8616000015

  2. tags->'flood_prone' 3 узла для мест возможного затопления: https://www.openstreetmap.org/node/706309487 https://www.openstreetmap.org/node/3682998930 https://www.openstreetmap.org/node/3682998934

  3. tags->'hazard_prone' ничего не найдено

Сделал это запросом
select id,type,tags from geometry_global_view 
  where (tags->'hazard_prone' is not null or 
         tags->'flood_prone' is not null or 
         tags->'hazard' is not null)  
      and h3_8 in ( select to_short_h3_8(h3_polygon_to_cells(geom,8)::bigint) 
                     from geometry_global_view 
                      where  tags->'addr:region'='Краснодарский край' and 
                             tags->'admin_level'='6' and  
                                (tags->'name'='городской округ Сочи' or 
                                 tags->'name'='городской округ Сириус') 
                  )

to_short_h3_8 и приведение h3index к типу bigint нужно из-за компактного представления индексов h3_8 масштаба 8 в моей базе данных openstreetmap_h3

     id     | type  |                        tags                         
------------+-------+-----------------------------------------------------
  706309487 | nodes | "ford"=>"yes", "flood_prone"=>"yes"
 3682998930 | nodes | "ford"=>"yes", "depth"=>"0.8", "flood_prone"=>"yes"
 3682998934 | nodes | "ford"=>"yes", "depth"=>"0.8", "flood_prone"=>"yes"
 8616000015 | nodes | "hazard"=>"landslide"
(4 rows)

Time: 2797,106 ms (00:02,797)

Совсем не густо! Если вспоминать новости, то в данных должно было быть много мест, рядом с домами у ручьев, где несколько лет назад что смыло или где сошла сель итп. Местное комьюнити OpenStreetMap, обращаюсь к вам, вам есть над чем поработать!!!

Результаты

Выгрузил для вас в geojson для Сочи и Сириус где бы я не жил. Переходите по ссылке, там на карте можно увеличивать масштаб.

Сохраняем geojson файлы
osmworld=# copy (select distinct h3_10, reason, 
                              CASE
                                  WHEN to_type='nodes' THEN 'https://www.openstreetmap.org/node/'||to_id 
                                  WHEN to_type='ways' THEN 'https://www.openstreetmap.org/way/'||to_id 
                                  WHEN to_type='multipolygon' THEN 'https://www.openstreetmap.org/relation/'||to_id 
                              END OSM_URL 
                    from distance_sochi where to_id is not null order by 1) to 'uncomfortable_sochi.tsv'
COPY 27609
Time: 80,586 ms
osmworld=# copy (select json_build_object('type', 'FeatureCollection',
                                           'features', json_agg(json_build_object('type', 'Feature',
                                                                                  'geometry', st_AsGeoJSON(cell)::json, 
                                                                                  'properties', json_build_object('count', count,'h3_10',h3, 'reason', reason)))) 
                  FROM h3_10_stat_sochi) to 'uncomfortable_h3-10_region_sochi.json.geojson';
COPY 1
Time: 52,928 ms

osmworld=# copy ( select json_build_object('type', 'FeatureCollection','features', 
                                            json_agg(json_build_object('type', 'Feature','geometry', st_AsGeoJSON(cell)::json, 
                                                                       'properties', json_build_object('count', count,'h3_10',h3)))) 
                    FROM (
                           select h3_cell_to_boundary_geography(h3) cell,* 
                           from (
                                  select h3_10 h3,count(*) 
                                  from distance_sochi inner join geometry_global_view 
                                  on to_id is null and from_id=id and from_type=type group by 1
                                ) good
                         ) good_h3_10) to 'maybecomfortable_h3-10_region_sochi.json.geojson';
COPY 1
Time: 447,092 ms

Сочи

Сочи
Адлер и округ Сириус

Адлер и округ Сириус
Красная Поляна

Красная Поляна

Можно проверить какие негативные факторы попали в конкретную ячейку при агрегации и изучить их, перейдя по ссылке на OpenStreetMap.

И конечно же поделюсь районами с жилыми зданиями, что не попали в результаты модели и возможно там "неплохо". Это не значит что там хорошо, а значит что в окрестности нет вышеперечисленных негативных факторов и требуется дополнительная информация для уточнения, наскольно комфортно жить здесь. Здесь эта визуализация полезна, так как местные глядя на нее могут сказать "в таком-то гексагоне на самом деле некомфортно жить потому что ..." и факты.

Сочи

Сочи
Адлер и округ Сириус

Адлер и округ Сириус
Красная Поляна

Красная Поляна

Удачи вам в поиске комфортного жилья!

Автор: Игорь

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js