[P3] POST /concepts отдаёт 422 на многоконтурных участках (MultiPolygon) #2295

Closed
opened 2026-07-03 19:13:54 +00:00 by bot-backend · 1 comment
Collaborator

Найдено при вычитке полного PDF-отчёта (#2259) на многоконтурном участке 66:41:0702017:131.

geometry._parse_polygon (geometry.py:146) жёстко отвергает не-Polygon (ParcelGeometryError: expected Polygon, got MultiPolygon) — при том, что буфер-стадия НИЖЕ уже умеет схлопывать мультиконтур к крупнейшему (geometry.py:263-265). В результате оба пути create_concept (concepts.py: _parcel_centroid_wkt и parse_parcel) падают → HTTP 422 → интерактивный §7 на странице анализа не считается для многоконтурных участков (у ЕГРН таких немало — «Многоконтурный участок» в подвиде).

PDF-оркестратор уже починен на своём уровне (_largest_polygon_geojson в full_report_pdf.py — нормализация к крупнейшему контуру до ConceptInput). Для интерактива фикс надо поднять в сам _parse_polygon (принимать MultiPolygon → max(geoms, key=area) + logger.info) либо в create_concept — тогда и PDF-оркестратор можно будет упростить до одного пути.

Acceptance

  • POST /concepts на 66:41:0702017:131 → 200 с вариантами (сейчас 422).
  • Кнопка «Пересчитать §7» на странице анализа многоконтурного участка работает.
  • Одноконтурные участки — поведение байт-в-байт (regression-тесты generative).

Refs #2259

Найдено при вычитке полного PDF-отчёта (#2259) на многоконтурном участке 66:41:0702017:131. `geometry._parse_polygon` (geometry.py:146) жёстко отвергает не-Polygon (`ParcelGeometryError: expected Polygon, got MultiPolygon`) — при том, что буфер-стадия НИЖЕ уже умеет схлопывать мультиконтур к крупнейшему (geometry.py:263-265). В результате оба пути `create_concept` (concepts.py: `_parcel_centroid_wkt` и `parse_parcel`) падают → **HTTP 422 → интерактивный §7 на странице анализа не считается для многоконтурных участков** (у ЕГРН таких немало — «Многоконтурный участок» в подвиде). PDF-оркестратор уже починен на своём уровне (`_largest_polygon_geojson` в full_report_pdf.py — нормализация к крупнейшему контуру до ConceptInput). Для интерактива фикс надо поднять в сам `_parse_polygon` (принимать MultiPolygon → max(geoms, key=area) + logger.info) либо в `create_concept` — тогда и PDF-оркестратор можно будет упростить до одного пути. ## Acceptance - [ ] POST /concepts на 66:41:0702017:131 → 200 с вариантами (сейчас 422). - [ ] Кнопка «Пересчитать §7» на странице анализа многоконтурного участка работает. - [ ] Одноконтурные участки — поведение байт-в-байт (regression-тесты generative). Refs #2259
Author
Collaborator

Готово (PR #2315, прод-верифицировано)

Живой POST /concepts на 8-контурном MultiPolygon участка 66:41:0702017:131: HTTP 200, 3 варианта (max_area NPV −1.9 млрд / max_insolation −685 млн / balanced −1.3 млрд — совпадают с цифрами PDF-отчёта, который использует ту же нормализацию). Было 422.

Кнопка «Пересчитать §7» зовёт этот же endpoint — интерактивная генерация для многоконтурных участков разблокирована. Polygon-путь байт-в-байт (тест-лок 1e-9), mypy strict чист. Побочно выписан #2316 (пред-существующие mypy-ошибки dxf.py).

## Готово (PR #2315, прод-верифицировано) Живой POST /concepts на **8-контурном** MultiPolygon участка 66:41:0702017:131: **HTTP 200, 3 варианта** (max_area NPV −1.9 млрд / max_insolation −685 млн / balanced −1.3 млрд — совпадают с цифрами PDF-отчёта, который использует ту же нормализацию). Было 422. Кнопка «Пересчитать §7» зовёт этот же endpoint — интерактивная генерация для многоконтурных участков разблокирована. Polygon-путь байт-в-байт (тест-лок 1e-9), mypy strict чист. Побочно выписан #2316 (пред-существующие mypy-ошибки dxf.py).
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#2295
No description provided.