From 10f00e2d2e9b7ec2b758e22edbfd569dcd45914b Mon Sep 17 00:00:00 2001 From: Viktor Antropov Date: Wed, 9 Sep 2026 14:26:20 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20relation=20=D1=81=20=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D0=B8=D0=BC=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D0=BC=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D1=8C=D1=86=D0=BE=D0=BC=20=E2=80=94=20Polygo?= =?UTF-8?q?n=20=D1=81=20depth-3=20coordinates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Второй баг той же семьи: polygons.append(poly['coordinates'][0]) клал ring на уровень полигона — у relation с ОДНИМ outer member'ом coordinates получались depth-2 ([[pair],...]) при type=Polygon. Это 5 крупнейших водных объектов (Камсамольскае возера и др.) — фронтовый toLatLngs строил [[undefined,undefined]...] → Leaflet 'latlngs[0] undefined' → белый экран страницы анализа. Теперь relation собирает список Polygon'ов (coordinates=[ring]) и: 1 кольцо → отдаётся как Polygon; 2+ → MultiPolygon из polygon.coordinates. --- backend/routers/water.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/backend/routers/water.py b/backend/routers/water.py index 3b4fe5e..df3ae16 100644 --- a/backend/routers/water.py +++ b/backend/routers/water.py @@ -165,19 +165,23 @@ def _water_geoms(elements: list[dict]) -> list[dict]: poly = _way_to_polygon({'geometry': mg}) if poly is None: continue - polygons.append(poly['coordinates'][0]) + # Кладём Polygon целиком (coordinates = [ring]), не сам ring — + # иначе у одиночного кольца coordinates получатся depth-2. + polygons.append(poly['coordinates']) area, lat, lon = _polygon_centroid_area(mg) areas.append(area) lats.append(lat) lons.append(lon) if not polygons: continue - geom = ( - # GeoJSON MultiPolygon: [[ring0], [ring1]] — каждый полигон = список колец. - {'type': 'MultiPolygon', 'coordinates': [[p] for p in polygons]} - if len(polygons) > 1 else - {'type': 'Polygon', 'coordinates': polygons[0]} - ) + if len(polygons) == 1: + geom = polygons[0] # {'type': 'Polygon', 'coordinates': [ring]} + else: + # GeoJSON MultiPolygon: собираем полигоны в один Multi. + geom = { + 'type': 'MultiPolygon', + 'coordinates': [p['coordinates'] for p in polygons], + } out.append({'layer': layer, 'name': name, 'geom': geom, 'area_m2': sum(areas), 'lat': sum(lats) / len(lats), 'lon': sum(lons) / len(lons)})