(medium) Аэродромы запрашиваются из OSM только как node — авиашум молча теряется в скоринге #1350

Closed
opened 2026-06-14 18:08:54 +00:00 by bot-backend · 1 comment
Collaborator

Описание

Для key == "aeroway" (aerodrome) загрузчик источников шума жёстко выставляет el_type = "node", и _build_overpass_query генерирует node["aeroway"="aerodrome"](bbox);out body;. В OSM аэродромы/аэропорты (включая Кольцово, IATA SVX) практически всегда замаплены как way-полигон или relation, а не как одиночный node. Запрос по node вернёт ~0 элементов → аэродромный источник шума молча отсутствует в osm_noise_sources_ekb. Авиашум — один из сильнейших факторов для скоринга участка, и он тихо теряется (logger выводит только → 0 elements, без ошибки).

Корень

Спец-ветка el_type = "node" для aeroway в цикле _NOISE_QUERIES. sync_noise_sources_to_db корректно обрабатывает way/node (строки ~209-235), но ни один aerodrome-way туда не дойдёт, потому что Overpass его не вернёт. Fallback/компенсирующей логики нет.

Evidence

/Users/anton/Птица/gendesign/backend/app/services/site_finder/noise_loader.py:113-114

if key == "aeroway":
    el_type = "node"
# _build_overpass_query: return f'[out:json][timeout:30];node["{key}"="{value}"]{bbox};out body;'

Suggested fix

Запрашивать аэродром как way/nwr с out geom (как для прочих площадных объектов) и строить полигон/линию через _way_to_polygon_wkt / _way_to_linestring_wkt; центр площадки можно брать через ST_Centroid. Убрать спец-ветку el_type = "node" для aeroway либо заменить на nwr/way с geom-обработкой в sync_noise_sources_to_db.

Обоснование severity

Medium: авиашум критичен для точности скоринга участков, источник тихо отсутствует без ошибки. Не critical/high, поскольку в bbox ЕКБ аэродромов мало (Кольцово — фактически единственный), потеря не массовая, но существенная для точности скоринга в зоне аэропорта.


week ревью 1 · multi-agent аудит 2026-06-14 · severity=medium · category=correctness

Затронутые файлы:

  • /Users/anton/Птица/gendesign/backend/app/services/site_finder/noise_loader.py
## Описание Для `key == "aeroway"` (aerodrome) загрузчик источников шума жёстко выставляет `el_type = "node"`, и `_build_overpass_query` генерирует `node["aeroway"="aerodrome"](bbox);out body;`. В OSM аэродромы/аэропорты (включая Кольцово, IATA SVX) практически всегда замаплены как way-полигон или relation, а не как одиночный node. Запрос по node вернёт ~0 элементов → аэродромный источник шума молча отсутствует в `osm_noise_sources_ekb`. Авиашум — один из сильнейших факторов для скоринга участка, и он тихо теряется (logger выводит только `→ 0 elements`, без ошибки). ## Корень Спец-ветка `el_type = "node"` для aeroway в цикле `_NOISE_QUERIES`. `sync_noise_sources_to_db` корректно обрабатывает way/node (строки ~209-235), но ни один aerodrome-way туда не дойдёт, потому что Overpass его не вернёт. Fallback/компенсирующей логики нет. ## Evidence `/Users/anton/Птица/gendesign/backend/app/services/site_finder/noise_loader.py:113-114` ```python if key == "aeroway": el_type = "node" # _build_overpass_query: return f'[out:json][timeout:30];node["{key}"="{value}"]{bbox};out body;' ``` ## Suggested fix Запрашивать аэродром как way/nwr с `out geom` (как для прочих площадных объектов) и строить полигон/линию через `_way_to_polygon_wkt` / `_way_to_linestring_wkt`; центр площадки можно брать через `ST_Centroid`. Убрать спец-ветку `el_type = "node"` для aeroway либо заменить на `nwr`/`way` с geom-обработкой в `sync_noise_sources_to_db`. ## Обоснование severity Medium: авиашум критичен для точности скоринга участков, источник тихо отсутствует без ошибки. Не critical/high, поскольку в bbox ЕКБ аэродромов мало (Кольцово — фактически единственный), потеря не массовая, но существенная для точности скоринга в зоне аэропорта. --- _week ревью 1 · multi-agent аудит 2026-06-14 · severity=**medium** · category=`correctness`_ Затронутые файлы: - `/Users/anton/Птица/gendesign/backend/app/services/site_finder/noise_loader.py`
bot-backend added the
week ревью 1
label 2026-06-14 18:08:54 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:01:50 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: noise_loader.py:37 _NOISE_QUERIES содержит ("aeroway", "aerodrome", "aerodrome", None). В fetch_overpass_noise на :85 el_type = "node" if key == "aeroway" else "way" (issue цитирует старую форму if key == "aeroway": el_type = "node" на :113-114 — теперь это тернарник на :85, дефект тот же). _build_overpass_query (:58-70): для не-way ветка :70 строит node["aeroway"="aerodrome"](bbox);out body;. Аэродромы (Кольцово, SVX) в OSM замаплены как way-полигон/relation, не node → запрос вернёт ~0 элементов → авиашум-источник тихо отсутствует в osm_noise_sources_ekb (logger выводит только → 0 elements, без ошибки).

