В основе CesiumJS лежит глобальная модель Земли, построенная на эллипсоиде WGS84. Все пространственные данные в движке в конечном итоге приводятся к трёхмерной декартовой системе координат ECEF, где центр совпадает с центром масс планеты.
Переход между географическими координатами (широта, долгота, высота) и ECEF осуществляется через классы эллипсоида и преобразования Cesium. Однако при работе с 2D-тайлами и растровыми слоями появляется дополнительный уровень абстракции — картографическая проекция.
CesiumJS поддерживает два базовых варианта:
Обе реализуют интерфейс Projection, определяющий правила
перехода между географическими координатами и плоскостью тайлов.
Любая проекция в CesiumJS представляет собой объект, реализующий методы:
project(cartographic, result)unproject(cartesian, result)где:
Cartographic — широта, долгота, высота,Cartesian2 — координаты на плоскости проекции.Базовая абстракция задаётся классом Projection, а
конкретные реализации наследуются от него.
Ключевые встроенные реализации:
GeographicProjectionWebMercatorProjectionГеографическая проекция напрямую отображает:
без нелинейных преобразований.
Это упрощённая модель, соответствующая равнопромежуточной (equirectangular) схеме.
Проекция Web Mercator используется большинством веб-карт.
Формулы:
где:
Эта проекция нелинейно искажает площади, но обеспечивает удобную тайловую структуру.
Проекция в CesiumJS тесно связана с TilingScheme. Именно
он определяет разбиение пространства на тайлы и их соответствие
координатам.
Интерфейс включает:
rectangleToNativeRectangletileXYToRectanglepositionToTileXYgetNumberOfXTilesAtLevelgetNumberOfYTilesAtLevelЧерез TilingScheme определяется не только проекция, но и
логика LOD (levels of detail).
Основные реализации:
GeographicTilingSchemeWebMercatorTilingSchemeКаждая из них использует соответствующую проекцию.
Создание собственной системы координат в CesiumJS возможно на двух уровнях:
Projection,TilingScheme.Первый уровень отвечает за математическое преобразование координат. Второй — за разбиение пространства на тайлы.
Чаще всего пользовательская проекция требует обоих компонентов одновременно.
Минимальная структура кастомной проекции включает методы
преобразования между Cartographic и
Cartesian2.
Аффинная проекция используется для локальных систем координат:
Общая форма:
Где коэффициенты задают трансформацию.
В CesiumJS это выражается через:
project — перевод в плоскость,unproject — обратное преобразование.Особенность: Cesium ожидает согласованность между методами, иначе ломается пространственная согласованность сцены.
Все географические координаты в Cesium привязаны к эллипсоиду Ellipsoid.
При создании кастомной проекции часто требуется:
Ellipsoid.WGS84,Изменение эллипсоида влияет на:
Основная сложность кастомных проекций возникает на уровне тайловой сетки.
TilingScheme определяет:
Любой тайл определяется:
level,x, y,Пример базовой логики:
При создании собственного TilingScheme реализуются
методы:
getNumberOfXTilesAtLevel(level)getNumberOfYTilesAtLevel(level)tileXYToRectangle(x, y, level, result)positionToTileXY(position, level, result)Для простой равнопромежуточной модели:
Каждый тайл получает равный диапазон широты и долготы.
В более сложных случаях проекция может включать:
Пример трансформации:
Такая модель требует строгого согласования с
TilingScheme, иначе тайлы будут перекрываться.
Пользовательская проекция почти всегда используется совместно с
ImageryProvider.
Ключевой момент:
ImageryProvider.tilingScheme должен совпадать с
кастомной проекцией.Иначе:
CesiumJS объединяет:
Ключевые преобразования:
Cartographic → Cartesian3Cartesian3 → CartographicProjection ↔︎ TilingSchemeНесогласованность любого элемента приводит к:
Внутренние преобразования Cesium используют матрицы:
Matrix3 — 2D преобразования,Matrix4 — переходы между системами координат,Transforms — набор геодезических преобразований.Пользовательская проекция может опираться на:
Несмотря на гибкость, существуют ограничения:
Поэтому сложные проекции часто требуют:
LOD зависит от:
Нелинейные проекции требуют адаптивного:
Иначе возникает эффект:
При пользовательских проекциях критичны:
CesiumJS использует 64-битную точность, но при кастомных формулах возможны: