Карта в карточке игры показывала полигон района — единственную геометрию, до которой у tradein был доступ. Улицы живут в базе gendesign, foreign table и гранта на них не было. Мост по образцу соседей (v_tradein_cad_buildings / v_tradein_osm_poi_ekb): gendesign 195 — вьюха v_tradein_osm_roads_ekb (highway + water) с GRANT В ТОМ ЖЕ ФАЙЛЕ (после #3227 грант отдельной миграцией теряется при пересоздании); tradein 281 — foreign table gendesign_osm_roads_ekb плюс колонки street_name / street_scheme в landing_showcase_deals. Пересчёт витрины кладёт в строку УЖЕ СПРОЕЦИРОВАННЫЕ SVG-пути окна 840x840 м вокруг центра улицы. Проекция — та же равнопромежуточная с cos(широты), что в export_ekb_districts_svg.py; второй в проекте нет. Замер 2026-08-29: GeoJSON того же окна 7-8 КБ на строку, схема — 2.8-2.9 КБ. ЧТО ДАННЫЕ ВЫДЕРЖИВАЮТ, И НИ СЛОВОМ БОЛЬШЕ · Это УЛИЦА, а не дом: deals.address уровня улицы, номер дома у 2.7% сделок. В схеме намеренно НЕТ координат окна и констант проекции — точку дома по ней нельзя поставить даже случайно. Это замок, а не забывчивость. · Зданий нет: cad_buildings — 18 307 контуров на город, в плотном центре 51 здание на радиус 450 м, где их в разы больше. Нарисованная застройка заявляла бы полноту, которой в данных нет. · Улицы — фильтрованная выгрузка «источников шума»: именованные покрыты хорошо, дворовые и служебные проезды отсутствуют. · Улица сматчилась у 550 названий из 654 — 31 410 сделок из 34 021 (92.3%). Остальным street_scheme = NULL, и это штатно: фронт показывает район, который для этого и оставлен. · Перекрёсток («Челюскинцев/Шейнкмана») берём первой улицей: таких адресов три на 34 021 сделку, и обе улицы одинаково верны на уровне улицы. · Наличие схемы НА ОТБОР СТРОК НЕ ВЛИЯЕТ — то же правило, что запрещает отбор по величине ошибки: иначе витрина показывала бы не работу оценщика, а те 92% адресов, что удобно легли на OSM. Тесты (каждый сломан вручную и покраснел): нормализация на реальных адресах включая ё/е и «8 Марта»; недоступная вьюха и упавший запрос дают None, а не исключение; схема не раздувается — потолок в байтах на реальной плотности плюс прямая проверка округления до 0.1.
57 lines
4.1 KiB
PL/PgSQL
57 lines
4.1 KiB
PL/PgSQL
-- 195_tradein_osm_roads_view.sql
|
||
-- Улицы ЕКБ на витрину сделок МЕРЫ: сторона gendesign (PR 1 из 2).
|
||
--
|
||
-- Карточка игры на лэндинге показывала ПОЛИГОН РАЙОНА — единственную геометрию,
|
||
-- которая у tradein была. Улицы живут здесь, в `osm_noise_sources_ekb`, а у
|
||
-- tradein нет ни foreign table, ни гранта. Эта миграция открывает вьюху ровно
|
||
-- по образцу соседей (`v_tradein_cad_buildings`, `v_tradein_osm_poi_ekb`,
|
||
-- 185_tradein_osm_poi_view.sql): плоский срез нужных колонок + GRANT SELECT
|
||
-- уже существующей роли `tradein_fdw_reader` (100_tradein_fdw_role.sql).
|
||
-- Новых ролей и user mapping здесь нет.
|
||
--
|
||
-- ГРАНТ СТОИТ РЯДОМ С CREATE, В ЭТОМ ЖЕ ФАЙЛЕ — И ЭТО НЕ СТИЛЬ. 2026-08-29
|
||
-- (#3227) объект пересоздали, а GRANT жил отдельной миграцией и потерялся:
|
||
-- пересоздание снимает права молча, и чтение с той стороны падает на
|
||
-- `permission denied`. То же было с `ekb_districts_geom` (194) и
|
||
-- `mv_quarter_price_index` (188). Кто будет менять эту вьюху — меняйте файл
|
||
-- целиком, вместе с грантом.
|
||
--
|
||
-- ЧТО В СРЕЗЕ И ЧЕГО В НЁМ НЕТ (замер на проде 2026-08-29):
|
||
-- * 10 025 линий, 1377 различных названий улиц. Выгрузка собиралась как
|
||
-- «источники шума», поэтому именованные улицы покрыты хорошо, а дворовые
|
||
-- проезды и служебные ОТСУТСТВУЮТ. Потребитель обязан это знать: схема из
|
||
-- этих данных — улицы района, а не полная уличная сеть.
|
||
-- * `source_type IN ('highway','water')` — только то, что рисуется на схеме.
|
||
-- Железные дороги, ЛЭП, трубопроводы, подстанции и промзона (ещё ~4 400
|
||
-- строк) сюда НЕ едут: на карточке 320 px они дают шум, а не смысл.
|
||
-- * ЗДАНИЙ ЗДЕСЬ НЕТ И НЕ БУДЕТ. `cad_buildings` — 18 307 контуров на весь
|
||
-- город; в плотном центре это 51 здание на радиус 450 м, где их в разы
|
||
-- больше. Нарисованная застройка заявляла бы полноту, которой в данных
|
||
-- нет, и показывала бы пустые кварталы там, где стоят дома.
|
||
--
|
||
-- Идемпотентна: CREATE OR REPLACE VIEW + повторяемый GRANT.
|
||
|
||
BEGIN;
|
||
-- Конвенция проекта (#2752). CREATE OR REPLACE VIEW и GRANT берут лок на объект;
|
||
-- ждать его выдачи за чужой сессией — значит собрать очередь перед приложением.
|
||
SET LOCAL lock_timeout = '5s';
|
||
|
||
CREATE OR REPLACE VIEW v_tradein_osm_roads_ekb AS
|
||
SELECT
|
||
name,
|
||
road_class,
|
||
geom
|
||
FROM osm_noise_sources_ekb
|
||
WHERE source_type IN ('highway', 'water');
|
||
|
||
GRANT SELECT ON v_tradein_osm_roads_ekb TO tradein_fdw_reader;
|
||
|
||
COMMENT ON VIEW v_tradein_osm_roads_ekb IS
|
||
'FDW-источник для tradein-mvp: улицы и вода ЕКБ для схемы улицы на витрине '
|
||
'сделок лэндинга МЕРЫ. Срез osm_noise_sources_ekb по source_type '
|
||
'IN (highway, water) — 10 025 линий, 1377 названий. Выгрузка фильтрованная '
|
||
'(«источники шума»): дворовых и служебных проездов в ней нет. Зданий нет '
|
||
'намеренно, см. шапку 195_tradein_osm_roads_view.sql. GRANT живёт в том же '
|
||
'файле — пересоздание вьюхи снимает права молча (#3227).';
|
||
|
||
COMMIT;
|