Тема ВКР: Разработка алгоритма пространственно-адаптивного анализа видимости площадных объектов городской среды для поддержки принятия градостроительных решений
Автор: Сафин Наиль Рамилевич
Университет: ИТМО, Цифровая урбанистика
Направление: 27.04.07 Наукоёмкие технологии и экономика инноваций
Контакт: 312683@niuitmo.ru
Алгоритм решает задачу оценки визуальной доступности объекта капитального строительства с пешеходных маршрутов в исторически сложившейся городской застройке. Такая постановка типична для согласования архитектурных проектов — оценки воздействия нового объекта на сложившийся силуэт города.
В отличие от классических растровых подходов (viewshed на DSM), алгоритм работает в непрерывном трёхмерном полигональном пространстве: здания экструдируются из контуров OSM, рельеф строится как разреженная TIN-поверхность, а видимость рассчитывается методом трассировки лучей. Целевой объект рассматривается как площадной, а не точечный, что позволяет получать не бинарную, а частичную оценку видимости с разбивкой по типам перекрывающих объектов (рельеф, рядовая застройка, объекты культурного наследия).
Результат работы алгоритма — карта видимости вдоль пешеходных маршрутов в заданном радиусе вокруг целевого объекта.
| Источник | Что даёт | Где используется |
|---|---|---|
| OpenStreetMap | Контуры зданий, этажность, пешеходные пути | Экструзия зданий, выборка точек обзора |
| ArcticDEM (2 м) | Цифровая модель поверхности | Восполнение высотных атрибутов зданий |
| SRTM / Google Elevation API | Цифровая модель рельефа | Моделирование поверхности земли |
| ЕГРОКН | Реестр объектов культурного наследия | Разметка зданий по категориям |
Шаги алгоритма: моделирование рельефа (а), экструзия строений (б), сэмплирование точек наблюдения (в), трассировка лучей (г), расчёт видимости (д)
Алгоритм выполняется в пять последовательных шагов:
- Моделирование рельефа — растровая DTM-модель конвертируется в разреженную полигональную поверхность (TIN) в одном из трёх режимов: планарном, морфометрическом (по DTM) или по данным Elevation API
- Экструзия зданий — полигоны OSM вытягиваются в 3D-призмы на основе восполненных высотных атрибутов; здания размечаются по категориям (рядовое / ОКН)
- Выборка точек обзора — точки наблюдения генерируются вдоль пешеходных путей с заданным шагом (по умолчанию 5 м)
- Трассировка лучей — из каждой точки обзора посылаются лучи в направлении равномерно распределённых точек на поверхности целевого объекта; для каждого луча фиксируется первое пересечение с поверхностью сцены и класс этой поверхности
- Интерпретация результатов — для каждой точки обзора вычисляются доли видимости целевого объекта и перекрытий по каждой категории объектов
compute_visibility(
target, # целевой объект (GeoDataFrame)
radius=1000, # радиус области анализа, м
terrain_mode="flat", # flat | dtm | elevation_api
terrain_resolution=32, # разрешение модели рельефа, м
observer_height=1.7, # рост наблюдателя, м
point_spacing=5.0, # шаг выборки точек обзора, м
ray_count=128, # количество лучей на точку обзора
dsm_stat="max", # статистика для восполнения высот
).
├── v1/ # Первоначальная реализация на растровых DSM
│ └── ... # Подход на основе 2.5D viewshed (GDAL Viewshed)
│
├── v2/
│ ├── src/ # Основной код алгоритма
│ │ ├── VectorDataProcessor.py # Загрузка и трансформация векторных данных (OSM, ЕГРОКН)
│ │ ├── TerrainGenerator.py # Построение полигональной модели рельефа
│ │ ├── MeshProcessor.py # Экструзия зданий, сборка сцены
│ │ └── VisibilityAnalyzer.py # Трассировка лучей, расчёт видимости
│ │
│ ├── compare_experiments.py # Вспомогательные модули для иллюстраций в тексте ВКР
│ └── run_viewsheds_cli.py # Синтетические валидационные прогоны (sDSM-pipeline)
│
└── environment.yml # Conda-окружение
Первоначальная реализация, основанная на 2.5D-представлении городского пространства. Использует GDAL Viewshed в качестве ядра. Оставлена в репозитории для сравнения подходов.
Реализация пространственно-адаптивного анализа видимости в трёхмерном полигональном пространстве. Четыре модуля соответствуют четырём зонам ответственности согласно принципу SRP.
conda env create -f environment.yml
conda activate visibilityfrom v2.src.VectorDataProcessor import VectorDataProcessor
from v2.src.TerrainGenerator import TerrainGenerator
from v2.src.MeshProcessor import MeshProcessor
from v2.src.VisibilityAnalyzer import VisibilityAnalyzer
# Задать целевой объект и область анализа
target = ... # GeoDataFrame с полигоном целевого объекта
area = target.buffer(1000)
# Собрать сцену
vdp = VectorDataProcessor()
buildings = vdp.get_buildings(area)
heritage = vdp.get_heritage_objects(area)
obs_points = vdp.generate_observation_points(area, spacing=5.0)
terrain_mesh = TerrainGenerator().generate_terrain(area, mode="flat")
scene_mesh = MeshProcessor().extrude_buildings(buildings, heritage)
combined = MeshProcessor().create_mesh_with_terrain(scene_mesh, terrain_mesh)
# Рассчитать видимость
analyzer = VisibilityAnalyzer()
results = analyzer.compute_visibility(obs_points, target, combined)
gdf = analyzer.create_visibility_map(obs_points, results)Схема валидации основана на сравнении с эталонным алгоритмом GDAL Viewshed (Wang, 2000). Из полигональной модели синтезируется растровая sDSM, на которой запускается эталон. Сходство бассейнов видимости оценивается коэффициентом Жаккара (IoU), пространственная структура расхождений — индексом Морана.
Медианный IoU на синтетической модели при разрешении 2 м: ≈ 0.87–0.95 в зависимости от локации.
Скрипты валидационных прогонов: v2/validation/
- Текст ВКР — по запросу
- Исходный код алгоритма — в этом репозитории (
v2/src/)