diff --git a/backend/app/services/cadastre/grid_geometry.py b/backend/app/services/cadastre/grid_geometry.py index 1c1d8728..40c4cb7c 100644 --- a/backend/app/services/cadastre/grid_geometry.py +++ b/backend/app/services/cadastre/grid_geometry.py @@ -46,12 +46,28 @@ def quarter_bbox_3857(db: Session, quarter: str) -> tuple[float, float, float, f if not row or row["xmin"] is None: logger.warning("quarter_bbox_3857: квартал %s не найден в cad_quarters_geom", quarter) return None - return ( + bbox = ( float(row["xmin"]), float(row["ymin"]), float(row["xmax"]), float(row["ymax"]), ) + # Sanity check: cad_quarters_geom имеет ~72% rows с broken micro-precision + # geometry (width <0.01m). Это вызывает useless 1px tiles в WMS и 500 errors + # от NSPD. Реальный квартал ЕКБ имеет width 200-4000м. Skip grid-walk для + # broken — snapshot phase даст 20 per cat, что норм для MVP. + width = bbox[2] - bbox[0] + height = bbox[3] - bbox[1] + if width < 100 or height < 100 or width > 10000 or height > 10000: + logger.warning( + "quarter_bbox_3857: квартал %s broken geom — width=%.2fm height=%.2fm " + "(expected 100-10000m). Grid-walk skipped, only snapshot phase.", + quarter, + width, + height, + ) + return None + return bbox def generate_grid_click_points(