#!/usr/bin/env bash # Импорт кадастра зданий ЕКБ из gendesign-БД в tradein cad_buildings (#393). # # Источник: gendesign-postgres-1 / cad_buildings (~37k зданий, 36k по ЕКБ). # Берём ЕКБ (cad_num LIKE '66:41:%') с годом постройки или этажностью. # Координаты — центроид geom. Используется как источник обогащения # house_metadata (год / этажность) — точнее OSM. # # Запуск на прод-хосте: ./import-cadastre.sh # Повторяемо: upsert по cad_num (PRIMARY KEY), новый запуск обновит данные. set -euo pipefail SRC_PG="${SRC_PG:-gendesign-postgres-1}" DST_PG="${DST_PG:-tradein-postgres}" SRC_DB="${SRC_DB:-gendesign}" SRC_USER="${SRC_USER:-gendesign}" echo "[$(date -u +%H:%M:%S)] import-cadastre: здания ЕКБ из cad_buildings" # 1. Staging-таблица в tradein. docker exec "$DST_PG" psql -U tradein -d tradein -v ON_ERROR_STOP=on -c " CREATE TABLE IF NOT EXISTS cad_buildings_staging ( cad_num text PRIMARY KEY, address text, floors int, year_built int, area_m2 numeric, purpose text, lat double precision, lon double precision ); TRUNCATE cad_buildings_staging; " # 2. Трансформируем на gendesign-стороне, пайпим CSV в staging. # Центроид geom → lat/lon (ST_Transform на 4326 на случай иного SRID). docker exec "$SRC_PG" psql -U "$SRC_USER" -d "$SRC_DB" -v ON_ERROR_STOP=on -c " COPY ( SELECT cad_num, NULLIF(trim(readable_address), '') AS address, NULLIF(floors, 0) AS floors, CASE WHEN year_built BETWEEN 1800 AND 2100 THEN year_built END AS year_built, round(COALESCE(build_record_area, area), 2) AS area_m2, purpose, ST_Y(ST_Centroid(ST_Transform(geom, 4326))) AS lat, ST_X(ST_Centroid(ST_Transform(geom, 4326))) AS lon FROM cad_buildings WHERE cad_num LIKE '66:41:%' AND cad_num IS NOT NULL AND (year_built IS NOT NULL OR floors IS NOT NULL) ) TO STDOUT WITH CSV " | docker exec -i "$DST_PG" psql -U tradein -d tradein -v ON_ERROR_STOP=on -c " COPY cad_buildings_staging FROM STDIN WITH CSV " STAGED=$(docker exec "$DST_PG" psql -U tradein -d tradein -tAc \ "SELECT count(*) FROM cad_buildings_staging") echo "[$(date -u +%H:%M:%S)] staged: $STAGED зданий" # 3. Upsert в cad_buildings (trigger проставит geom из lat/lon). docker exec "$DST_PG" psql -U tradein -d tradein -v ON_ERROR_STOP=on -c " INSERT INTO cad_buildings (cad_num, address, floors, year_built, area_m2, purpose, lat, lon) SELECT cad_num, address, floors, year_built, area_m2, purpose, lat, lon FROM cad_buildings_staging ON CONFLICT (cad_num) DO UPDATE SET address = EXCLUDED.address, floors = EXCLUDED.floors, year_built = EXCLUDED.year_built, area_m2 = EXCLUDED.area_m2, purpose = EXCLUDED.purpose, lat = EXCLUDED.lat, lon = EXCLUDED.lon, imported_at = NOW(); DROP TABLE cad_buildings_staging; " TOTAL=$(docker exec "$DST_PG" psql -U tradein -d tradein -tAc \ "SELECT count(*) FROM cad_buildings") echo "[$(date -u +%H:%M:%S)] cad_buildings всего: $TOTAL"