# Полотно: карта расселения Беларуси по сетке 1 км, 1975–2050

Проверяемый пакет артефактов v1.0.0 исследования INF-15 `grid`
проекта «Население Беларуси, 1897–2026».

## Исследовательский вопрос и главный вывод

Как устроено расселение Беларуси без административных границ — сеткой в
1 км — и как рисунок расселения менялся с 1975 по 2020 год (наблюдение) и
куда идёт до 2050 года (прогноз)? Пакет проверяет три утверждения,
замороженные в `PREREGISTRATION.md` до расчёта: **C-1** — «плотность вокруг
среднего жителя» (population-weighted density) растёт весь ряд, даже когда
обычная плотность страны падает; **C-2** — доля площади страны с плотностью
ниже 5 чел/км² растёт монотонно 1975→2050 и не объясняется одним лишь
Полесьем/Чернобылем; **C-3** — метров дорожной сети на жителя больше там, где
депопуляция района сильнее. **Честно: C-1 и C-2 публикуются со статусом
«открытый вопрос», а не «подтверждено».** Раздел 7 ТЗ (проверка 3)
предписывает это буквально: перекрёстная проверка независимым сенсором —
ночной светимостью VIIRS (G-3) — даёт согласие знака изменения
население/свет (2012→2020) всего **32,8 %** (39 из 119 районов) при пороге
70 %; доминирующий паттерн — «население по официальным данным упало, свет
вырос» у **63,9 %** районов (76 из 119). Причина не установлена окончательно
(вероятная гипотеза — модернизация уличного освещения/LED, не проверена
причинно) — расхождение двух сенсоров само стало отдельным сюжетом пакета
(`docs/decisions/INF-15.md`, запись **D-007**). При этом на откалиброванных
данных `population_weighted_density` выросла с **3105,6** (1975) до
**5657,3** чел/км² (2020), а `area_share_below(5)` — с **0,7155** до
**0,7422** и продолжает расти до **0,843–0,859** к 2050 году во всех
сценариях/вариантах прогноза; рост сохраняется и без 36 районов Полесья и
Чернобыля (`0,6828 → 0,7120`, **+0,0292**, G-4 пройдена) — но эти числа
описывают только то, что видно в самой сетке, а не независимо подтверждённый
факт, пока G-3 не пройдена. **C-3, напротив, ПОДТВЕРЖДЕНА**: корреляция
Спирмена `network_per_capita_2026` против темпа изменения численности района
1989→2026 = **−0,7508** (p ≈ 1,25×10⁻²², 118 районов) — отрицательная и
высоко значимая, а проверка полноты карты дорог (G-6: OSM 76 958,8 км против
официальных 86 446 км, Δ = −10,97 %, допуск ±15 %) пройдена с запасом.

## Что в пакете

