Когда я ищу квартиру, для меня важно знать не типовой ли это дом "панелька" 60-90х. Одно время пожив в однокомнатной квартире в "Башне Вулыха" я проникся уважением к этим сериям домов советской эпохи по сравнению панельками. Затем пожил в монолитной новостройке с потолками 3.2м, но со слышимостью как в обычном панельном доме 70х.

Атмосфера

Большую часть своей жизни я прожил в типовых хрущёвках и уж поверьте, я их одновременно и люблю и ненавижу. Много теплых воспоминаний из детства: игры в подвалах, на стройках и обшарпанных игровых площадках с качелями и горками. И тогда это было весело, в тех же районах появились друзья с которыми до сих пор рад общаться. Но при возможности выбирать, теперь я не хочу жить в таком жилье.

Если верить википедии, то не все что выглядит как панельный дом - хрущевка. Строительство хрущёвок изменило советскую архитектуру, сделав её преимущественно промышленной. По сравнению со сталинскими домами, которые строились из кирпича, хрущёвки имели меньшие квартиры с простой и функциональной архитектурой. В то же время, по сравнению с многоквартирными деревянными домами, которые так же массово строились в период сталинского правления, хрущёвки по многим параметрам были лучше и помогли решить острую проблему нехватки жилья. Они строились с 1956 года до середины 1970-х. В конце 1960-х годов хрущёвки стали уступать место брежневкам, но до сих пор остаются одним из самых распространённых типов жилья в странах СНГ.

Unreal Engine 5 отлично передает зимнюю атмосферу типового двора в 3D

Технологии

Интересно было бы посмотреть на карте на застройку столицы определенной серией домов.

Сказано - сделано! Добавил в данные карты Москвы тип проекта здания из OpenStreetMap тег design:ref - чтобы поиск теперь работал и для типовых домов. Поскольку типовых проектов в базе достаточно много, то выбор конкретного варианта серии для здания вынес в отдельный выпадающий список "проект здания":

Если интересует только тип здания, то не нужно писать условия на SQL, достаточно выбрать из выпадающего списка значение и нажать "Найти".

Для сложных пользовательских запросов доступна мощь SQL с логическими выражениями во встраеваемой базе данных DuckDB "под капотом" сайта и для запросов вам доступны поля:

distance SMALLINT
categories ENUM( 'atm', 'attraction', 'bank', 'beach', 'beauty', 'children', 'driving', 'eat', 'education', 'emergency', 'entertainment', 'food', 'healthcare', 'housekeeping', 'nightlife', 'outdoor', 'pet', 'pharmacy', 'religion', 'shop', 'shopping', 'ski', 'sport', 'tourism', 'transport', 'viewpoint','_air_quality', '_dangerous', '_industrial', '_mosquitoes', '_noisy_place', '_sad_place', '_socialReEducation', '_specialHealthcare')[]
design_ref VARCHAR
name VARCHAR
amenity VARCHAR
leisure VARCHAR
shop VARCHAR
healthcare VARCHAR
tourism VARCHAR
historic VARCHAR
sport VARCHAR[]
education VARCHAR
religion VARCHAR
office VARCHAR
brand VARCHAR
network VARCHAR
operator VARCHAR

Примеры запросов, которые можно указать для поиска я приводил в статье "Инфраструктура у жилья в столице". Данных в этой базе о пешей доступности важных для жизни объектов достаточно много чтобы понять где мне хочется жить, а где нет. Можно указать расстояние до магазинов, школы и входа в метро/МЦК, до поликлиники или площадки выгула собак, учесть есть ли поблизости торговый центр, а так же жить в стороне от шума и источников загрязнения воздуха.

Теперь можно комбинировать с предикатом для проекта постройки:distance <= 500 and design_ref='Башня Вулыха' and network='Московский метрополитен' and 'transport'=any(categories) или просто выбирать тип проекта дома из списка. Или же группировать разные подтипы проектов домов: design_ref ilike 'II-49%'

Башни Вулыха в центре города в 500м от входа в метро
Башни Вулыха в центре города в 500м от входа в метро

Когда хочется жить не дальше 500м от торгового центра, но не в панельке серии II-49, то нужен такой фильтр:

Если открыть консоль разработчика и вкладку Network, то можно наблюдать процесс, как DuckDB Wasm запрашивает из браузер фрагменты данных с Parquet файлов с сервера, считывая только требуемый для операции диапазон объекта по https. Движок базы данных обладает обширным функционалом и "продвинутыми" техниками работы с данными, несмотря на его небольшой размер скомпилированного кода.

Документация по синтаксису SQL выражений для DuckDB можете изучить по ссылке. Синтаксис позволяет писать более сложные конструкции чем =/ or / and / not. А это значит что можно выразить достаточно сложные условия поиска жилья по вашим предпочтениям. И это будет работать пока DuckDB Wasm хватает памяти для хранения промежуточных результатов запроса.

Для выбора типа дома используется html элемент select id="building_type" значение из которого получаю в JavaScript document.getElementById('building_type').value и для сброса в значение по умолчанию при загрузке страницы сбрасываю value=''.

Запрос к данным в DuckDB Wasm формирую в обработчике ('button_filter').onclick = async() => {}:

     document.getElementById('button_filter').disabled=true;
     try {
           const mainFilter = document.getElementById('cust_filter').value;
           const buildingFilterSrc=document.getElementById('building_type').value;
           const buildingTypeFilter = (mainFilter=='' ? '' :' and ')+(buildingFilterSrc==''?'':'design_ref=\''+buildingFilterSrc+'\'');
           const exceptFilter = document.getElementById('cust_filter_minus').value;
           const query = await conn.query(baseQuery+mainFilter + (buildingFilterSrc==''?'':buildingTypeFilter) + (exceptFilter? ' except '+baseQuery+exceptFilter:''));
           const color=document.getElementById('cust_color').value;

           var newGeo ={"type": "FeatureCollection", "features": []};
           for(const id of query.toArray().map((row) => row.toJSON().id)){
               const building= buildings[id];
               if(building){
                     building.properties.fill=color;
                     newGeo.features.push(building);
               }
           }
           map.getSource('customDs').setData(newGeo);
     } catch(err) {
       alert(err);
     } finally {
       document.getElementById('button_filter').disabled=false;
     }

Общий объем данных для поисковика превысил 350Мб и в этих данных есть дополнения по инфраструктуре в шаговой доступности у жилья.

Итог

Обновленный поиск жилья в Москве на основе данных OpenStreetMap доступен на GitHub Pages: https://igor-suhorukov.github.io/moscow_building_type.html Теперь, по крайней мере, можно взглянуть на столицу с высоты птичьего полета и решить в каких домах хочется жить, с учетом данных построен ли дом по типовому проекту.

Комментарии (2)


  1. Dynasaur
    22.11.2023 19:16

    Такое впечатление, что у статьи нет начала и конца.


    1. igor_suhorukov Автор
      22.11.2023 19:16

      Начало статьи
      Начало статьи
      Конец статьи
      Конец статьи

      Или вы имели ввиду что-то другое?