diff --git a/backend/routers/water.py b/backend/routers/water.py index c895937..3b4fe5e 100644 --- a/backend/routers/water.py +++ b/backend/routers/water.py @@ -173,7 +173,8 @@ def _water_geoms(elements: list[dict]) -> list[dict]: if not polygons: continue geom = ( - {'type': 'MultiPolygon', 'coordinates': polygons} + # GeoJSON MultiPolygon: [[ring0], [ring1]] — каждый полигон = список колец. + {'type': 'MultiPolygon', 'coordinates': [[p] for p in polygons]} if len(polygons) > 1 else {'type': 'Polygon', 'coordinates': polygons[0]} ) diff --git a/frontend/src/components/SearchMap.jsx b/frontend/src/components/SearchMap.jsx index 99a358e..ccc96c1 100644 --- a/frontend/src/components/SearchMap.jsx +++ b/frontend/src/components/SearchMap.jsx @@ -129,9 +129,9 @@ const SearchMap = ({ tnpLat, tnpLon, maxDistance, zones, waterFeatures }) => { // Слой георекомендаций: водоёмы/болота (полигоны) + ж/д (линии) из /api/v1/water/{case_id}. // Рисуется ПОД зонами, поверх тайлов OSM. - const toLatLngs = (coords) => Array.isArray(coords[0][0]) - ? coords.map((poly) => poly[0].map((c) => [c[1], c[0]])) // MultiPolygon - : coords[0].map((c) => [c[1], c[0]]); // Polygon + const toLatLngs = (coords) => Array.isArray(coords[0][0][0]) + ? coords.map((poly) => poly[0].map((c) => [c[1], c[0]])) // MultiPolygon: poly → внешнее кольцо + : coords[0].map((c) => [c[1], c[0]]); // Polygon: одно кольцо const waterGeoJSON = (waterFeatures || []) .filter((f) => f.layer !== 'railway') .map((f) => ({ feature: f, positions: toLatLngs(f.geom.coordinates) }));