(medium) NspdEngineeringNearbyBlock.tsx: дедуп label+round(distance) пропускает дубли — расстояния меряются до разных опорных точек #1462

Closed
opened 2026-06-15 05:56:01 +00:00 by bot-backend · 1 comment
Collaborator

Severity: medium · Категория: data-integrity · Файл: frontend/src/components/site-finder/NspdEngineeringNearbyBlock.tsx:46-53

NspdEngineeringNearbyBlock.tsx:46-53 — дедуп-ключ ${r.label}|${Math.round(r.distanceM)}. distanceM из двух источников меряется до РАЗНЫХ опорных точек: analyze (nearby.distance_m) — до ST_Centroid (quarter_dump_lookup.py:460/476), CP (distance_to_boundary_m) — до boundary (line 1048/1064/1101). Для одного физического сооружения центроид-дистанция и граница-дистанция различаются (на крупном участке — десятки метров), округление до целого метра разницу не сглаживает → ключи не совпадают → одна и та же ТП/ЛЭП в таблице дважды с разными расстояниями. Чинить: дедупить по стабильному ID сооружения (cad_num из props CP-структур, см. line 1100) либо нормализовать обе дистанции к одной опорной точке.

Почему баг: Подтверждено: SQL analyze считает ST_Distance до ST_Centroid, а CP-summary/structures отдаёт distance_to_boundary_m (до boundary). label у одного объекта одинаков, distance — нет. Округление до целого метра не сглаживает разницу центроид↔граница. Итог — двойной счёт строк и противоречивые расстояния для одного объекта.

Как чинить: Дедуп по стабильному идентификатору (cad_num/object id) вместо label+distance; либо приводить обе дистанции к одной опорной точке (boundary) перед мёржем и допускать дельту ±N м в ключе.


deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U95

**Severity:** medium · **Категория:** data-integrity · **Файл:** `frontend/src/components/site-finder/NspdEngineeringNearbyBlock.tsx:46-53` NspdEngineeringNearbyBlock.tsx:46-53 — дедуп-ключ `${r.label}|${Math.round(r.distanceM)}`. distanceM из двух источников меряется до РАЗНЫХ опорных точек: analyze (nearby.distance_m) — до ST_Centroid (quarter_dump_lookup.py:460/476), CP (distance_to_boundary_m) — до boundary (line 1048/1064/1101). Для одного физического сооружения центроид-дистанция и граница-дистанция различаются (на крупном участке — десятки метров), округление до целого метра разницу не сглаживает → ключи не совпадают → одна и та же ТП/ЛЭП в таблице дважды с разными расстояниями. Чинить: дедупить по стабильному ID сооружения (cad_num из props CP-структур, см. line 1100) либо нормализовать обе дистанции к одной опорной точке. **Почему баг:** Подтверждено: SQL analyze считает ST_Distance до ST_Centroid, а CP-summary/structures отдаёт distance_to_boundary_m (до boundary). label у одного объекта одинаков, distance — нет. Округление до целого метра не сглаживает разницу центроид↔граница. Итог — двойной счёт строк и противоречивые расстояния для одного объекта. **Как чинить:** Дедуп по стабильному идентификатору (cad_num/object id) вместо label+distance; либо приводить обе дистанции к одной опорной точке (boundary) перед мёржем и допускать дельту ±N м в ключе. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U95</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:56:01 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:08 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: frontend/src/components/site-finder/NspdEngineeringNearbyBlock.tsx:46-53 — дедуп-ключ `${r.label}|${Math.round(r.distanceM)}`. distanceM берётся из двух источников: analyze → item.distance_m (стр. 28), CP → s.distance_to_boundary_m (стр. 39). Бэкенд: analyze считает ST_Distance(..., ST_Centroid(ST_GeomFromText(:wkt))) — до центроида (backend/app/services/site_finder/quarter_dump_lookup.py:456); CP считает ST_Distance(..., ST_GeomFromText(:wkt)::geography) — до полной геометрии участка/границы и пишет в distance_to_boundary_m (quarter_dump_lookup.py:1036-1044, 1096).

Корень: Дистанции меряются до РАЗНЫХ опорных точек (центроид vs граница участка). Для одного физического сооружения значения различаются (на крупном участке — десятки метров), округление до целого метра разницу не сглаживает → ключи label|round(distance) не совпадают → одна ТП/ЛЭП попадает в таблицу дважды с разными расстояниями.

Что править:

  • Дедупить по стабильному ID сооружения. cad_num доступен в CP-структурах (quarter_dump_lookup.py:1095 пишет props.get("cad_num")); проверить наличие аналога в nearby (analyze) и ключевать им, с фолбэком на label при отсутствии ID.
  • Либо привести обе дистанции к одной опорной точке (boundary) перед мёржем и допускать дельту ±N м в ключе.

Что посмотреть:

  • Код: NspdEngineeringNearbyBlock.tsx:24-53; quarter_dump_lookup.py:456 (analyze→centroid), :1036-1044, 1095-1096 (CP→boundary, cad_num); типы NspdEngineeringNearby (frontend/src/types/nspd.ts) — проверить, есть ли cad_num в analyze-shape.
  • Vault: domains/ui/components/Component_SiteFinder_Page.md (NspdEngineeringNearbyBlock).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `frontend/src/components/site-finder/NspdEngineeringNearbyBlock.tsx:46-53` — дедуп-ключ `` `${r.label}|${Math.round(r.distanceM)}` ``. `distanceM` берётся из двух источников: analyze → `item.distance_m` (стр. 28), CP → `s.distance_to_boundary_m` (стр. 39). Бэкенд: analyze считает `ST_Distance(..., ST_Centroid(ST_GeomFromText(:wkt)))` — до центроида (`backend/app/services/site_finder/quarter_dump_lookup.py:456`); CP считает `ST_Distance(..., ST_GeomFromText(:wkt)::geography)` — до полной геометрии участка/границы и пишет в `distance_to_boundary_m` (`quarter_dump_lookup.py:1036-1044, 1096`). **Корень:** Дистанции меряются до РАЗНЫХ опорных точек (центроид vs граница участка). Для одного физического сооружения значения различаются (на крупном участке — десятки метров), округление до целого метра разницу не сглаживает → ключи `label|round(distance)` не совпадают → одна ТП/ЛЭП попадает в таблицу дважды с разными расстояниями. **Что править:** - Дедупить по стабильному ID сооружения. `cad_num` доступен в CP-структурах (`quarter_dump_lookup.py:1095` пишет `props.get("cad_num")`); проверить наличие аналога в `nearby` (analyze) и ключевать им, с фолбэком на label при отсутствии ID. - Либо привести обе дистанции к одной опорной точке (boundary) перед мёржем и допускать дельту ±N м в ключе. **Что посмотреть:** - Код: `NspdEngineeringNearbyBlock.tsx:24-53`; `quarter_dump_lookup.py:456` (analyze→centroid), `:1036-1044, 1095-1096` (CP→boundary, cad_num); типы `NspdEngineeringNearby` (`frontend/src/types/nspd.ts`) — проверить, есть ли `cad_num` в analyze-shape. - Vault: `domains/ui/components/Component_SiteFinder_Page.md` (NspdEngineeringNearbyBlock).
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#1462
No description provided.