Система координат и геопозиционирование

Библиотека CesiumJS предназначена для визуализации геопространственных данных на виртуальной модели Земли. Практически любая операция в сцене связана с координатами: размещение объектов, движение камер, построение маршрутов, отображение спутниковых орбит, работа с рельефом и трехмерными моделями.

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

Основными системами координат являются:

  • географические координаты;
  • декартовы координаты Earth-Centered Earth-Fixed (ECEF);
  • локальные системы координат;
  • экранные координаты;
  • координаты объектов и моделей.

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


Географические координаты

Географическая система координат представляет положение точки на поверхности Земли с помощью трех параметров:

  • широта (Latitude);
  • долгота (Longitude);
  • высота (Height).

Пример координат:

Широта: 55.7558
Долгота: 37.6176
Высота: 200 метров

В CesiumJS для работы с географическими координатами используется класс Cartographic.

Создание объекта:

const position = new Cesium.Cartographic(
    Cesium.Math.toRadians(37.6176),
    Cesium.Math.toRadians(55.7558),
    200
);

Важно учитывать, что:

  • долгота хранится в радианах;
  • широта хранится в радианах;
  • высота задается в метрах.

Для перевода градусов в радианы применяется:

Cesium.Math.toRadians(value);

Обратное преобразование:

Cesium.Math.toDegrees(value);

Эллипсоид WGS84

Все координаты в CesiumJS основаны на мировой геодезической системе WGS84.

Земля не является идеальной сферой. Для более точного описания используется эллипсоид вращения.

Параметры WGS84:

  • большая полуось: 6378137 метров;
  • малая полуось: 6356752.314245 метров.

В CesiumJS эллипсоид доступен через объект:

Cesium.Ellipsoid.WGS84

Получение радиуса:

const radius = Cesium.Ellipsoid.WGS84.maximumRadius;

Использование единой модели Земли позволяет корректно отображать данные GPS, спутниковые снимки, 3D Tiles и картографические сервисы.


Декартова система координат ECEF

Основной внутренней системой координат CesiumJS является Earth-Centered Earth-Fixed (ECEF).

В этой системе:

  • начало координат находится в центре Земли;
  • ось X проходит через экватор и нулевой меридиан;
  • ось Y проходит через экватор и 90° восточной долготы;
  • ось Z направлена к Северному полюсу.

Схематично:

          Z
          |
          |
          |
          O------ Y
         /
        /
       X

Для хранения таких координат используется класс Cartesian3.

Пример:

const point = new Cesium.Cartesian3(
    1000000,
    2000000,
    3000000
);

Все объекты сцены фактически располагаются именно в этой системе координат.


Преобразование географических координат в Cartesian3

Наиболее распространенная операция — создание позиции объекта по широте и долготе.

Для этого используется метод:

Cesium.Cartesian3.fromDegrees()

Пример:

const position = Cesium.Cartesian3.fromDegrees(
    37.6176,
    55.7558,
    200
);

Параметры:

  1. долгота;
  2. широта;
  3. высота.

Добавление объекта:

viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(
        37.6176,
        55.7558,
        200
    ),
    point: {
        pixelSize: 10
    }
});

Во время выполнения Cesium автоматически переводит географические координаты в систему ECEF.


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

Обратное преобразование выполняется через эллипсоид.

Исходная позиция:

const cartesian =
    Cesium.Cartesian3.fromDegrees(
        37.6176,
        55.7558,
        200
    );

Конвертация:

const cartographic =
    Cesium.Cartographic.fromCartesian(
        cartesian
    );

Получение координат в градусах:

const longitude =
    Cesium.Math.toDegrees(
        cartographic.longitude
    );

const latitude =
    Cesium.Math.toDegrees(
        cartographic.latitude
    );

const height =
    cartographic.height;

Результат:

console.log(longitude);
console.log(latitude);
console.log(height);

Такая операция часто используется при обработке кликов пользователя по карте.


