gendesign/tradein-mvp/deploy/import-cadastre.sh
TradeIn Deploy 9cc8ab96f7 feat(tradein): кадастр зданий как источник house_metadata (#393)
В gendesign-БД есть cad_buildings — ~36к зданий ЕКБ с годом постройки
и этажностью (Росреестр). Подключаем как ПРИОРИТЕТНЫЙ источник
обогащения house_metadata, OSM Overpass остаётся fallback-ом.

- data/sql/006_cad_buildings.sql — таблица cad_buildings в tradein-БД.
- deploy/import-cadastre.sh — ETL: ЕКБ-срез cad_buildings из
  gendesign-postgres → tradein (по образцу import-rosreestr.sh).
- house_metadata._cad_buildings_get — lookup по гео-близости (60 м),
  проверяется ПЕРВЫМ в get_house_metadata, до OSM.

cad_buildings — кадастр ЗДАНИЙ, не квартир: поле ручного ввода кадастра
(исходная идея #393) не делаем — гео-обогащение полезнее и работает
автоматически для каждой оценки.

Closes #393
2026-05-22 10:54:42 +05:00

78 lines
3.3 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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