diff --git a/data/sql/83_cad_parcels_geom.sql b/data/sql/83_cad_parcels_geom.sql new file mode 100644 index 00000000..78f0a7e2 --- /dev/null +++ b/data/sql/83_cad_parcels_geom.sql @@ -0,0 +1,26 @@ +-- 83_cad_parcels_geom.sql +-- Context : хранение геометрии участков (4-part cad: XX:YY:ZZZZZZZ:NN) из NSPD (thematic_id=1). +-- По аналогии с cad_quarters_geom (3-part cad). +-- Dependency: PostGIS extension уже установлен (используется cad_quarters_geom, cad_buildings). +-- Deploy order: standalone, нет FK-зависимостей от других таблиц. +-- Идемпотентность: безопасно повторно запускать (IF NOT EXISTS). + +BEGIN; + +CREATE TABLE IF NOT EXISTS cad_parcels_geom ( + cad_num TEXT PRIMARY KEY, -- 4-part cad: 66:41:0204016:10 + geom GEOMETRY(Geometry, 4326) NOT NULL, -- Polygon | MultiPolygon + raw_props JSONB DEFAULT '{}'::jsonb, + fetched_at TIMESTAMPTZ NOT NULL DEFAULT now() +); + +COMMENT ON TABLE cad_parcels_geom IS + 'Геометрия участков (4-part cad, thematic_id=1) из NSPD. ' + 'Источник: nspd_geo task. ' + 'Используется site-finder analyze endpoint как fallback для 4-part cad ' + 'если в cad_quarters_geom нет.'; + +CREATE INDEX IF NOT EXISTS cad_parcels_geom_gist + ON cad_parcels_geom USING GIST (geom); + +COMMIT; diff --git a/frontend/src/app/admin/scrape/geo/page.tsx b/frontend/src/app/admin/scrape/geo/page.tsx index bd59f648..ad14c77b 100644 --- a/frontend/src/app/admin/scrape/geo/page.tsx +++ b/frontend/src/app/admin/scrape/geo/page.tsx @@ -73,11 +73,14 @@ export default function GeoScrapeAdminPage() { // Авто-синк thematic_id при смене job_kind. Пользователь может override через // селект ниже (например quarters + thematic_id=15 для комплексов). + // Также переключаем source на manual_list когда job_kind != quarters, т.к. + // rosreestr_pending содержит только кварталы (иначе backend вернёт 400). const handleJobKindChange = (kind: "quarters" | "parcels" | "buildings") => { setJobKind(kind); if (kind === "quarters") setThematicId(2); else if (kind === "parcels") setThematicId(1); else if (kind === "buildings") setThematicId(5); + if (kind !== "quarters") setSourceKind("manual_list"); }; const [cadNumsText, setCadNumsText] = useState(""); const [regionCodes, setRegionCodes] = useState("66,74,72,59"); @@ -306,6 +309,23 @@ export default function GeoScrapeAdminPage() { + {sourceKind === "rosreestr_pending" && jobKind !== "quarters" && ( +