Класс Cartesian3

Cartesian3 является одним из наиболее важных классов библиотеки.

Создание объекта:

const point =
    new Cesium.Cartesian3(
        100,
        200,
        300
    );

Доступ к компонентам:

console.log(point.x);
console.log(point.y);
console.log(point.z);

Векторные операции

Расстояние между точками

const distance =
    Cesium.Cartesian3.distance(
        pointA,
        pointB
    );

Сложение векторов

const result =
    Cesium.Cartesian3.add(
        pointA,
        pointB,
        new Cesium.Cartesian3()
    );

Вычитание

const result =
    Cesium.Cartesian3.subtract(
        pointA,
        pointB,
        new Cesium.Cartesian3()
    );

Нормализация

const normalized =
    Cesium.Cartesian3.normalize(
        vector,
        new Cesium.Cartesian3()
    );

Скалярное произведение

const dot =
    Cesium.Cartesian3.dot(
        vectorA,
        vectorB
    );

Векторное произведение

const cross =
    Cesium.Cartesian3.cross(
        vectorA,
        vectorB,
        new Cesium.Cartesian3()
    );

Эти операции активно используются в вычислениях ориентации объектов и движении камеры.


Высота над поверхностью Земли

Высота в CesiumJS отсчитывается относительно эллипсоида WGS84.

Например:

Cesium.Cartesian3.fromDegrees(
    37.6176,
    55.7558,
    0
);

Высота равна:

0 метров относительно эллипсоида

Важно понимать разницу между:

  • высотой над эллипсоидом;
  • высотой над уровнем моря;
  • высотой над рельефом.

В некоторых регионах эти значения могут различаться на десятки метров.


Получение высоты рельефа

Для работы с рельефом используется выборка данных местности.

Пример:

const terrainProvider =
    await Cesium.createWorldTerrainAsync();

viewer.terrainProvider =
    terrainProvider;

Получение реальной высоты точки:

const positions = [
    Cesium.Cartographic.fromDegrees(
        37.6176,
        55.7558
    )
];

const updated =
    await Cesium.sampleTerrainMostDetailed(
        terrainProvider,
        positions
    );

console.log(updated[0].height);

Метод выполняет запрос к источнику данных рельефа и возвращает актуальную высоту поверхности.


Локальные системы координат

При работе с объектами часто требуется система координат, связанная с конкретной точкой Земли.

Например:

  • моделирование техники;
  • отображение зданий;
  • работа с датчиками;
  • навигация.

Для этого используются локальные системы координат.

Наиболее распространенная схема:

East
North
Up

Сокращенно — ENU.


Система East-North-Up

Оси ENU:

  • East — восток;
  • North — север;
  • Up — вверх.

Для построения матрицы преобразования используется:

const transform =
    Cesium.Transforms.eastNorthUpToFixedFrame(
        position
    );

Здесь:

position

— точка на поверхности Земли.

Полученная матрица связывает локальные координаты объекта с глобальной системой ECEF.


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

Пример размещения модели:

const position =
    Cesium.Cartesian3.fromDegrees(
        37.6176,
        55.7558
    );

const matrix =
    Cesium.Transforms
        .eastNorthUpToFixedFrame(
            position
        );

Матрица может быть назначена модели:

model.modelMatrix = matrix;

После этого локальная система модели будет ориентирована относительно поверхности Земли.


Матрицы преобразований

Для работы с координатами используются матрицы.

Основные классы:

Cesium.Matrix3
Cesium.Matrix4

Матрица 4×4 содержит:

  • перенос;
  • масштаб;
  • вращение.

Создание матрицы переноса:

const matrix =
    Cesium.Matrix4.fromTranslation(
        translation
    );

Применение:

const transformed =
    Cesium.Matrix4.multiplyByPoint(
        matrix,
        point,
        new Cesium.Cartesian3()
    );

Координаты камеры

Камера также использует систему координат ECEF.

Получение позиции:

