Open Data Свердл: 1037 datasets из open.midural.ru — РНС / школы / транспорт / дороги #104

Closed
opened 2026-05-12 10:06:49 +00:00 by lekss361 · 2 comments
lekss361 commented 2026-05-12 10:06:49 +00:00 (Migrated from github.com)

Эшелон: Data Foundation — Open Government Data integration

Контекст / открытие

После full audit альтернативных источников engineering networks (см. OpenData_Sources_Sverdl_May12 и NSPD_API_Map_May12) найден главный публичный портал данных Свердл:

🏆 open.midural.ru/opendata1037 наборов данных в CSV / XML / XLS / PDF формате, публичные без auth, идеально для машинной интеграции.

Что есть для Site Finder

Dataset Содержание Use case
6670169564-conclusions Реестр выданных РНС / разрешений на ввод (2009-2020) 🔥 Замещает Поток 2 в #103 — ISOGD scraper не нужен
6661077317-education_builds Учреждения Минобра Свердл I1 #42 (POI capacity) — реальные школы с адресами
6661077317-quality_experts Эксперты оценки качества образования Quality ranking школ
6658355934-bus_routs Реестр межмуниципальных автобусных маршрутов A3 #41 (accessibility) — реальные transit routes
6630002223-road_repair Ремонт дорог Temporal accessibility signal
6658091960-free_areas Свободные земли с/х Opportunity layer
6658355934-municipalities Реестр МО Свердл Multi-region scaling
6662078828-reestrrinkov Реестр розничных рынков Retail POI

Дополнительные федеральные источники

  • fedstat.ru / ЕМИСС — 7090 показателей в opendata (демография, экономика, экология)
  • bus.gov.ru — реестр бюджетных учреждений (школы, клиники с capacity)
  • stat.gibdd.ru — ДТП с координатами
  • dom.gosuslugi.ru / ГИС ЖКХ — реестр МКД с capacity

Что сделать

Phase 1 — open.midural.ru catalog scanner (1-2 дня)

# backend/app/services/scrapers/open_midural.py
class OpenMiduralClient:
    BASE = "https://open.midural.ru/opendata"

    async def list_datasets(self, page: int = 1) -> list[Dataset]:
        """Bulk список наборов через HTML scraping (no public API)."""

    async def fetch_dataset_csv(self, dataset_id: str) -> bytes:
        """GET /{dataset_id}/data-...csv"""

    async def fetch_dataset_meta(self, dataset_id: str) -> dict:
        """GET /{dataset_id}/meta.csv"""

    async def fetch_structure(self, dataset_id: str) -> dict:
        """GET /{dataset_id}/structure-...csv"""

Phase 2 — Schemas + ETL per dataset (3-4 дня)

-- Catalog index
CREATE TABLE sverdl_opendata_catalog (
  dataset_id TEXT PRIMARY KEY,
  title TEXT,
  owner_inn TEXT,
  owner_name TEXT,
  tags TEXT[],
  csv_url TEXT,
  structure_url TEXT,
  meta_url TEXT,
  last_updated DATE,
  download_count INT,
  fetched_at TIMESTAMPTZ DEFAULT NOW()
);

