Линии являются одним из базовых графических примитивов в трёхмерной геоинформационной визуализации. С их помощью отображаются маршруты движения, границы территорий, инженерные коммуникации, траектории полётов, морские пути, кабельные сети, линии электропередачи и множество других пространственных объектов.
В CesiumJS для отображения линий используется объект Polyline. Полилиния представляет собой последовательность точек, соединённых отрезками. Каждая вершина задаётся географическими координатами, а система автоматически строит между ними непрерывную линию на поверхности Земли или в трёхмерном пространстве.
Наиболее распространённый способ создания линии — добавление сущности
через коллекцию viewer.entities.
const viewer = new Cesium.Viewer("cesiumContainer");
viewer.entities.add({
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray([
37.6176, 55.7558,
30.3141, 59.9386,
27.5615, 53.9023
]),
width: 4,
material: Cesium.Color.RED
}
});
В данном примере создаётся линия, проходящая через:
Основные параметры:
| Параметр | Назначение |
|---|---|
positions |
Массив координат вершин |
width |
Толщина линии |
material |
Материал отображения |
Самый удобный способ задания полилинии:
Cesium.Cartesian3.fromDegreesArray([
lon1, lat1,
lon2, lat2,
lon3, lat3
]);
Пример:
positions: Cesium.Cartesian3.fromDegreesArray([
-74.0060, 40.7128,
-118.2437, 34.0522,
-122.4194, 37.7749
])
Линия соединит:
Иногда координаты формируются динамически.
positions: [
Cesium.Cartesian3.fromDegrees(10, 50),
Cesium.Cartesian3.fromDegrees(20, 55),
Cesium.Cartesian3.fromDegrees(30, 60)
]
Такой подход удобен при программной генерации маршрутов.
Толщина задаётся свойством width.
polyline: {
positions: positions,
width: 10,
material: Cesium.Color.BLUE
}
Возможны любые значения:
width: 1
Тонкая линия.
width: 20
Широкая линия.
Следует учитывать, что максимальная поддерживаемая толщина зависит от графического драйвера и возможностей WebGL.
Для окраски используется материал.
material: Cesium.Color.YELLOW
Пример:
viewer.entities.add({
polyline: {
positions: positions,
width: 5,
material: Cesium.Color.YELLOW
}
});
Полупрозрачные линии позволяют визуально выделять маршруты без перекрытия карты.
material: Cesium.Color.RED.withAlpha(0.5)
Пример:
polyline: {
positions: positions,
width: 6,
material: Cesium.Color.GREEN.withAlpha(0.3)
}
По умолчанию точки располагаются на уровне поверхности Земли.
Высота задаётся третьим параметром.
Cesium.Cartesian3.fromDegrees(
longitude,
latitude,
height
)
Пример:
positions: [
Cesium.Cartesian3.fromDegrees(30, 50, 10000),
Cesium.Cartesian3.fromDegrees(40, 55, 10000)
]
Линия будет проходить на высоте 10 километров.
Каждая вершина может иметь собственную высоту.
positions: [
Cesium.Cartesian3.fromDegrees(10, 50, 0),
Cesium.Cartesian3.fromDegrees(20, 55, 5000),
Cesium.Cartesian3.fromDegrees(30, 60, 15000)
]
Получается пространственная ломаная линия.
Подобная техника часто применяется для:
Линия может повторять форму поверхности Земли.
polyline: {
positions: positions,
clampToGround: true,
width: 4,
material: Cesium.Color.ORANGE
}
Параметр:
clampToGround: true
заставляет линию прилегать к рельефу.
Особенно полезно для отображения:
По умолчанию Cesium строит сегменты вдоль поверхности эллипсоида.
Такие линии соответствуют кратчайшему пути по поверхности Земли.
Пример маршрута между континентами:
viewer.entities.add({
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray([
-74.0060, 40.7128,
139.6917, 35.6895
]),
width: 3,
material: Cesium.Color.CYAN
}
});
Линия будет следовать по геодезической дуге.
Параметр granularity определяет плотность промежуточных
точек.
polyline: {
positions: positions,
width: 5,
granularity: Cesium.Math.toRadians(1)
}
Меньшее значение:
granularity: Cesium.Math.toRadians(0.1)
создаёт более гладкую линию.
Большее значение снижает количество вычислений.
Свойство arcType определяет алгоритм соединения
вершин.
arcType: Cesium.ArcType.GEODESIC
Используется по умолчанию.
arcType: Cesium.ArcType.RHUMB
Сохраняет постоянный азимут.
Применяется в навигационных задачах.
arcType: Cesium.ArcType.NONE
Соединяет точки напрямую в трёхмерном пространстве.
polyline: {
positions: positions,
arcType: Cesium.ArcType.NONE
}
Подходит для инженерных и технических визуализаций.
Материалы позволяют создавать более сложный внешний вид линий.
material: Cesium.Color.RED
material: Cesium.Color.BLUE.withAlpha(0.4)
material: new Cesium.PolylineGlowMaterialProperty({
glowPower: 0.3,
color: Cesium.Color.CYAN
})
Пример:
polyline: {
positions: positions,
width: 12,
material: new Cesium.PolylineGlowMaterialProperty({
glowPower: 0.2,
color: Cesium.Color.LIME
})
}
Создаётся эффект неонового свечения.
Для отображения маршрутов и служебной графики часто используются штриховые линии.
material: new Cesium.PolylineDashMaterialProperty({
color: Cesium.Color.YELLOW
})
Полный пример:
viewer.entities.add({
polyline: {
positions: positions,
width: 4,
material: new Cesium.PolylineDashMaterialProperty({
color: Cesium.Color.WHITE,
dashLength: 16
})
}
});
dashLength: 20
gapColor: Cesium.Color.TRANSPARENT
color: Cesium.Color.ORANGE
Пример:
material: new Cesium.PolylineDashMaterialProperty({
color: Cesium.Color.ORANGE,
gapColor: Cesium.Color.BLACK,
dashLength: 10
})
Материалы могут изменяться динамически.
Простейшая анимация:
let alpha = 1;
viewer.clock.onTick.addEventListener(function() {
alpha -= 0.01;
if (alpha <= 0) {
alpha = 1;
}
line.polyline.material =
Cesium.Color.RED.withAlpha(alpha);
});
Эффект напоминает мигание маршрута.
Положение линии может обновляться во время работы приложения.
const positions = [];
const line = viewer.entities.add({
polyline: {
positions: new Cesium.CallbackProperty(
function() {
return positions;
},
false
),
width: 5,
material: Cesium.Color.YELLOW
}
});
Добавление новых точек:
positions.push(
Cesium.Cartesian3.fromDegrees(
longitude,
latitude
)
);
Подход используется для:
Для больших наборов данных использование Entity API может стать менее эффективным.
В таких случаях применяется низкоуровневый API примитивов.
const instance = new Cesium.GeometryInstance({
geometry: new Cesium.PolylineGeometry({
positions: positions,
width: 5
})
});
Создание примитива:
viewer.scene.primitives.add(
new Cesium.Primitive({
geometryInstances: instance,
appearance:
new Cesium.PolylineColorAppearance()
})
);
Преимущества:
При необходимости отображения большого количества независимых линий применяется коллекция.
const collection =
viewer.scene.primitives.add(
new Cesium.PolylineCollection()
);
Добавление линии:
collection.add({
positions: [
Cesium.Cartesian3.fromDegrees(10, 50),
Cesium.Cartesian3.fromDegrees(20, 55)
],
width: 3
});
Преимущества коллекций:
Удаление отдельной сущности:
viewer.entities.remove(line);
Удаление всех сущностей:
viewer.entities.removeAll();
Удаление примитива:
viewer.scene.primitives.remove(polyline);
const route = viewer.entities.add({
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray([
37.6176, 55.7558,
49.1064, 55.7963,
60.5975, 56.8389,
82.9204, 55.0302
]),
width: 6,
material: new Cesium.PolylineGlowMaterialProperty({
color: Cesium.Color.CYAN,
glowPower: 0.25
}),
clampToGround: true
}
});
viewer.zoomTo(route);
В результате отображается светящийся маршрут, проходящий через несколько городов и повторяющий рельеф местности.
Для десятков и сотен линий наиболее удобным решением остаются сущности.
viewer.entities.add(...)
Код получается компактным и легко поддерживается.
При работе с тысячами объектов предпочтительнее:
Cesium.Primitive
или
Cesium.PolylineCollection
Это позволяет существенно снизить нагрузку на процессор и систему управления сущностями.
Если линия не изменяется, не следует использовать:
CallbackProperty
Постоянные перерасчёты геометрии могут заметно влиять на производительность сцены.
Чрезмерно маленькое значение granularity увеличивает
количество промежуточных вершин.
Рационально подбирать баланс между:
Свечение, анимация и сложные пользовательские шейдеры требуют дополнительных вычислений на GPU. При отображении большого числа маршрутов желательно использовать простые материалы и минимизировать количество одновременно анимируемых объектов.
Полилинии являются одним из наиболее востребованных инструментов визуализации в CesiumJS и применяются для отображения:
Гибкость настройки геометрии, материалов, высоты, типа дуги и динамического обновления делает полилинии одним из ключевых инструментов пространственной визуализации в экосистеме CesiumJS.