Коридоры и зоны

Коридоры в геопространственной визуализации CesiumJS представляют собой вытянутые вдоль ломаной линии области фиксированной ширины, геометрически эквивалентные «ленточным» полигонам, построенным вокруг полилинии с учётом кривизны эллипсоида. В отличие от обычных линий, коридор обладает площадью, может заливаться материалом, участвовать в классификации поверхности и пересечении с 3D Tiles, что делает его инструментом моделирования транспортных маршрутов, инженерных трасс, коридоров движения и линейных зон влияния.

Коридор определяется как множество точек, находящихся на фиксированном расстоянии от центральной полилинии. Для каждой вершины пути строится локальная система координат на поверхности эллипсоида, затем вокруг сегментов формируются смещённые контуры. В местах поворота используются алгоритмы скругления, зависящие от типа угла:

  • Mitered — острое соединение сегментов
  • Rounded — дуговое сглаживание
  • Beveled — срезанный угол

В CesiumJS это управляется параметром cornerType, который влияет как на визуальное качество, так и на стоимость генерации геометрии.

Ключевым параметром остаётся ширина:

width: 200.0

Ширина интерпретируется в метрах и распределяется симметрично относительно центральной линии.


Corridor через Entity API

Высокоуровневое создание коридора реализуется через Entity-модель, где коридор выступает как графический компонент сущности:

const corridorEntity = viewer.entities.add({
    corridor: {
        positions: Cesium.Cartesian3.fromDegreesArray([
            30.5, 50.4,
            30.6, 50.45,
            30.8, 50.5
        ]),
        width: 300,
        material: Cesium.Color.BLUE.withAlpha(0.5),
        cornerType: Cesium.CornerType.ROUNDED
    }
});

В этом подходе Cesium автоматически выполняет:

  • дискретизацию геодезической линии
  • построение геометрии на эллипсоиде
  • пересчёт при изменении камеры или глобальных параметров сцены

Entity-уровень удобен для динамических сцен, где важна частая модификация координат или визуальных свойств.


Примитивный уровень: CorridorGeometry

Для сценариев высокой производительности используется низкоуровневый API через Primitive и GeometryInstance. В этом случае геометрия создаётся один раз и отправляется в GPU без постоянного пересчёта.

const corridorGeometry = new Cesium.CorridorGeometry({
    positions: Cesium.Cartesian3.fromDegreesArray([
        30.5, 50.4,
        30.6, 50.45,
        30.8, 50.5
    ]),
    width: 300.0,
    cornerType: Cesium.CornerType.MITERED
});

const instance = new Cesium.GeometryInstance({
    geometry: corridorGeometry,
    attributes: {
        color: Cesium.ColorGeometryInstanceAttribute.fromColor(
            Cesium.Color.RED.withAlpha(0.7)
        )
    }
});

viewer.scene.primitives.add(
    new Cesium.Primitive({
        geometryInstances: instance,
        appearance: new Cesium.PerInstanceColorAppearance({
            translucent: true,
            closed: true
        })
    })
);

Использование примитивов снижает накладные расходы JavaScript и повышает стабильность FPS при большом количестве коридоров.


Контурная визуализация и OutlineGeometry

Коридоры часто комбинируются с обводкой для усиления читаемости на фоне terrain и 3D Tiles. Для этого используется CorridorOutlineGeometry.

const outline = new Cesium.GeometryInstance({
    geometry: new Cesium.CorridorOutlineGeometry({
        positions: Cesium.Cartesian3.fromDegreesArray([...]),
        width: 300
    }),
    attributes: {
        color: Cesium.ColorGeometryInstanceAttribute.fromColor(
            Cesium.Color.WHITE
        )
    }
});

Обводка создаёт линейный каркас, который помогает визуально отделить коридор от подложки при низкой контрастности материалов.


Материалы и визуальные свойства

Коридоры поддерживают широкий набор материалов через систему Material CesiumJS. В отличие от простого цвета, материал может быть процедурным:

  • градиенты
  • полосатые текстуры
  • анимационные эффекты
  • шумовые шейдеры

Пример анимированного материала:

material: new Cesium.PolylineGlowMaterialProperty({
    glowPower: 0.2,
    color: Cesium.Color.CYAN
})

Также часто используется ImageMaterialProperty для наложения дорожной разметки или транспортных схем.


Коридоры как геозоны

Коридоры часто применяются как линейные геозоны, где важно не только отображение, но и пространственная логика: определение нахождения объектов внутри зоны влияния.

В таких сценариях коридор рассматривается как расширенная полоса вдоль маршрута, и используется совместно с:

  • Cesium.PolygonGeometry
  • Cesium.PolygonHierarchy
  • spatial queries через Cesium.Ellipsoid.contains

Типичный подход — создание буферной зоны вдоль маршрута с фиксированной шириной, где проверяется принадлежность объектов.


Полигональные зоны и вложенные области

