TerrainProvider

Назначение и роль TerrainProvider

TerrainProvider является базовым интерфейсом системы рельефа в CesiumJS и отвечает за поставку данных о высотах (terrain data), которые используются для построения 3D-модели поверхности Земли. Именно через него движок получает информацию о геометрии местности: горы, долины, впадины, плато и другие формы рельефа.

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

Ключевая особенность архитектуры:

  • отделение логики визуализации от источника данных
  • поддержка разных форматов рельефа
  • динамическая подгрузка тайлов по мере перемещения камеры
  • уровень детализации (LOD) в зависимости от расстояния

Базовая архитектура TerrainProvider

TerrainProvider в CesiumJS представляет собой абстрактный класс с набором методов, которые должны быть реализованы конкретными провайдерами:

  • requestTileGeometry
  • getLevelMaximumGeometricError
  • getTileDataAvailable
  • requestMetadata
  • getTileDataAvailable

Каждый провайдер отвечает за:

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

Внутри движка Cesium используется механизм quadtree, где поверхность Земли разбивается на иерархическую структуру плиток (tiles). Каждый узел дерева может быть запрошен через TerrainProvider.


Основные реализации TerrainProvider

CesiumTerrainProvider

Наиболее распространённая реализация — CesiumTerrainProvider, использующая формат quantized-mesh.

Особенности:

  • поддержка стриминга данных с серверов Cesium ion или совместимых сервисов
  • высокая детализация рельефа
  • оптимизированная передача данных (сжатие, квантование)
  • поддержка нормалей и текстурных данных

Пример использования:

import { CesiumTerrainProvider } from "cesium";

const terrainProvider = new CesiumTerrainProvider({
    url: "https://assets.agi.com/stk-terrain/world"
});

При подключении такого провайдера Cesium начинает запрашивать тайлы рельефа в формате quantized-mesh и строить геометрию поверхности.


EllipsoidTerrainProvider

Этот провайдер представляет собой упрощённую модель — идеально гладкий эллипсоид без реального рельефа.

Характеристики:

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

Пример:

import { EllipsoidTerrainProvider } from "cesium";

const terrainProvider = new EllipsoidTerrainProvider();

Используется, когда рельеф не требуется или необходимо ускорить рендеринг.


UrlTemplateTerrainProvider

Позволяет подключать кастомные тайловые сервисы, где URL формируется по шаблону.

Поддерживает:

  • heightmap-тайлы
  • пользовательские серверы
  • простые форматы изображений высот

Пример:

import { UrlTemplateTerrainProvider } from "cesium";

const terrainProvider = new UrlTemplateTerrainProvider({
    url: "https://example.com/terrain/{z}/{x}/{y}.png"
});

Ограничение: не поддерживает сложные форматы вроде quantized-mesh без дополнительной обработки.


Форматы данных рельефа

Heightmap terrain

Самый простой формат:

  • каждый тайл — изображение (обычно grayscale)
  • яркость пикселя соответствует высоте
  • низкая точность по сравнению с mesh-форматами

Преимущества:

  • простота реализации
  • широкая поддержка
  • небольшой размер данных

Недостатки:

  • ограниченная детализация
  • артефакты на крутых склонах

Quantized-mesh

Основной современный формат в CesiumJS.

Особенности:

  • хранит треугольную сетку (mesh)
  • использует квантование координат
  • поддерживает нормали и окраску
  • оптимизирован для потоковой передачи

Преимущества:

  • высокая точность
  • эффективная компрессия
  • корректное отображение сложного рельефа

Принцип работы TerrainProvider внутри Cesium

Процесс получения рельефа можно описать по этапам:

  1. Камера определяет область видимости
  2. Quadtree выбирает нужные тайлы
  3. TerrainProvider запрашивает данные для тайлов
  4. Полученные данные декодируются
  5. Генерируется геометрия (triangulation)
  6. Применяется LOD-оптимизация
  7. Результат передаётся в рендерер WebGL

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


Методы TerrainProvider API

requestTileGeometry

Отвечает за загрузку данных тайла.

requestTileGeometry(x, y, level)

Возвращает Promise с геометрией тайла.


getLevelMaximumGeometricError

Определяет допустимую погрешность для уровня детализации.

  • чем выше уровень — тем меньше ошибка
  • влияет на LOD-выбор

getTileDataAvailable

Проверяет наличие данных для конкретного тайла.

Используется для предотвращения лишних запросов.


readyPromise

Promise, сигнализирующий о готовности провайдера.

terrainProvider.readyPromise.then(() => {
    console.log("Terrain ready");
});

Интеграция TerrainProvider в Scene

TerrainProvider подключается через объект Viewer или Scene.

import { Viewer, CesiumTerrainProvider } from "cesium";

const viewer = new Viewer("cesiumContainer", {
    terrainProvider: new CesiumTerrainProvider({
        url: "https://assets.agi.com/stk-terrain/world"
    })
});

После подключения:

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

Влияние TerrainProvider на координаты и высоты

TerrainProvider влияет на все вычисления, связанные с высотой:

  • sampleTerrain — получение высоты в точке
  • позиционирование 3D-объектов
  • трассировка лучей по поверхности
  • расчёт расстояний по рельефу

Пример:

import { sampleTerrain } from "cesium";

const positions = [
    Cesium.Cartographic.fromDegrees(30.5, 50.5)
];

sampleTerrain(terrainProvider, 10, positions).then((updated) => {
    console.log(updated[0].height);
});

Кэширование и производительность

TerrainProvider активно использует кэширование:

  • LRU-кэш тайлов
  • повторное использование геометрии
  • компрессия сеток
  • предзагрузка соседних тайлов

Факторы производительности:

  • глубина quadtree
  • размер тайлов
  • формат данных
  • качество сети
  • уровень детализации сцены

Пользовательские TerrainProvider

Создание собственного TerrainProvider возможно через реализацию интерфейса.

Минимальная структура:

class CustomTerrainProvider {
    constructor() {
        this.ready = true;
        this.readyPromise = Promise.resolve(true);
    }

    requestTileGeometry(x, y, level) {
        return fetch(`/terrain/${level}/${x}/${y}`)
            .then(r => r.arrayBuffer());
    }

    getLevelMaximumGeometricError(level) {
        return 1000 / (level + 1);
    }

    getTileDataAvailable(x, y, level) {
        return true;
    }
}

Такая реализация позволяет:

  • подключать собственные GIS-данные
  • интегрировать локальные базы высот
  • использовать нестандартные форматы

Ограничения TerrainProvider

Несмотря на гибкость, существуют ограничения:

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

Связь TerrainProvider с другими системами Cesium

TerrainProvider тесно взаимодействует с:

  • ImageryProvider — накладывает текстуры на рельеф
  • Scene — управляет рендерингом
  • Camera — определяет область загрузки
  • Entity — корректирует высоту объектов
  • Globe — представляет глобальную поверхность

Эта связка формирует полную 3D-географическую модель.


Роль TerrainProvider в геопространственном моделировании

TerrainProvider является ключевым компонентом для:

  • геодезических систем
  • симуляторов полётов
  • картографических приложений
  • визуализации спутниковых данных
  • анализа ландшафта

Без него 3D-глобус теряет физическую достоверность и превращается в гладкую сферу без рельефа.