Перейти к содержанию

Получение кадастровых полигонов на российском сервере

Скрипт получает реальные границы земельных участков из Росреестра ПКК и обновляет properties.json — заменяет точки (Point) на полигоны (Polygon).

Требования к серверу: - Python 3.10+ (проверить: python3 --version) - Российский IP (ПКК API заблокирован из-за рубежа) - ~500 МБ свободного места - Доступ в интернет

Внешние зависимости не нужны — скрипт использует только стандартную библиотеку Python.


Шаг 1. Подготовка файлов на локальной машине

Из корня проекта silent-meadow:

# Создать временную папку для передачи
mkdir -p /tmp/cadastral-job

# Скопировать скрипт и данные
cp .github/scripts/fetch_cadastral_standalone.py /tmp/cadastral-job/
cp frontend/public/data/properties.json /tmp/cadastral-job/

Шаг 2. Загрузить на российский сервер

# Замените user@ru-server на ваши данные
scp /tmp/cadastral-job/fetch_cadastral_standalone.py user@ru-server:~/cadastral/
scp /tmp/cadastral-job/properties.json user@ru-server:~/cadastral/

Или если используете другой способ доступа (FTP, панель хостинга), загрузите оба файла в одну папку на сервере.

Шаг 3. Подключиться к серверу

ssh user@ru-server
cd ~/cadastral

Шаг 4. Проверить Python

python3 --version
# Должно быть 3.10 или выше

Если Python не установлен:

# Ubuntu/Debian
sudo apt update && sudo apt install -y python3

# CentOS/RHEL
sudo yum install -y python3

Шаг 5. Тестовый запуск (5 участков)

python3 fetch_cadastral_standalone.py properties.json --test 5

Ожидаемый вывод:

Total: 5, already have polygons: 0
Testing PKK API access... OK
[1/5] #1 (55.51697, 35.86733)... OK 50:23:0040203:123 (8 pts)
[2/5] #2 (55.51695, 35.86731)... OK 50:23:0040203:124 (7 pts)
...
Done:
  OK:      5
  Skipped: 0 (already have polygon)
  Failed:  0
  Total:   5

Если видите "FAILED! PKK API is not accessible" — сервер не имеет доступа к Росреестру. Нужен другой сервер с российским IP.

Шаг 6. Полный запуск (все 436 участков)

# Запуск в фоне через nohup (чтобы не оборвалось при разрыве SSH)
nohup python3 fetch_cadastral_standalone.py properties.json > log.txt 2>&1 &

# Следить за прогрессом
tail -f log.txt

Или без фона:

python3 fetch_cadastral_standalone.py properties.json

Время выполнения: ~7-10 минут (436 участков x 2 запроса x 0.5с задержка).

Скрипт сохраняет промежуточный результат каждые 20 участков. Если прервётся — запустите снова, уже обработанные участки будут пропущены.

Шаг 7. Проверить результат

# Сколько полигонов получено
python3 -c "
import json
with open('properties.json') as f:
    data = json.load(f)
types = {}
for f in data['features']:
    t = f['geometry']['type']
    types[t] = types.get(t, 0) + 1
print(types)
"

Ожидаемый вывод:

{'Polygon': 430, 'Point': 6}

(Некоторые участки могут остаться Point — не найдены в кадастре.)

Шаг 8. Скачать результат на локальную машину

# На локальной машине (НЕ на сервере)
scp user@ru-server:~/cadastral/properties.json frontend/public/data/properties.json

Шаг 9. Проверить на карте

cd frontend
npm run dev

Откройте карту в браузере — участки должны отображаться как закрашенные полигоны вместо точек-маркеров.

Шаг 10. Очистка на сервере

ssh user@ru-server
rm -rf ~/cadastral

Решение проблем

"FAILED! PKK API is not accessible"

Сервер не может достучаться до pkk.rosreestr.ru. Проверьте:

curl -s -o /dev/null -w "%{http_code}" --connect-timeout 10 \
  "https://pkk.rosreestr.ru/api/features/1?text=&tolerance=50&limit=1" \
  -H "User-Agent: Mozilla/5.0"
Если возвращает 000 или ошибку — нужен другой сервер.

Скрипт прерван / SSH отключился

Просто запустите снова — участки с уже полученными полигонами будут пропущены:

python3 fetch_cadastral_standalone.py properties.json

Много ошибок "x not found" / "x no geometry"

Координаты в properties.json могут быть неточными (синтетические). Скрипт ищет участок в радиусе 50 метров от указанной точки. Если координаты сильно отличаются от реальных — участок не найдётся.

Python версия ниже 3.10

Скрипт использует match / type hints из 3.10+. Если на сервере Python 3.8/3.9, обновите: sudo apt install python3.11 или используйте pyenv.