В 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
78 lines
3.3 KiB
Bash
Executable file
78 lines
3.3 KiB
Bash
Executable file
#!/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"
|