Корень: Спец-ветка el_type="node" для aeroway. sync_noise_sources_to_db корректно обрабатывает way (:168-182 через _way_to_polygon_wkt/_way_to_linestring_wkt) и node (:183-190), и даже скипает relation (:191-194) — но ни один aerodrome-way туда не дойдёт, т.к. Overpass его не вернёт. Компенсирующей логики нет.

Что править:

  • Убрать спец-ветку :85 — запрашивать aeroway как way (или nwr) с out geom, как прочие площадные объекты.
  • Аэродром = площадной полигон → построить через _way_to_polygon_wkt (или брать центр через ST_Centroid при скоринге). _build_overpass_query уже умеет way-ветку (:67-68 out geom).
  • Проверить, что sync_noise_sources_to_db корректно ляжет на aerodrome-way (source_type='aerodrome', road_class=None — не попадёт в water-полигон-ветку :171, уйдёт в _way_to_linestring_wkt на :177; для замкнутого полигона нужна явная ветка polygon).

Что посмотреть:

  • Код: noise_loader.py (_NOISE_QUERIES:37, el_type:85, _build_overpass_query:58-70, way/node-обработка :168-194, _way_to_polygon_wkt:124). Добавить тест/ручной прогон Overpass по bbox ЕКБ с way["aeroway"="aerodrome"] → должен вернуть Кольцово.
  • Vault: релевантных заметок не найдено (поиск «noise_loader aeroway aerodrome» пуст).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `noise_loader.py:37` `_NOISE_QUERIES` содержит `("aeroway", "aerodrome", "aerodrome", None)`. В `fetch_overpass_noise` на `:85` `el_type = "node" if key == "aeroway" else "way"` (issue цитирует старую форму `if key == "aeroway": el_type = "node"` на `:113-114` — теперь это тернарник на `:85`, дефект тот же). `_build_overpass_query` (`:58-70`): для не-way ветка `:70` строит `node["aeroway"="aerodrome"](bbox);out body;`. Аэродромы (Кольцово, SVX) в OSM замаплены как way-полигон/relation, не node → запрос вернёт ~0 элементов → авиашум-источник тихо отсутствует в `osm_noise_sources_ekb` (logger выводит только `→ 0 elements`, без ошибки). **Корень:** Спец-ветка `el_type="node"` для aeroway. `sync_noise_sources_to_db` корректно обрабатывает way (`:168-182` через `_way_to_polygon_wkt`/`_way_to_linestring_wkt`) и node (`:183-190`), и даже скипает relation (`:191-194`) — но ни один aerodrome-way туда не дойдёт, т.к. Overpass его не вернёт. Компенсирующей логики нет. **Что править:** - Убрать спец-ветку `:85` — запрашивать aeroway как `way` (или `nwr`) с `out geom`, как прочие площадные объекты. - Аэродром = площадной полигон → построить через `_way_to_polygon_wkt` (или брать центр через `ST_Centroid` при скоринге). `_build_overpass_query` уже умеет way-ветку (`:67-68` `out geom`). - Проверить, что `sync_noise_sources_to_db` корректно ляжет на aerodrome-way (source_type='aerodrome', road_class=None — не попадёт в water-полигон-ветку `:171`, уйдёт в `_way_to_linestring_wkt` на `:177`; для замкнутого полигона нужна явная ветка polygon). **Что посмотреть:** - Код: `noise_loader.py` (`_NOISE_QUERIES:37`, `el_type:85`, `_build_overpass_query:58-70`, way/node-обработка `:168-194`, `_way_to_polygon_wkt:124`). Добавить тест/ручной прогон Overpass по bbox ЕКБ с `way["aeroway"="aerodrome"]` → должен вернуть Кольцово. - Vault: релевантных заметок не найдено (поиск «noise_loader aeroway aerodrome» пуст).
Sign in to join this conversation.
No milestone
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#1350
No description provided.