const position =
    viewer.camera.position;

Переход к координатам:

viewer.camera.flyTo({
    destination:
        Cesium.Cartesian3.fromDegrees(
            37.6176,
            55.7558,
            5000
        )
});

Высота камеры задается в метрах.


Экранные координаты

Для взаимодействия пользователя используются экранные координаты.

Пример:

handler.setInputAction(
    function(click) {

    },
    Cesium.ScreenSpaceEventType.LEFT_CLICK
);

Координаты курсора:

click.position.x
click.position.y

Эти значения выражены в пикселях.


Преобразование экрана в географические координаты

Определение точки на поверхности Земли:

const cartesian =
    viewer.scene.pickPosition(
        click.position
    );

Конвертация:

const cartographic =
    Cesium.Cartographic.fromCartesian(
        cartesian
    );

Получение координат:

const longitude =
    Cesium.Math.toDegrees(
        cartographic.longitude
    );

const latitude =
    Cesium.Math.toDegrees(
        cartographic.latitude
    );

Такой механизм используется для:

  • выбора объектов;
  • измерений;
  • построения маршрутов;
  • создания пользовательских меток.

Геопозиционирование с помощью GPS

Большинство мобильных устройств предоставляют координаты через API браузера.

Получение местоположения:

navigator.geolocation.getCurrentPosition(
    function(position) {

        const longitude =
            position.coords.longitude;

        const latitude =
            position.coords.latitude;

        const height =
            position.coords.altitude || 0;
    }
);

Позиционирование камеры:

viewer.camera.flyTo({
    destination:
        Cesium.Cartesian3.fromDegrees(
            longitude,
            latitude,
            height + 1000
        )
});

Отображение текущего местоположения

Создание маркера:

viewer.entities.add({
    position:
        Cesium.Cartesian3.fromDegrees(
            longitude,
            latitude,
            height
        ),
    point: {
        pixelSize: 12
    }
});

Метка будет отображаться в координатах, полученных от GPS-приемника.


Отслеживание перемещения пользователя

Непрерывное получение координат:

navigator.geolocation.watchPosition(
    function(position) {

        const longitude =
            position.coords.longitude;

        const latitude =
            position.coords.latitude;

        const altitude =
            position.coords.altitude || 0;

    }
);

Обновление объекта:

entity.position =
    Cesium.Cartesian3.fromDegrees(
        longitude,
        latitude,
        altitude
    );

Подход применяется в:

  • транспортных системах;
  • навигации;
  • мониторинге техники;
  • геотрекинге.

Геодезические и прямолинейные расстояния

Расстояние между двумя точками можно вычислить несколькими способами.

Прямолинейное расстояние:

const distance =
    Cesium.Cartesian3.distance(
        pointA,
        pointB
    );

Такое расстояние проходит через пространство.

Для измерений по поверхности Земли используются геодезические методы.


Эллипсоидальная геодезическая линия

Cesium предоставляет класс:

Cesium.EllipsoidGeodesic

Создание:

const start =
    Cesium.Cartographic.fromDegrees(
        37.6176,
        55.7558
    );

const end =
    Cesium.Cartographic.fromDegrees(
        30.3141,
        59.9386
    );

const geodesic =
    new Cesium.EllipsoidGeodesic(
        start,
        end
    );

Длина маршрута:

console.log(
    geodesic.surfaceDistance
);

Результат возвращается в метрах.


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

Получение промежуточной точки маршрута:

const midpoint =
    geodesic.interpolateUsingFraction(
        0.5
    );

Значение:

0.5

соответствует середине пути.

Использование интерполяции необходимо для:

  • анимации перемещения;
  • построения маршрутов;
  • расчета траекторий;
  • отображения путевых точек.

Точность вычислений и двойная арифметика

При отображении планеты возникают координаты величиной в миллионы метров:

6378137 метров

Для сохранения точности CesiumJS использует вычисления двойной точности (double precision).

Это позволяет:

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

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