(low) ConceptDrawMap: нарисованный полигон отрисовывается дважды (FeatureGroup-слой + внешний GeoJSON по prop) #1446

Closed
opened 2026-06-15 05:55:44 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: frontend · Файл: frontend/src/components/concept/ConceptDrawMap.tsx:55-63, 146-157

ConceptDrawMap.tsx: onCreated (стр.55-63) добавляет нарисованный layer в FeatureGroup (group.clearLayers(); group.addLayer(layer)) и одновременно вызывает onPolygon(gj.geometry) → parent onChange → parent setPolygon. После этого parent передаёт тот же polygon обратно как prop, и блок {polygon && <GeoJSON .../>} (стр.146-157) рисует ВТОРУЮ копию того же кольца поверх первой. Оба слоя с fillColor #3b82f6, fillOpacity 0.2 и одинаковым контуром (FeatureGroup-layer наследует shapeOptions из L.Draw.Polygon, стр.81-86). Импакт: заливки складываются (~0.36 вместо 0.2), обводка удваивается; путает пользователя относительно «активного» полигона. Данные корректны (одна геометрия). На clear (handleClear → clearTick → group.clearLayers() стр.100 + onChange(null)) обе копии удаляются. Фикс: не добавлять layer в FeatureGroup после рисования (полагаться только на внешний controlled GeoJSON), либо не рендерить controlled GeoJSON пока активен drawn layer.

Почему баг: Нарисованный полигон существует и как layer в FeatureGroup (стр.57-58), и как по внешнему prop (стр.146-156) — оба с fillOpacity 0.2 и одинаковым контуром. Заливки складываются (визуально ~0.36 вместо 0.2), обводка удваивается. Это путает пользователя относительно «активного» полигона; функционально данные корректны (передаётся одна геометрия), поэтому low. На clear обе копии удаляются (clearLayers + onChange(null)), так что утечки слоёв нет.

Как чинить: Не держать две сущности: либо после draw не добавлять layer в FeatureGroup, полагаясь на внешний GeoJSON по prop; либо не рендерить внешний GeoJSON для полигона, который только что нарисован в этой же карте (различать источник: cadastre vs draw).


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

**Severity:** low · **Категория:** frontend · **Файл:** `frontend/src/components/concept/ConceptDrawMap.tsx:55-63, 146-157` ConceptDrawMap.tsx: onCreated (стр.55-63) добавляет нарисованный layer в FeatureGroup (group.clearLayers(); group.addLayer(layer)) и одновременно вызывает onPolygon(gj.geometry) → parent onChange → parent setPolygon. После этого parent передаёт тот же polygon обратно как prop, и блок {polygon && <GeoJSON .../>} (стр.146-157) рисует ВТОРУЮ копию того же кольца поверх первой. Оба слоя с fillColor #3b82f6, fillOpacity 0.2 и одинаковым контуром (FeatureGroup-layer наследует shapeOptions из L.Draw.Polygon, стр.81-86). Импакт: заливки складываются (~0.36 вместо 0.2), обводка удваивается; путает пользователя относительно «активного» полигона. Данные корректны (одна геометрия). На clear (handleClear → clearTick → group.clearLayers() стр.100 + onChange(null)) обе копии удаляются. Фикс: не добавлять layer в FeatureGroup после рисования (полагаться только на внешний controlled GeoJSON), либо не рендерить controlled GeoJSON пока активен drawn layer. **Почему баг:** Нарисованный полигон существует и как layer в FeatureGroup (стр.57-58), и как <GeoJSON> по внешнему prop (стр.146-156) — оба с fillOpacity 0.2 и одинаковым контуром. Заливки складываются (визуально ~0.36 вместо 0.2), обводка удваивается. Это путает пользователя относительно «активного» полигона; функционально данные корректны (передаётся одна геометрия), поэтому low. На clear обе копии удаляются (clearLayers + onChange(null)), так что утечки слоёв нет. **Как чинить:** Не держать две сущности: либо после draw не добавлять layer в FeatureGroup, полагаясь на внешний GeoJSON по prop; либо не рендерить внешний GeoJSON для полигона, который только что нарисован в этой же карте (различать источник: cadastre vs draw). --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.88 · unit U90</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:55:44 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:06 +00:00
Sign in to join this conversation.
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#1446
No description provided.