-- РНС (заменяет ISOGD scraper #103 Поток 2)
CREATE TABLE sverdl_construction_permits (
  id BIGSERIAL PRIMARY KEY,
  source_dataset_id TEXT,
  permit_number TEXT,
  issue_date DATE,
  object_name TEXT,
  construction_address TEXT,
  geocoded_lat NUMERIC,
  geocoded_lon NUMERIC,
  construction_type TEXT,
  floors INT,
  total_area_sqm NUMERIC,
  geom GEOMETRY,
  raw_csv_row JSONB,
  fetched_at TIMESTAMPTZ DEFAULT NOW(),
  UNIQUE(permit_number, issue_date)
);
CREATE INDEX gist_permits_geom ON sverdl_construction_permits USING GIST(geom);

-- Школы / детсады (для I1 #42)
CREATE TABLE sverdl_education_facilities (
  id BIGSERIAL PRIMARY KEY,
  facility_name TEXT,
  facility_type TEXT,  -- школа / детсад / гимназия / лицей
  address TEXT,
  capacity_students INT,
  geocoded_lat NUMERIC,
  geocoded_lon NUMERIC,
  geom GEOMETRY,
  raw_csv_row JSONB
);

-- Транспортные маршруты (foundation для A3 #41)
CREATE TABLE sverdl_transit_routes (
  id BIGSERIAL PRIMARY KEY,
  route_number TEXT,
  route_name TEXT,
  route_type TEXT,  -- bus / shuttle / interMO
  origin_mo TEXT,
  dest_mo TEXT,
  stops JSONB,
  raw_csv_row JSONB
);

-- Дороги ремонт (для temporal accessibility)
CREATE TABLE sverdl_road_repairs (
  id BIGSERIAL PRIMARY KEY,
  road_segment_name TEXT,
  start_address TEXT,
  end_address TEXT,
  repair_year INT,
  geom GEOMETRY,
  raw_csv_row JSONB
);

Phase 3 — Geocoding pipeline (1 день)

Использовать Nominatim (OSM-based, бесплатный, self-hosted optional) для адресов без координат:

  • Bulk geocode из construction_address и address columns
  • Кеш в БД для повторного использования

Phase 4 — Site Finder integration (1 день)

Extend analyze_parcel response:

{
  "engineering": {
    "nearby_permits_500m": [...],  // sverdl_construction_permits в радиусе
    "permits_volume_5km": {total_area, total_units},  // cross-check D4 pipeline
    "nearby_schools_with_capacity": [...],
    "transit_routes_within_300m": [...]
  }
}

Phase 5 — Beat schedule (0.5 дня)

  • tasks.sverdl_opendata_sync.monthly_refresh — обновление каталога + всех downloaded datasets
  • Periodicity per dataset из meta.csv Периодичность актуализации

Acceptance

  • sverdl_opendata_catalog >100 records (релевантные top-100 из 1037)
  • sverdl_construction_permits >1000 records после first run
  • sverdl_education_facilities >500 records (школы / детсады Свердл)
  • Geocoding >95% coverage для адресов
  • analyze возвращает engineering.nearby_permits_500m
  • Cross-check с domrf_kn_objects: correlation >0.5 для permit ↔ commissioning

Owner

backend-engineer (scraper + ETL) + database-expert (schemas + GIST индексы)

Effort

  • Phase 1: ~1-2 дня (catalog scanner)
  • Phase 2: ~3-4 дня (parsers per dataset type)
  • Phase 3: ~1 день (geocoding)
  • Phase 4: ~1 день (Site Finder integration)
  • Phase 5: ~0.5 дня (beat)

Total: ~7-8 дней для полного цикла. MVP в 3-4 дня (Phase 1 + 2 RNS + 4).

Dependencies

  • Никаких (полностью независимо от НСПД / ESIA)
  • Поток 2 в #103 (ISOGD scraper) СУПЕРСИДИТСЯ этим issue
  • Cross-ref: #44 I3 (engineering networks), #42 I1 (POI per capita), #41 A3 (transit)

Why high value

Юридически чисто — open data Свердл с офиц.утверждённой лицензией
Машинно-читаемо — CSV / XML / XLS, не PDF и не HTML
Покрытие критичных факторов: РНС (replacement ISOGD), школы (POI capacity), транспорт (A3), дороги
1037 datasets — будущее расширение без новых infrastructure
Foundation для multi-region scaling — другие регионы РФ могут иметь свои порталы

Risks

  • ⚠️ Данные могут устаревать — например РНС с 2009 по 2020, последний апдейт 2021. Mitigation: cross-check с НСПД + Sentry alert при отсутствии refresh.
  • ⚠️ Адреса требуют geocoding — не все имеют координаты. Mitigation: Nominatim + fallback на ручную сверку для top-N.
  • ⚠️ Структура CSV per источник может меняться — structure.csv даёт schema, но изменения возможны. Mitigation: schema validation + alert при mismatch.
  • ⚠️ Tag-based discovery несовершенен — 47 unique IDs на page, 1037 total = ~22 страниц требуют crawl.
**Эшелон:** Data Foundation — Open Government Data integration ## Контекст / открытие После full audit альтернативных источников engineering networks (см. [[OpenData_Sources_Sverdl_May12]] и [[NSPD_API_Map_May12]]) найден **главный публичный портал данных Свердл**: 🏆 **[open.midural.ru/opendata](https://open.midural.ru/opendata)** — **1037 наборов данных** в CSV / XML / XLS / PDF формате, **публичные без auth**, идеально для машинной интеграции. ### Что есть для Site Finder | Dataset | Содержание | Use case | |---|---|---| | `6670169564-conclusions` | **Реестр выданных РНС / разрешений на ввод (2009-2020)** | 🔥 **Замещает Поток 2 в #103** — ISOGD scraper не нужен | | `6661077317-education_builds` | Учреждения Минобра Свердл | I1 #42 (POI capacity) — реальные школы с адресами | | `6661077317-quality_experts` | Эксперты оценки качества образования | Quality ranking школ | | `6658355934-bus_routs` | Реестр межмуниципальных автобусных маршрутов | A3 #41 (accessibility) — реальные transit routes | | `6630002223-road_repair` | Ремонт дорог | Temporal accessibility signal | | `6658091960-free_areas` | Свободные земли с/х | Opportunity layer | | `6658355934-municipalities` | Реестр МО Свердл | Multi-region scaling | | `6662078828-reestrrinkov` | Реестр розничных рынков | Retail POI | ### Дополнительные федеральные источники - **fedstat.ru / ЕМИСС** — 7090 показателей в opendata (демография, экономика, экология) - **bus.gov.ru** — реестр бюджетных учреждений (школы, клиники с capacity) - **stat.gibdd.ru** — ДТП с координатами - **dom.gosuslugi.ru / ГИС ЖКХ** — реестр МКД с capacity ## Что сделать ### Phase 1 — `open.midural.ru` catalog scanner (1-2 дня) ```python # backend/app/services/scrapers/open_midural.py class OpenMiduralClient: BASE = "https://open.midural.ru/opendata" async def list_datasets(self, page: int = 1) -> list[Dataset]: """Bulk список наборов через HTML scraping (no public API).""" async def fetch_dataset_csv(self, dataset_id: str) -> bytes: """GET /{dataset_id}/data-...csv""" async def fetch_dataset_meta(self, dataset_id: str) -> dict: """GET /{dataset_id}/meta.csv""" async def fetch_structure(self, dataset_id: str) -> dict: """GET /{dataset_id}/structure-...csv""" ``` ### Phase 2 — Schemas + ETL per dataset (3-4 дня) ```sql -- Catalog index CREATE TABLE sverdl_opendata_catalog ( dataset_id TEXT PRIMARY KEY, title TEXT, owner_inn TEXT, owner_name TEXT, tags TEXT[], csv_url TEXT, structure_url TEXT, meta_url TEXT, last_updated DATE, download_count INT, fetched_at TIMESTAMPTZ DEFAULT NOW() ); -- РНС (заменяет ISOGD scraper #103 Поток 2) CREATE TABLE sverdl_construction_permits ( id BIGSERIAL PRIMARY KEY, source_dataset_id TEXT, permit_number TEXT, issue_date DATE, object_name TEXT, construction_address TEXT, geocoded_lat NUMERIC, geocoded_lon NUMERIC, construction_type TEXT, floors INT, total_area_sqm NUMERIC, geom GEOMETRY, raw_csv_row JSONB, fetched_at TIMESTAMPTZ DEFAULT NOW(), UNIQUE(permit_number, issue_date) ); CREATE INDEX gist_permits_geom ON sverdl_construction_permits USING GIST(geom); -- Школы / детсады (для I1 #42) CREATE TABLE sverdl_education_facilities ( id BIGSERIAL PRIMARY KEY, facility_name TEXT, facility_type TEXT, -- школа / детсад / гимназия / лицей address TEXT, capacity_students INT, geocoded_lat NUMERIC, geocoded_lon NUMERIC, geom GEOMETRY, raw_csv_row JSONB ); -- Транспортные маршруты (foundation для A3 #41) CREATE TABLE sverdl_transit_routes ( id BIGSERIAL PRIMARY KEY, route_number TEXT, route_name TEXT, route_type TEXT, -- bus / shuttle / interMO origin_mo TEXT, dest_mo TEXT, stops JSONB, raw_csv_row JSONB ); -- Дороги ремонт (для temporal accessibility) CREATE TABLE sverdl_road_repairs ( id BIGSERIAL PRIMARY KEY, road_segment_name TEXT, start_address TEXT, end_address TEXT, repair_year INT, geom GEOMETRY, raw_csv_row JSONB ); ``` ### Phase 3 — Geocoding pipeline (1 день) Использовать **Nominatim** (OSM-based, бесплатный, self-hosted optional) для адресов без координат: - Bulk geocode из `construction_address` и `address` columns - Кеш в БД для повторного использования ### Phase 4 — Site Finder integration (1 день) Extend `analyze_parcel` response: ```json { "engineering": { "nearby_permits_500m": [...], // sverdl_construction_permits в радиусе "permits_volume_5km": {total_area, total_units}, // cross-check D4 pipeline "nearby_schools_with_capacity": [...], "transit_routes_within_300m": [...] } } ``` ### Phase 5 — Beat schedule (0.5 дня) - `tasks.sverdl_opendata_sync.monthly_refresh` — обновление каталога + всех downloaded datasets - Periodicity per dataset из meta.csv `Периодичность актуализации` ## Acceptance - [ ] `sverdl_opendata_catalog` >100 records (релевантные top-100 из 1037) - [ ] `sverdl_construction_permits` >1000 records после first run - [ ] `sverdl_education_facilities` >500 records (школы / детсады Свердл) - [ ] Geocoding >95% coverage для адресов - [ ] analyze возвращает `engineering.nearby_permits_500m` - [ ] Cross-check с domrf_kn_objects: correlation >0.5 для permit ↔ commissioning ## Owner `backend-engineer` (scraper + ETL) + `database-expert` (schemas + GIST индексы) ## Effort - Phase 1: ~1-2 дня (catalog scanner) - Phase 2: ~3-4 дня (parsers per dataset type) - Phase 3: ~1 день (geocoding) - Phase 4: ~1 день (Site Finder integration) - Phase 5: ~0.5 дня (beat) **Total: ~7-8 дней** для полного цикла. **MVP в 3-4 дня** (Phase 1 + 2 RNS + 4). ## Dependencies - Никаких (полностью независимо от НСПД / ESIA) - Поток 2 в #103 (ISOGD scraper) **СУПЕРСИДИТСЯ** этим issue - Cross-ref: #44 I3 (engineering networks), #42 I1 (POI per capita), #41 A3 (transit) ## Why high value ✅ **Юридически чисто** — open data Свердл с офиц.утверждённой лицензией ✅ **Машинно-читаемо** — CSV / XML / XLS, не PDF и не HTML ✅ **Покрытие критичных факторов:** РНС (replacement ISOGD), школы (POI capacity), транспорт (A3), дороги ✅ **1037 datasets** — будущее расширение без новых infrastructure ✅ **Foundation для multi-region scaling** — другие регионы РФ могут иметь свои порталы ## Risks - ⚠️ **Данные могут устаревать** — например РНС с 2009 по 2020, последний апдейт 2021. Mitigation: cross-check с НСПД + Sentry alert при отсутствии refresh. - ⚠️ **Адреса требуют geocoding** — не все имеют координаты. Mitigation: Nominatim + fallback на ручную сверку для top-N. - ⚠️ **Структура CSV per источник может меняться** — structure.csv даёт schema, но изменения возможны. Mitigation: schema validation + alert при mismatch. - ⚠️ **Tag-based discovery несовершенен** — 47 unique IDs на page, 1037 total = ~22 страниц требуют crawl. ## Links - Research: [[OpenData_Sources_Sverdl_May12]] — полный обзор всех источников - Open data Свердл: https://open.midural.ru/opendata - Реестр РНС: https://open.midural.ru/opendata/6670169564-conclusions - ЕМИСС: https://fedstat.ru/opendata - Cross-ref: #103 (Поток 2 ISOGD замещается), #42 I1, #41 A3, #44 I3
lekss361 commented 2026-05-12 10:34:19 +00:00 (Migrated from github.com)

⚠️ Критическое обновление (после freshness audit)

После проверки freshness 11 ключевых datasets из open.midural.ru: большинство устарели 4-11 лет.

Dataset Реальная актуальность
РНС / РВЭ last_modified 28.12.2021 — stale 4+ года
Школы Минобра actuality 2023, last_modified 2018
Автобусные маршруты 01.02.2015 — stale 11 лет
Эксперты школ stale 9 лет
Госуслуги stale 11 лет
Свободные земли с/х 19.03.2026 свежие
Розничные рынки 25.03.2026 свежие

Sample проверка школ CSV

197 строк — только областные спец.учреждения (детдома, интернаты, психологические центры). НЕ ВКЛЮЧАЕТ муниципальные школы ЕКБ. Бесполезно для I1 #42.

РНС CSV: 5732 строк (2009-2021)

Историческая ценность, но обрыв на 2020 — НЕ годится для замены ISOGD scraper #103 Поток 2.

Изменения в scope

Убираем из MVP:

  • РНС CSV из open.midural — устарело
  • Школы Минобра — только областные, нет capacity
  • Автобусные маршруты — stale 11 лет (используем OSM)

Сохраняем в MVP:

  • Свободные земли с/х (19.03.2026) — opportunity layer
  • Розничные рынки (25.03.2026) — POI category
  • catalog scanner — отметит stale vs fresh

Новые findings заменяющие план

🎯 АКТУАЛЬНЫЕ РНС/РВЭ ЕКБ 2022-2026 найдены на екатеринбург.рф — см. #105!

5 xlsx-файлов с РНС/РВЭ Екатеринбурга по годам 2022-2026 в стандартных формах Росстата 3 и 4. Свежие (обновлены ~31.03.2026). Без auth, без HMAC.

Effort rebalance

  • Старый план: 7-8 дней (Phase 1-5)
  • Новый план: ~2 дня (только catalog scanner + free_lands + markets)
  • +#105 параллельно: ~3 дня для РНС ЕКБ актуальных

Total: ~5 дней вместо 7-8.

## ⚠️ Критическое обновление (после freshness audit) После проверки freshness 11 ключевых datasets из open.midural.ru: **большинство устарели 4-11 лет**. | Dataset | Реальная актуальность | |---|---| | РНС / РВЭ | last_modified 28.12.2021 — **stale 4+ года** | | Школы Минобра | actuality 2023, last_modified 2018 | | Автобусные маршруты | **01.02.2015** — stale 11 лет | | Эксперты школ | stale 9 лет | | Госуслуги | stale 11 лет | | **Свободные земли с/х** | **19.03.2026** — ✅ свежие | | **Розничные рынки** | **25.03.2026** — ✅ свежие | ### Sample проверка школ CSV 197 строк — только областные спец.учреждения (детдома, интернаты, психологические центры). **НЕ ВКЛЮЧАЕТ муниципальные школы ЕКБ.** Бесполезно для I1 #42. ### РНС CSV: 5732 строк (2009-2021) Историческая ценность, но обрыв на 2020 — **НЕ годится** для замены ISOGD scraper #103 Поток 2. ## Изменения в scope **Убираем из MVP:** - ❌ РНС CSV из open.midural — устарело - ❌ Школы Минобра — только областные, нет capacity - ❌ Автобусные маршруты — stale 11 лет (используем OSM) **Сохраняем в MVP:** - ✅ Свободные земли с/х (19.03.2026) — opportunity layer - ✅ Розничные рынки (25.03.2026) — POI category - ✅ catalog scanner — отметит stale vs fresh ## Новые findings заменяющие план 🎯 **АКТУАЛЬНЫЕ РНС/РВЭ ЕКБ 2022-2026** найдены на **екатеринбург.рф** — см. **#105**! 5 xlsx-файлов с РНС/РВЭ Екатеринбурга по годам 2022-2026 в стандартных формах Росстата 3 и 4. Свежие (обновлены ~31.03.2026). Без auth, без HMAC. ## Effort rebalance - Старый план: 7-8 дней (Phase 1-5) - **Новый план: ~2 дня** (только catalog scanner + free_lands + markets) - **+#105 параллельно: ~3 дня** для РНС ЕКБ актуальных Total: ~5 дней вместо 7-8.
Owner

Status update — частично замещено через PR #211/#213 (ekburg ПЗЗ permits XLSX parser + analyze integration recent_permits). Это альтернативная реализация Поток 2 из #103.

open.midural.ru catalog scanner (1037 datasets — Phase 1) и остальные phases (schools / transit / road repairs) пока НЕ реализованы. Никакой sverdl_* таблицы нет в БД.

Issue остаётся валидным — РНС из ekburg уже покрыты, осталось:

  • sverdl_education_facilities (для I1 #42)
  • sverdl_transit_routes (для A3 #41)
  • sverdl_road_repairs
  • Catalog scanner для будущего расширения

Effort снизился до ~3-4 дней (Phase 2 only).

Status update — частично замещено через PR #211/#213 (ekburg ПЗЗ permits XLSX parser + analyze integration `recent_permits`). Это альтернативная реализация Поток 2 из #103. `open.midural.ru` catalog scanner (1037 datasets — Phase 1) и остальные phases (schools / transit / road repairs) пока НЕ реализованы. Никакой `sverdl_*` таблицы нет в БД. Issue остаётся валидным — РНС из ekburg уже покрыты, осталось: - `sverdl_education_facilities` (для I1 #42) - `sverdl_transit_routes` (для A3 #41) - `sverdl_road_repairs` - Catalog scanner для будущего расширения Effort снизился до ~3-4 дней (Phase 2 only).
Sign in to join this conversation.
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#104
No description provided.