В отличие от коридора, полигональные зоны позволяют моделировать сложные области с отверстиями и вложенными границами. Однако комбинация полигонов и коридоров часто используется для построения гибридных моделей:

  • коридор как центральная ось зоны
  • полигон как расширенная административная область
  • внутренние отверстия для исключённых территорий
polygon: {
    hierarchy: Cesium.Cartesian3.fromDegreesArray([...]),
    material: Cesium.Color.GREEN.withAlpha(0.3),
    extrudedHeight: 0
}

Классификация поверхности

Одна из ключевых возможностей коридоров — взаимодействие с рельефом и 3D-тайлами через classificationType. Это позволяет «приклеивать» зону к terrain или зданиям.

corridor: {
    positions: ...,
    width: 200,
    classificationType: Cesium.ClassificationType.TERRAIN
}

Доступные режимы:

  • TERRAIN — классификация рельефа
  • CESIUM_3D_TILE — классификация 3D-объектов
  • BOTH — комбинированный режим

В результате коридор может не просто отображаться поверх сцены, а модифицировать её визуальное представление, выделяя зоны дороги, коридоры коммуникаций или охранные полосы.


Высота и экструзия

Хотя классический коридор является поверхностной геометрией, его можно комбинировать с высотными параметрами сцены:

  • height — базовая высота над эллипсоидом
  • extrudedHeight — вертикальное вытягивание
corridor: {
    positions: ...,
    width: 250,
    height: 0,
    extrudedHeight: 1000,
    material: Cesium.Color.YELLOW.withAlpha(0.4)
}

Такой подход позволяет моделировать объемные коридоры воздушного движения, трубопроводов или ограниченных пространств.


Дискретизация и точность

Качество коридора зависит от параметра granularity, который определяет шаг разбиения линии на сегменты:

  • малое значение → высокая точность, высокая нагрузка
  • большое значение → упрощённая геометрия, меньшая детализация
granularity: Cesium.Math.RADIANS_PER_DEGREE * 0.1

При работе на глобальных сценах важно учитывать, что слишком грубая дискретизация приводит к визуальному «ломанию» коридора на поворотах.


CornerType и геометрия поворотов

Сложные маршруты с частыми изменениями направления требуют корректной обработки углов. Cesium реализует три базовых режима:

  • MITERED — минимальная геометрия, резкие углы
  • ROUNDED — плавные дуги, вычисление дополнительных вершин
  • BEVELED — компромисс между производительностью и гладкостью

Rounded-режим требует больше вычислений, но обеспечивает визуально корректные переходы на больших масштабах карты.


Производительность и оптимизация

При большом количестве коридоров критическими становятся:

  • количество вершин полилиний
  • использование Entity vs Primitive
  • пересчёт геометрии при изменении камеры
  • прозрачные материалы (overdraw)

Практические оптимизации:

  • использование Primitive для статических коридоров
  • уменьшение granularity
  • батчинг геометрий через GeometryInstance
  • минимизация прозрачности материалов
  • отключение depthFailMaterial, если не требуется

В сценах с тысячами коридоров Entity-подход становится узким местом из-за постоянной пересборки геометрии.


Взаимодействие с 3D Tiles и сценой

Коридоры активно используются как overlay-слои поверх городских моделей. При включённой классификации они могут:

  • «вырезать» части зданий
  • подсвечивать транспортные магистрали
  • формировать зоны охраны инфраструктуры
  • визуализировать маршруты дронов и транспорта

Взаимодействие происходит на уровне stencil buffer и depth testing, где коридор влияет не только на собственную отрисовку, но и на видимость других объектов сцены.


Геометрические ограничения на сфере

Поскольку Cesium работает на эллипсоиде WGS84, коридоры подчиняются геодезической геометрии:

  • расстояния измеряются по поверхности
  • ширина корректируется в зависимости от широты
  • прямые линии превращаются в геодезические кривые

Это приводит к тому, что коридор на глобальной карте может визуально изгибаться даже при «прямом» наборе координат в градусах.


Использование в моделировании зон влияния

Коридоры часто применяются для:

  • авиационных трасс
  • морских маршрутов
  • коридоров трубопроводов
  • линий электропередач
  • логистических маршрутов

В таких задачах они выступают как базовая геометрия для последующего анализа пересечений, агрегации статистики и построения пространственных ограничений.


Комбинирование с динамическими данными

Коридоры могут обновляться в реальном времени при изменении координат источников данных:

  • GPS-трекинг
  • телеметрия транспорта
  • симуляция движения

При Entity-подходе обновление координат приводит к автоматическому пересчёту геометрии, тогда как Primitive требует пересоздания экземпляра, но даёт больший контроль над производительностью.


Поведение при масштабировании сцены

На глобальных масштабах визуальная стабильность коридоров зависит от:

  • precision double-координат
  • depth precision near/far plane
  • terrain exaggeration
  • camera altitude

При низкой высоте камеры увеличивается детализация изгибов, при высокой — происходит агрегация сегментов, что снижает визуальную сложность сцены.