```
README.md                    этот файл
CHANGELOG.md                 история версий пакета
CITATION.cff                 как цитировать (версия, авторы, URL, git-тег)
LICENSE.md                   лицензии пакета и каждого источника
AGENT.md                     инструкции независимому аудитору (человеку/LLM)
LIMITATIONS.md               где выводы неприменимы и что честно не утверждается
METHODS.md                   методология для человека-читателя, 8 проверок G-1..G-8
VALIDATION.md                результаты 8 проверок раздела 7 ТЗ с числами
PROVENANCE.md                цепочка источник -> преобразование -> результат
DATA_DICTIONARY.md           схема web/public/data/grid.json (для INF-14)
EXECUTIVE_BRIEF.md           выжимка на одну страницу
PREREGISTRATION.md           заморожена 2026-07-26, с 2 датированными поправками
claims.yaml                  реестр утверждений C-1..C-3 со статусами
artifact.yaml                машиночитаемый манифест пакета (источник истины
                             о составе — ARTIFACT_STANDARD.md §5); собирается
                             командой `python -m etl.artifacts.build grid`

params/assumptions.yaml      все допущения с обоснованиями и статусами [P]/[O]/[A]

sources/
  registry.csv                реестр источников: id, URL, лицензия, дата, sha256
  raw/                         вендоренные промежуточные агрегаты (JSON/CSV):
    registry_ghsl_pop.csv        40 тайлов GHS-POP R2023A (URL + sha256, per-тайл)
    ghsl_pop_input_metadata_belarus_extract.txt  выдержка метаданных JRC о
                                  референсной переписи 2009 года (находка D-005)
    reconciliation.csv           сырая сверка сетка/район, все 10 эпох x 119 (G-1.1)
    g2_reconciliation.csv        сверка прогноза клеток и района, 4284 строки (G-2)
    g3_nightlights_crosscheck.json / g3_nightlights_rows.csv  перекрёстная
                                  проверка с огнями по 119 районам (G-3, НЕ пройдена)
    metrics_observed.json        национальные и районные показатели 1975-2020
    metrics_forecast.json        прогнозные показатели 2026-2050 (3 сценария x
                                  2 варианта), сводка G-2
    network_metrics.json         G-6 и корреляция C-3 (network_per_capita)
    network_by_raion.csv         длина сети OSM по (район, класс)
    registry_road_stats.csv      официальная статистика протяжённости дорог (G-6)
    grid_meta.json                трансформ единой сетки (857x514, ESRI:54009)
    rasters/pop_<epoch>.tif       10 откалиброванных клеточных растров (constrained
                                  dasymetric; см. METHODS.md) — материализуются
                                  сборкой манифеста из data/raw/grid/rasters_
                                  constrained/, где присутствуют физически на
                                  момент написания этого документа

code/
  run.sh                      единственная точка входа (быстрый режим)
  build.py                    пересчёт контрольных чисел из sources/raw (stdlib)
  verify.py                   сверка с checks/expected_results.json
  requirements.lock           Python и зависимости

checks/
  tests/test_invariants.py    инварианты данных (монотонность, G-3/G-4/G-5 факты)
  expected_results.json       20 контрольных метрик с допусками (G-7)

data/final/
  computed_results.json       канонические числа (та же схема, что у urban-overhang)
  grid.json                   [материализуется сборкой манифеста из
                               web/public/data/grid.json — полный контракт
                               данных сайта, ~202 КБ на момент написания]
```

Глобальные тайлы GHS-POP R2023A (~190 МБ, 40 файлов) в пакет **не
вкладываются** — в `sources/raw/registry_ghsl_pop.csv` остаются URL и sha256
каждого тайла, а `code/extract/grid_fetch.py` воспроизводимо их скачивает.
Быстрый режим стартует от вендоренных агрегатов и сети не требует.

## Как воспроизвести

Требования быстрого режима: Python ≥ 3.10, bash. Внешних зависимостей нет
(только стандартная библиотека) — тот же принцип, что у пакета
`urban-overhang`. Время: секунды.

```bash
bash code/run.sh
```

Скрипт (1) пересчитывает `data/final/computed_results.json` из `sources/raw/`
(`code/build.py`), (2) прогоняет инварианты (`checks/tests/test_invariants.py`),
(3) сверяет 20 контрольных чисел с заявленными (`checks/expected_results.json`,
`code/verify.py`). Любое расхождение — ненулевой код выхода.

### Полный растровый режим

Полное воспроизведение сеточной части — от глобальных тайлов GHS-POP до
финального `web/public/data/grid.json` — требует тяжёлых зависимостей
(`rasterio`, `numpy`, `scipy`, `Pillow`), которых нет в быстром режиме.
Список зависимостей — `requirements-raster.txt` **в корне основного
репозитория BY Maps** (не в этом пакете; так и задумано разделом 10 ТЗ —
«тяжёлые» библиотеки не замедляют общие проверки CI). Порядок шагов
(каждый — отдельный модуль `etl/`, запускается из корня основного
репозитория):

