Cartographic координаты

Геометрическая модель представления поверхности

В CesiumJS фундаментальная модель позиционирования основана на эллипсоиде WGS84, который аппроксимирует форму Земли. Любая точка на поверхности или над ней описывается через систему Cartographic координат, включающую:

  • долготу (longitude)
  • широту (latitude)
  • высоту (height)

Эта система является промежуточным представлением между геодезическими координатами и декартовыми координатами сцены.

Структура Cesium.Cartographic

В CesiumJS координаты Cartographic представлены объектом Cesium.Cartographic, который хранит значения в радианах для широты и долготы и в метрах для высоты:

const carto = new Cesium.Cartographic(
    longitude,
    latitude,
    height
);

Ключевая особенность:

  • longitude — радианы
  • latitude — радианы
  • height — метры относительно поверхности эллипсоида

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

Преобразование градусов в радианы

В большинстве внешних источников координаты задаются в градусах. CesiumJS предоставляет утилиты для преобразования:

const longitude = Cesium.Math.toRadians(45.0);
const latitude = Cesium.Math.toRadians(60.0);

const carto = new Cesium.Cartographic(longitude, latitude, 1000.0);

Также возможно обратное преобразование:

const lonDeg = Cesium.Math.toDegrees(carto.longitude);
const latDeg = Cesium.Math.toDegrees(carto.latitude);

Эллипсоид и система отсчёта высоты

Высота в Cartographic измеряется относительно поверхности эллипсоида WGS84, а не уровня моря. Это создаёт важное различие:

  • геоидальная высота (MSL) — физический уровень моря
  • эллипсоидальная высота — математическая модель

CesiumJS использует именно эллипсоидальную модель, что упрощает расчёты и обеспечивает согласованность в 3D пространстве.

Преобразование Cartographic → Cartesian3

Для отображения в сцене CesiumJS использует декартову систему координат Cartesian3. Преобразование выполняется через эллипсоид:

const cartesian = Cesium.Ellipsoid.WGS84.cartographicToCartesian(carto);

Алгоритм включает:

  • вычисление нормали к эллипсоиду
  • масштабирование радиус-вектора
  • добавление высоты вдоль нормали

Обратное преобразование Cartesian3 → Cartographic

Получение географических координат из 3D точки выполняется следующим образом:

const carto = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian);

Результат содержит:

  • долготу в радианах
  • широту в радианах
  • высоту в метрах

Это преобразование критично для:

  • picking объектов на поверхности
  • измерений расстояний
  • работы с террейном

Нормализация значений

Долгота в Cartographic не ограничена диапазоном, но обычно приводится к интервалу:

  • [-π, π] или [0, 2π]

CesiumJS предоставляет нормализацию:

const lon = Cesium.Math.negativePiToPi(longitude);

Широта ограничена физически:

  • [-π/2, π/2]

Выход за пределы приводит к некорректной геометрии.

Особенности хранения данных

Cartographic не является визуальной сущностью. Это:

  • математическая модель положения
  • промежуточное представление между слоями системы

Внутри CesiumJS Cartographic используется для:

  • тайловых систем (imagery/terrain)
  • интерполяции поверхностей
  • геометрических вычислений
  • построения лучей и пересечений

Связь с тайловой системой

В контексте 3D Tiles и terrain:

  • координаты вершин часто конвертируются в Cartographic
  • текстуры накладываются в пространстве долгота/широта
  • высота интерпретируется относительно локального террейна

Интерполяция Cartographic координат

При линейной интерполяции между двумя точками важно учитывать сферическую природу координат:

const result = Cesium.Cartographic.lerp(
    startCarto,
    endCarto,
    t,
    new Cesium.Cartographic()
);

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

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

Ошибки при работе с Cartographic

Распространённые проблемы:

1. Использование градусов вместо радиан

// некорректно
new Cesium.Cartographic(45, 60, 1000);

// корректно
new Cesium.Cartographic(
    Cesium.Math.toRadians(45),
    Cesium.Math.toRadians(60),
    1000
);

2. Игнорирование системы высот

Высота воспринимается как эллипсоидальная, что приводит к:

  • смещению объектов относительно terrain
  • неверным измерениям расстояний

3. Неправильная нормализация долготы

При пересечении ±180° возникают скачки координат.

Работа с массивами Cartographic

Для оптимизации CesiumJS часто использует TypedArray-подобные структуры:

const positions = [
    new Cesium.Cartographic(lon1, lat1, h1),
    new Cesium.Cartographic(lon2, lat2, h2),
    new Cesium.Cartographic(lon3, lat3, h3)
];

Такие массивы применяются в:

  • полигонах
  • полилиниях
  • terrain sampling

Привязка к поверхности

Cartographic координаты становятся основой для проецирования на поверхность:

const positions = Cesium.Cartographic.fromCartesianArray(cartesianArray);

или через выборку высот:

Cesium.sampleTerrainMostDetailed(
    viewer.terrainProvider,
    cartographics
);

Роль в геодезических вычислениях

Cartographic является базовой системой для:

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

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

Итерации и точность

При частых преобразованиях между Cartographic и Cartesian3 возникает накопление погрешности:

  • численные ошибки в радианах
  • деградация точности на больших расстояниях
  • артефакты при интерполяции

Поэтому предпочтительно минимизировать цепочки преобразований и работать в одной системе координат на этапе вычислений.