fix(geoportal): drop views before adding columns (fixes geometry type conflict)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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`,
|
||||
|
||||
Reference in New Issue
Block a user