Библиотека CesiumJS предназначена для визуализации геопространственных данных на виртуальной модели Земли. Практически любая операция в сцене связана с координатами: размещение объектов, движение камер, построение маршрутов, отображение спутниковых орбит, работа с рельефом и трехмерными моделями.
В отличие от традиционных двумерных картографических библиотек, CesiumJS использует несколько взаимосвязанных систем координат. Каждая из них предназначена для решения определенного класса задач и обеспечивает высокую точность вычислений на масштабах всей планеты.
Основными системами координат являются:
Понимание принципов их работы является фундаментом для разработки геоинформационных приложений на базе CesiumJS.
Географическая система координат представляет положение точки на поверхности Земли с помощью трех параметров:
Пример координат:
Широта: 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);
Все координаты в CesiumJS основаны на мировой геодезической системе WGS84.
Земля не является идеальной сферой. Для более точного описания используется эллипсоид вращения.
Параметры WGS84:
В CesiumJS эллипсоид доступен через объект:
Cesium.Ellipsoid.WGS84
Получение радиуса:
const radius = Cesium.Ellipsoid.WGS84.maximumRadius;
Использование единой модели Земли позволяет корректно отображать данные GPS, спутниковые снимки, 3D Tiles и картографические сервисы.
Основной внутренней системой координат CesiumJS является Earth-Centered Earth-Fixed (ECEF).
В этой системе:
Схематично:
Z
|
|
|
O------ Y
/
/
X
Для хранения таких координат используется класс
Cartesian3.
Пример:
const point = new Cesium.Cartesian3(
1000000,
2000000,
3000000
);
Все объекты сцены фактически располагаются именно в этой системе координат.
Наиболее распространенная операция — создание позиции объекта по широте и долготе.
Для этого используется метод:
Cesium.Cartesian3.fromDegrees()
Пример:
const position = Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558,
200
);
Параметры:
Добавление объекта:
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558,
200
),
point: {
pixelSize: 10
}
});
Во время выполнения Cesium автоматически переводит географические координаты в систему ECEF.
Обратное преобразование выполняется через эллипсоид.
Исходная позиция:
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 является одним из наиболее важных классов
библиотеки.
Создание объекта:
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.
Оси ENU:
Для построения матрицы преобразования используется:
const transform =
Cesium.Transforms.eastNorthUpToFixedFrame(
position
);
Здесь:
position
— точка на поверхности Земли.
Полученная матрица связывает локальные координаты объекта с глобальной системой ECEF.
Пример размещения модели:
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
);
Такой механизм используется для:
Большинство мобильных устройств предоставляют координаты через 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 предоставляет полноценную основу для построения профессиональных трехмерных геоинформационных систем, навигационных комплексов, цифровых двойников территорий и приложений глобального пространственного анализа.