county-sprints/scripts/import-vg250.sh
Jonas Rabenstein 45bcc13788 state
2026-08-12 17:49:27 +02:00

146 lines
2.6 KiB
Shell
Executable file

#!/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."