diff --git a/src/app/api/geoportal/optimize-views/route.ts b/src/app/api/geoportal/optimize-views/route.ts index 6f95039..939afa2 100644 --- a/src/app/api/geoportal/optimize-views/route.ts +++ b/src/app/api/geoportal/optimize-views/route.ts @@ -19,18 +19,25 @@ export const runtime = "nodejs"; export const dynamic = "force-dynamic"; const STEPS = [ - // 1. Add pre-simplified geometry columns + // 0. Drop existing views that reference geom (they block ALTER TABLE) + { name: "Drop gis_uats_z0 view", sql: `DROP VIEW IF EXISTS gis_uats_z0 CASCADE` }, + { name: "Drop gis_uats_z5 view", sql: `DROP VIEW IF EXISTS gis_uats_z5 CASCADE` }, + { name: "Drop gis_uats_z8 view", sql: `DROP VIEW IF EXISTS gis_uats_z8 CASCADE` }, + { name: "Drop gis_uats_z12 view", sql: `DROP VIEW IF EXISTS gis_uats_z12 CASCADE` }, + { name: "Drop gis_uats view", sql: `DROP VIEW IF EXISTS gis_uats CASCADE` }, + + // 1. Add pre-simplified geometry columns (plain geometry, no typed constraint) { name: "Add geom_z0 column (2000m)", - sql: `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='GisUat' AND column_name='geom_z0') THEN ALTER TABLE "GisUat" ADD COLUMN geom_z0 geometry(Geometry, 3844); END IF; END $$`, + sql: `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='GisUat' AND column_name='geom_z0') THEN ALTER TABLE "GisUat" ADD COLUMN geom_z0 geometry; END IF; END $$`, }, { name: "Add geom_z5 column (500m)", - sql: `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='GisUat' AND column_name='geom_z5') THEN ALTER TABLE "GisUat" ADD COLUMN geom_z5 geometry(Geometry, 3844); END IF; END $$`, + sql: `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='GisUat' AND column_name='geom_z5') THEN ALTER TABLE "GisUat" ADD COLUMN geom_z5 geometry; END IF; END $$`, }, { name: "Add geom_z8 column (50m)", - sql: `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='GisUat' AND column_name='geom_z8') THEN ALTER TABLE "GisUat" ADD COLUMN geom_z8 geometry(Geometry, 3844); END IF; END $$`, + sql: `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='GisUat' AND column_name='geom_z8') THEN ALTER TABLE "GisUat" ADD COLUMN geom_z8 geometry; END IF; END $$`, }, // 2. Backfill with pre-computed simplified geometries @@ -79,7 +86,13 @@ const STEPS = [ sql: `CREATE OR REPLACE VIEW gis_uats_z12 AS SELECT siruta, name, county, geom FROM "GisUat" WHERE geom IS NOT NULL`, }, - // 5. Update trigger to also compute simplified geoms on INSERT/UPDATE + // 5. Restore legacy gis_uats view for QGIS compatibility + { + name: "Restore gis_uats view", + sql: `CREATE OR REPLACE VIEW gis_uats AS SELECT siruta, name, county, geom_z8 AS geom FROM "GisUat" WHERE geom_z8 IS NOT NULL`, + }, + + // 6. Update trigger to also compute simplified geoms on INSERT/UPDATE { name: "Update trigger to pre-compute simplified geoms", sql: `CREATE OR REPLACE FUNCTION gis_uat_sync_geom() RETURNS TRIGGER AS $$ BEGIN IF NEW.geometry IS NOT NULL THEN BEGIN NEW.geom := gis_uat_esri_to_geom(NEW.geometry::jsonb); IF NEW.geom IS NOT NULL THEN NEW.geom_z0 := ST_SimplifyPreserveTopology(NEW.geom, 2000); NEW.geom_z5 := ST_SimplifyPreserveTopology(NEW.geom, 500); NEW.geom_z8 := ST_SimplifyPreserveTopology(NEW.geom, 50); END IF; EXCEPTION WHEN OTHERS THEN NEW.geom := NULL; NEW.geom_z0 := NULL; NEW.geom_z5 := NULL; NEW.geom_z8 := NULL; END; ELSE NEW.geom := NULL; NEW.geom_z0 := NULL; NEW.geom_z5 := NULL; NEW.geom_z8 := NULL; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql`,