feat(map): add universal subject and station search

This commit is contained in:
Codex
2026-07-25 15:37:53 +03:00
parent eaecce9f56
commit a8c8bfd89a
13 changed files with 819 additions and 33 deletions
+11
View File
@@ -104,6 +104,17 @@ slot `reference-points`. Их три presentation profiles (`Метро`, `Во
`Станции РЖД`) являются живыми каноническими Inspector sections: приложение
может менять высоту, размер, label и LOD, не создавая provider-specific UI.
Центральный Map Toolbar содержит template-owned универсальный поиск. В
закрытом состоянии это три круглых действия; при открытии общий pill
симметрично расширяется, действия остаются слева, а справа появляется
search-field и список результатов. Индекс строится по domain subjects,
presentation label fields и разрешённым Data Product projections. Компонент не
принимает provider payload и использует renderer entity id только как
внутренний адрес camera adapter. Локальные совпадения появляются сразу; явный
Enter при отсутствии совпадения разрешает один точный reference-name lookup
через Map Gateway, после которого камера сохраняет композицию и переносится к
контрактным координатам результата.
Приложение контролирует `rect`, `maximized`, видимость, active-state и `zIndex`. Компонент владеет pointer/keyboard-механикой перемещения и изменения размера, кнопками maximize/restore и close, а также повторно ограничивает геометрию при изменении размеров workspace через `ResizeObserver`. Опциональный `autoHeight` подгоняет высоту под живое содержимое и сжимает её обратно, не выходя за нижнюю границу workspace. Родительский bounds-контейнер должен быть позиционированным и обрезать содержимое (`position: relative; overflow: hidden`).
Окно предназначено для вспомогательных камер, инструментов и сопоставляемых представлений внутри сцены. Modal workflow, подтверждение и viewport-level Inspector по-прежнему используют `Window`.
+34 -4
View File
@@ -72,7 +72,30 @@ subjects. Выбор subject в списке открывает его карт
композицию камеры к точке. Адаптер повторяет проверенную механику legacy
MMAP/AIS: сохраняет `heading`, `pitch`, `roll` и смещение камеры относительно
центра viewport; длительность перелёта для текущего канонического workflow —
`2.1 s`.
`0.45 s`.
Кнопка поиска разворачивает центральный Toolbar симметрично, оставляя три
системных действия слева и открывая единое поле справа. Поиск не знает Gelios,
OSM или Cesium: он строит локальный индекс по всем подключённым map subjects.
Для primary binding индексируются стабильный `sourceId`, label fields
presentation profile и только scalar-значения из явного `fieldProjection`.
Joined aspect может добавить aliases к существующему primary subject только
из своей собственной разрешённой projection; отдельной map entity он не
создаёт. Поэтому IMEI или другой hardware identifier начинает находить объект
только после появления в авторизованной restricted projection и никогда не
показывается отдельным значением в строке результата. Raw payload,
непроецированные поля, credentials и provider endpoint индексироваться не
могут. Выбор результата переводит `map.selection` к стабильному domain subject,
а transient renderer entity id используется только внутри adapter для
анимации камеры.
Индекс текущих Application bindings и уже материализованных reference facts
обновляется интерактивно. Если локального совпадения нет, Enter выполняет через
Map Gateway точный поиск названия станции в OSM. Это не provider-specific ветка
Foundry и не autocomplete: Gateway возвращает тот же нормализованный
`map.station|map.terminal` contract. Для удалённого результата adapter делает
перелёт по контрактным координатам; новый viewport затем штатно материализует
spatial cell. Частичные строки не создают сетевых запросов на каждый символ.
Facet-фильтры поддерживают мультивыбор: OR внутри одного facet и AND между facets. Missing facet означает отсутствие ограничения, а явно пустой список — ноль совпадений. Отжатие последнего chip не включает `Все`; `Все` включается и выключается только явным кликом. Переключение фильтра не двигает камеру, обзор выполняется отдельным действием.
@@ -93,9 +116,16 @@ OSM/approved seed → Map Gateway spatial cache → map.station | map.terminal
payload, upstream endpoint, credentials и произвольные tags в Foundry не
попадают. Начальный snapshot Москвы получен из legacy L1 MMAP как donor и
разделён на три категории: `metro`, `railway_station`,
`railway_terminal`. За пределами snapshot Map Gateway может последовательно
загрузить spatial cells из OSM и сохраняет нормализованный результат в
persistent cache; повторный viewport читается локально.
`railway_terminal`. За пределами snapshot Map Gateway загружает spatial cells
из OSM через bounded queue: одновременно исполняются не более двух upstream
запросов, их старты сглаживаются, одинаковые inflight cells дедуплицируются, а
нормализованный результат атомарно сохраняется в persistent cache. Частичный
viewport автоматически повторяет только отсутствующие cells с backoff;
повторный готовый viewport читается локально.
Русское имя `name:ru` имеет приоритет перед общим `name`. Временная
недоступность Gateway не стирает последний уже проверенный browser snapshot;
server status показывает только безопасный код ошибки, состояние очереди и
время, не раскрывая upstream endpoint.
Page Layout хранит три независимых reference bindings: