#!/usr/bin/env bash set -euo pipefail if [ "$#" -ne 1 ]; then echo "usage: $0 DE_VG250.gpkg" exit 1 fi INPUT="$1" if [ ! -f "$INPUT" ]; then echo "file not found: $INPUT" exit 1 fi : "${DATABASE_URL:?DATABASE_URL must be set}" echo "Available layers:" ogrinfo "$INPUT" | sed -n '1,120p' echo echo "Inspecting vg250_krs..." ogrinfo "$INPUT" vg250_krs -so echo echo "Importing only vg250_krs..." # Remove an old failed import. psql "$DATABASE_URL" <<'SQL' DROP TABLE IF EXISTS vg250_krs_import CASCADE; SQL # IMPORTANT: # The layer name is explicitly specified here. ogr2ogr \ -f PostgreSQL \ "$DATABASE_URL" \ "$INPUT" \ vg250_krs \ -nln vg250_krs_import \ -nlt PROMOTE_TO_MULTI \ -t_srs EPSG:4326 \ -lco GEOMETRY_NAME=wkb_geometry \ -overwrite echo echo "Source import completed." echo echo "Imported source columns:" psql "$DATABASE_URL" <<'SQL' SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'vg250_krs_import' ORDER BY ordinal_position; SQL echo echo "Creating county boundaries..." psql "$DATABASE_URL" <<'SQL' BEGIN; TRUNCATE county_crossings; TRUNCATE county_boundaries RESTART IDENTITY CASCADE; INSERT INTO county_boundaries ( name, geometry ) SELECT COALESCE( NULLIF(TRIM(gen), ''), NULLIF(TRIM(bez), ''), NULLIF(TRIM(ars), ''), 'unknown' ) AS name, ST_Multi( ST_CollectionExtract( ST_MakeValid(wkb_geometry), 3 ) )::geometry(MultiPolygon, 4326) AS geometry FROM vg250_krs_import WHERE wkb_geometry IS NOT NULL AND NOT ST_IsEmpty(wkb_geometry); COMMIT; SQL echo echo "Removing temporary import table..." psql "$DATABASE_URL" <<'SQL' DROP TABLE vg250_krs_import; SQL echo echo "Recreating spatial index..." psql "$DATABASE_URL" <<'SQL' DROP INDEX IF EXISTS county_boundaries_geometry_idx; CREATE INDEX county_boundaries_geometry_idx ON county_boundaries USING GIST (geometry); ANALYZE county_boundaries; SQL echo echo "==========================================" echo " Imported counties" echo "==========================================" psql "$DATABASE_URL" <<'SQL' SELECT COUNT(*) AS total, COUNT(*) FILTER (WHERE geometry IS NOT NULL) AS with_geometry, COUNT(*) FILTER (WHERE ST_IsValid(geometry)) AS valid_geometry FROM county_boundaries; SQL echo echo "First 20 counties:" echo psql "$DATABASE_URL" <<'SQL' SELECT id, name, ST_GeometryType(geometry) AS geometry_type, ST_SRID(geometry) AS srid FROM county_boundaries ORDER BY name LIMIT 20; SQL echo echo "Import completed successfully."