```bash
python -m etl.grid_fetch      # 1. докачка 40 тайлов GHS-POP R2023A (сеть)
python -m etl.grid_extract    # 2. мозаика + клип по Беларуси, единая сетка 1 км
python -m etl.grid            # 3. метрики наблюдаемых эпох 1975-2020, G-1/G-4/G-5,
                               #    constrained-калибровка (D-005)
python -m etl.grid_project    # 4. прогноз 2026-2050, варианты A/Б, нормировка (G-2),
                               #    сборка web/public/data/grid.json
python -m etl.grid_frames     # 5. кадры карты (webp) + перекрёстная проверка G-3
```

В этом пакете эти пять модулей продублированы как `code/extract/grid_fetch.py`,
`grid_extract.py`, `grid.py`, `grid_project.py`, `grid_frames.py` (копии
`etl/*.py` основного репозитория на момент релиза — см. `PROVENANCE.md`), но
запускать их нужно из корня основного репозитория (относительные пути и
зависимости от `etl.common`, `etl.registry` рассчитаны на структуру всего
проекта, не только пакета). Отдельный модуль `etl/grid_network.py`
(`network_per_capita`, G-6, C-3) не входит в основную последовательность
`stage11` и запускается независимо от того же корня.

## Как интерпретировать результаты

**Карта — НЕ независимая проверка численности населения.** Клетки построены
дазиметрическим методом (GHS-POP R2023A): официальную статистику
«размазывают» внутри административных единиц по снимкам застройки. В этом
пакете сумма клеток каждого района на каждую эпоху дополнительно
принудительно приравнена к официальному ряду (`constrained dasymetric
redistribution`, `docs/decisions/INF-15.md` D-005) — потому что сырой продукт
не проходит сверку G-1 практически ни для одного из 119 районов (см.
`VALIDATION.md`). Из этого следует: карта **достоверно показывает рисунок**
расселения (где относительно друг друга живут люди), но **не может служить
альтернативным подсчётом**, сколько их всего — итог по каждому району и
стране здесь тождественно равен уже известной официальной цифре, а не
измерен заново. Читайте отдельные клетки в малозаселённых зонах
(Чернобыльская зона в первую очередь) с осторожностью — там дазиметрия
искажена сильнее всего (`LIMITATIONS.md`). Прогнозная часть (2026–2050) —
модель, а не наблюдение: варианты A («инерция тренда») и Б («пригороды
растут, периферия пустеет быстрее») — два явно разных допущения, а не
диапазон точности. Дорожная сеть — снимок на 2026 год, не история: корректно
говорить «сети на жителя сейчас больше там-то», некорректно — «сеть
выросла».

## Живая версия и методология

- Лендинг: <https://by-population-maps.vercel.app/research/grid>
- Методблок: там же, кнопка «О данных и методике» (8 полей, RU/BE)
- Каталог артефактов: <https://by-population-maps.vercel.app/artifacts>
- Репозиторий: <https://github.com/sergeionlyart/BY_maps>
- Полная методология для человека-читателя — `METHODS.md`; для аудитора —
  `AGENT.md`.

## Лицензии

Пакет (код, документация, производные данные) — **CC BY 4.0**. Источники
сохраняют свои лицензии: GHS-POP R2023A (CC BY 4.0, JRC European Commission;
клетки откалиброваны под официальную статистику — см. выше), OpenStreetMap
(ODbL, © OpenStreetMap contributors, только современный срез 2026 года),
ряды и прогноз населения районов (использование с указанием источника,
Белстат / компиляция pop-stat.mashke.org / BY Maps), ночная светимость
(вырезки исследования INF-08 v2, CC BY 4.0 / EOG VNL — использованы только
для перекрёстной проверки G-3, не как слой карты). Полные тексты —
`LICENSE.md`.

## Версия

v1.0.0 (2026-07-26) — первый релиз; git-тег `artifact-grid-v1.0.0`.
История изменений — `CHANGELOG.md`.
