TerrainProvider является базовым интерфейсом системы
рельефа в CesiumJS и отвечает за поставку данных о высотах (terrain
data), которые используются для построения 3D-модели поверхности Земли.
Именно через него движок получает информацию о геометрии местности:
горы, долины, впадины, плато и другие формы рельефа.
Основная задача TerrainProvider заключается в
абстрагировании источника данных о высотах. В CesiumJS рельеф может
поступать из разных источников: локальных файлов, удалённых сервисов,
тайловых серверов или процедурно сгенерированных моделей. Независимо от
источника, движок работает через единый интерфейс.
Ключевая особенность архитектуры:
TerrainProvider в CesiumJS представляет собой
абстрактный класс с набором методов, которые должны быть реализованы
конкретными провайдерами:
requestTileGeometrygetLevelMaximumGeometricErrorgetTileDataAvailablerequestMetadatagetTileDataAvailableКаждый провайдер отвечает за:
Внутри движка Cesium используется механизм quadtree, где поверхность Земли разбивается на иерархическую структуру плиток (tiles). Каждый узел дерева может быть запрошен через TerrainProvider.
Наиболее распространённая реализация —
CesiumTerrainProvider, использующая формат
quantized-mesh.
Особенности:
Пример использования:
import { CesiumTerrainProvider } from "cesium";
const terrainProvider = new CesiumTerrainProvider({
url: "https://assets.agi.com/stk-terrain/world"
});
При подключении такого провайдера Cesium начинает запрашивать тайлы рельефа в формате quantized-mesh и строить геометрию поверхности.
Этот провайдер представляет собой упрощённую модель — идеально гладкий эллипсоид без реального рельефа.
Характеристики:
Пример:
import { EllipsoidTerrainProvider } from "cesium";
const terrainProvider = new EllipsoidTerrainProvider();
Используется, когда рельеф не требуется или необходимо ускорить рендеринг.
Позволяет подключать кастомные тайловые сервисы, где URL формируется по шаблону.
Поддерживает:
Пример:
import { UrlTemplateTerrainProvider } from "cesium";
const terrainProvider = new UrlTemplateTerrainProvider({
url: "https://example.com/terrain/{z}/{x}/{y}.png"
});
Ограничение: не поддерживает сложные форматы вроде quantized-mesh без дополнительной обработки.
Самый простой формат:
Преимущества:
Недостатки:
Основной современный формат в CesiumJS.
Особенности:
Преимущества:
Процесс получения рельефа можно описать по этапам:
Важный момент: загрузка происходит асинхронно, что позволяет постепенно уточнять рельеф по мере приближения камеры.
Отвечает за загрузку данных тайла.
requestTileGeometry(x, y, level)
Возвращает Promise с геометрией тайла.
Определяет допустимую погрешность для уровня детализации.
Проверяет наличие данных для конкретного тайла.
Используется для предотвращения лишних запросов.
Promise, сигнализирующий о готовности провайдера.
terrainProvider.readyPromise.then(() => {
console.log("Terrain ready");
});
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 влияет на все вычисления, связанные с высотой:
sampleTerrain — получение высоты в точкеПример:
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 активно использует кэширование:
Факторы производительности:
Создание собственного 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;
}
}
Такая реализация позволяет:
Несмотря на гибкость, существуют ограничения:
TerrainProvider тесно взаимодействует с:
ImageryProvider — накладывает текстуры на рельефScene — управляет рендерингомCamera — определяет область загрузкиEntity — корректирует высоту объектовGlobe — представляет глобальную поверхностьЭта связка формирует полную 3D-географическую модель.
TerrainProvider является ключевым компонентом для:
Без него 3D-глобус теряет физическую достоверность и превращается в гладкую сферу без рельефа.