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
+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: