feat(concept): 3D-макет окружения — соседние здания из кадастра в §7 (#2180) #2210

Merged
bot-backend merged 2 commits from feat/massing-neighbors-2180 into main 2026-07-02 19:33:45 +00:00
Collaborator

Summary

  • «Размещение застройки» теперь показывает макет квартала: соседние здания из cad_buildings (НСПД) рендерятся серыми низкополигональными объёмами вокруг участка — и в 3D (экструзия floors×3 м, fallback 6 м, opacity 0.55, тени от солнца-слайдера), и в 2D-плане (нейтральный неинтерактивный слой под корпусами).
  • Backend: GET /parcels/{cad}/neighbor-buildings?radius_m=300 (50..1000) — GeoJSON footprint'ов ST_DWithin по geography (GIST-индекс, EXPLAIN 28 мс на плотнейшем участке ЕКБ, 103 мс на radius 1000), исключая пересекающие сам участок; упрощение геометрии; LIMIT 300 по расстоянию + truncated; 404 только при отсутствии геометрии участка (пустые соседи → честный 200).
  • Frontend: hook useNeighborBuildings (TanStack), отдельная three.js Group с корректным dispose (без дублей при смене варианта), cap 200; standalone /concept без кадастра работает как раньше (enabled=false). Подпись «Соседние здания — контуры и этажность НСПД…» при count>0.
  • api-types.ts регенерирован офлайн-методом codegen-check (дамп app.openapi() + пиненный openapi-typescript).

Test plan

  • backend: 8 тестов endpoint (happy/empty-200/404/422×2/truncated/radius/null-geom), ruff clean, EXPLAIN на прод-БД — индексный план
  • frontend: tsc clean, eslint clean; dispose/дубли Group проверены ревью
  • code-reviewer APPROVE
  • post-deploy: скриншот §7 3D с серым кварталом вокруг участка 66:41:0204016:10

Refs #2180

## Summary - «Размещение застройки» теперь показывает **макет квартала**: соседние здания из `cad_buildings` (НСПД) рендерятся серыми низкополигональными объёмами вокруг участка — и в 3D (экструзия floors×3 м, fallback 6 м, opacity 0.55, тени от солнца-слайдера), и в 2D-плане (нейтральный неинтерактивный слой под корпусами). - Backend: `GET /parcels/{cad}/neighbor-buildings?radius_m=300` (50..1000) — GeoJSON footprint'ов `ST_DWithin` по geography (GIST-индекс, **EXPLAIN 28 мс** на плотнейшем участке ЕКБ, 103 мс на radius 1000), исключая пересекающие сам участок; упрощение геометрии; LIMIT 300 по расстоянию + `truncated`; 404 только при отсутствии геометрии участка (пустые соседи → честный 200). - Frontend: hook `useNeighborBuildings` (TanStack), отдельная three.js Group с корректным dispose (без дублей при смене варианта), cap 200; standalone `/concept` без кадастра работает как раньше (enabled=false). Подпись «Соседние здания — контуры и этажность НСПД…» при count>0. - api-types.ts регенерирован офлайн-методом codegen-check (дамп `app.openapi()` + пиненный openapi-typescript). ## Test plan - [x] backend: 8 тестов endpoint (happy/empty-200/404/422×2/truncated/radius/null-geom), ruff clean, EXPLAIN на прод-БД — индексный план - [x] frontend: tsc clean, eslint clean; dispose/дубли Group проверены ревью - [x] code-reviewer ✅ APPROVE - [ ] post-deploy: скриншот §7 3D с серым кварталом вокруг участка 66:41:0204016:10 Refs #2180
bot-backend added 2 commits 2026-07-02 19:18:21 +00:00
Backend: GET /parcels/{cad}/neighbor-buildings?radius_m=300 → GeoJSON
footprint'ов cad_buildings вокруг участка (ST_DWithin geography, GIST,
EXPLAIN 28мс на плотном участке; NOT ST_Intersects с самим участком;
SimplifyPreserveTopology; LIMIT 300 по расстоянию + truncated; 404 только
при отсутствии геометрии участка). Свойства: floors, height_m (этаж 3 м),
building_name, year_built.

Frontend: hook useNeighborBuildings (TanStack) + серые низкополигональные
экструзии в Massing3DScene (0.55 opacity, fallback 6 м, cap 200, отдельная
Group с корректным dispose) + неинтерактивный слой в 2D-плане под
корпусами; cadNum прокинут из Section7Concept; standalone /concept без
кадастра работает как раньше. Подпись про НСПД-этажность при count>0.
chore(frontend): regen api-types.ts — neighbor-buildings route (#2180)
All checks were successful
CI / backend-tests (pull_request) Successful in 14m37s
CI / frontend-tests (pull_request) Successful in 1m19s
CI / changes (pull_request) Successful in 7s
CI / openapi-codegen-check (pull_request) Successful in 2m14s
87583fef60
bot-backend merged commit a7ad1764c1 into main 2026-07-02 19:33:45 +00:00
bot-backend deleted branch feat/massing-neighbors-2180 2026-07-02 19:33:45 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2210
No description provided.