Технология 3D Tiles предназначена для эффективной передачи и визуализации больших наборов трёхмерных данных: зданий, инфраструктуры, фотограмметрии, BIM-моделей и облаков точек. В CesiumJS механизм стилизации позволяет изменять внешний вид объектов непосредственно на стороне клиента без необходимости модификации исходных данных.
Стили применяются через класс Cesium.Cesium3DTileStyle и
позволяют:
Стиль назначается через свойство style объекта
Cesium3DTileset.
const tileset = await Cesium.Cesium3DTileset.fromUrl(
"tiles/buildings/tileset.json"
);
viewer.scene.primitives.add(tileset);
tileset.style = new Cesium.Cesium3DTileStyle({
color: "color('red')"
});
После применения стиля все объекты тайлсета будут окрашены в красный цвет.
Конструктор принимает объект с набором правил оформления.
tileset.style = new Cesium.Cesium3DTileStyle({
color: "color('blue')",
show: true
});
Основные свойства:
| Свойство | Назначение |
|---|---|
color |
Цвет объекта |
show |
Отображение или скрытие |
meta |
Пользовательские метаданные |
defines |
Пользовательские выражения |
Пример:
tileset.style = new Cesium.Cesium3DTileStyle({
color: "color('green')",
show: "${height} > 50"
});
Здания выше 50 метров будут отображаться, остальные станут невидимыми.
Система стилизации использует собственный язык выражений, похожий на JavaScript и GLSL.
Обращение к атрибутам объекта осуществляется через конструкцию:
${property}
Например:
${height}
${name}
${buildingType}
Выражение:
"${height} > 100"
возвращает логическое значение.
Арифметические операции:
"${height} * 2"
"${height} + 10"
"${height} / 5"
Логические операторы:
"${height} > 50 && ${height} < 100"
"${type} === 'office'"
Тернарный оператор:
"${height} > 100 ? color('red') : color('green')"
Многие наборы данных содержат свойства объектов.
Пример структуры объекта:
{
"id": 101,
"name": "Business Center",
"height": 145,
"floors": 35
}
Эти поля становятся доступны в стилях.
Окраска по высоте:
tileset.style = new Cesium.Cesium3DTileStyle({
color: `
${height} > 100 ?
color('red') :
color('blue')
`
});
Свойство show позволяет фильтровать элементы.
Показ только высоких зданий:
tileset.style = new Cesium.Cesium3DTileStyle({
show: "${height} > 80"
});
Отображение только жилых зданий:
tileset.style = new Cesium.Cesium3DTileStyle({
show: "${usage} === 'residential'"
});
Сложное условие:
tileset.style = new Cesium.Cesium3DTileStyle({
show:
"${height} > 50 && " +
"${usage} === 'office'"
});
Создание цветов осуществляется функцией:
color(name)
Примеры:
color('red')
color('green')
color('blue')
color('yellow')
color('white')
Применение:
tileset.style = new Cesium.Cesium3DTileStyle({
color: "color('yellow')"
});
Можно задавать компоненты цвета явно.
color(r, g, b, a)
Значения находятся в диапазоне от 0 до 1.
Полупрозрачный красный:
color(1.0, 0.0, 0.0, 0.5)
Пример:
tileset.style = new Cesium.Cesium3DTileStyle({
color: "color(0.0, 0.5, 1.0, 0.7)"
});
Наиболее распространённый способ стилизации — использование условий.
tileset.style = new Cesium.Cesium3DTileStyle({
color: {
conditions: [
["${height} >= 150", "color('red')"],
["${height} >= 100", "color('orange')"],
["${height} >= 50", "color('yellow')"],
["true", "color('green')"]
]
}
});
Проверка выполняется сверху вниз.
Первая подходящая строка определяет итоговый стиль.
Классификация по назначению объекта:
tileset.style = new Cesium.Cesium3DTileStyle({
color: {
conditions: [
[
"${usage} === 'residential'",
"color('green')"
],
[
"${usage} === 'office'",
"color('blue')"
],
[
"${usage} === 'industrial'",
"color('orange')"
],
[
"true",
"color('gray')"
]
]
}
});
Результат:
Вместо дискретных категорий можно использовать плавное изменение цвета.
Пример на основе высоты:
tileset.style = new Cesium.Cesium3DTileStyle({
color:
"mix(color('green'), color('red'), " +
"${height} / 200)"
});
Чем выше объект, тем ближе цвет к красному.
Функция смешивает два цвета.
mix(colorA, colorB, factor)
Где:
0 — первый цвет;1 — второй цвет.Пример:
mix(
color('blue'),
color('red'),
0.5
)
Результатом станет фиолетовый оттенок.
Практический пример:
tileset.style = new Cesium.Cesium3DTileStyle({
color:
"mix(color('cyan'), color('magenta'), ${temperature}/50)"
});
Прозрачность управляется альфа-каналом.
Полупрозрачные здания:
tileset.style = new Cesium.Cesium3DTileStyle({
color: "color('white', 0.4)"
});
Или:
tileset.style = new Cesium.Cesium3DTileStyle({
color: "rgba(255,255,255,0.4)"
});
Условная прозрачность:
tileset.style = new Cesium.Cesium3DTileStyle({
color: `
${height} > 100
? color('red',0.9)
: color('red',0.2)
`
});
Point Cloud Tiles также поддерживают стили.
Простейший пример:
tileset.style = new Cesium.Cesium3DTileStyle({
color: "color('white')"
});
Окраска по высоте:
tileset.style = new Cesium.Cesium3DTileStyle({
color: {
conditions: [
["${POSITION}[2] > 100", "color('red')"],
["${POSITION}[2] > 50", "color('yellow')"],
["true", "color('green')"]
]
}
});
Здесь используется координата Z точки.
Cesium предоставляет специальные значения.
Например:
${POSITION}
Координаты текущего объекта.
${POSITION_ABSOLUTE}
Абсолютное положение в мировой системе координат.
Пример:
"${POSITION}[2] > 200"
Для сложных выражений удобно создавать промежуточные переменные.
tileset.style = new Cesium.Cesium3DTileStyle({
defines: {
isTall: "${height} > 100"
},
color: {
conditions: [
["${isTall}", "color('red')"],
["true", "color('blue')"]
]
}
});
Преимущества:
Свойство meta позволяет формировать вычисляемые
значения.
tileset.style = new Cesium.Cesium3DTileStyle({
meta: {
info:
"'Высота: ' + ${height}"
}
});
Метаданные могут использоваться в пользовательских интерфейсах.
Стиль можно заменять во время работы приложения.
function applyRedStyle() {
tileset.style =
new Cesium.Cesium3DTileStyle({
color: "color('red')"
});
}
Переключение режимов:
function applyHeightStyle() {
tileset.style =
new Cesium.Cesium3DTileStyle({
color: {
conditions: [
[
"${height} > 100",
"color('red')"
],
[
"true",
"color('green')"
]
]
}
});
}
Цвет и видимость могут работать совместно.
tileset.style = new Cesium.Cesium3DTileStyle({
show: "${height} > 20",
color: {
conditions: [
["${height} > 100", "color('red')"],
["${height} > 50", "color('orange')"],
["true", "color('green')"]
]
}
});
Результат:
Для фотограмметрических моделей часто требуется аналитическая визуализация.
Подсветка высоких участков:
tileset.style = new Cesium.Cesium3DTileStyle({
color: {
conditions: [
["${Height} > 150", "color('red')"],
["${Height} > 100", "color('yellow')"],
["true", "color('white')"]
]
}
});
Фотограмметрия обычно содержит меньше пользовательских атрибутов, поэтому доступность свойств зависит от конкретного источника данных.
Стиль вычисляется для большого количества объектов, поэтому выражения должны оставаться максимально простыми.
Рекомендуется:
defines для повторяющихся вычислений;Нежелательный пример:
"${height} > 10 &&
${height} < 20 &&
${usage} === 'office' &&
${year} > 2000 &&
${floors} > 5"
Более удобный вариант:
defines: {
modernOffice:
"${usage} === 'office' && " +
"${year} > 2000"
}
tileset.style = new Cesium.Cesium3DTileStyle({
defines: {
highBuilding:
"${height} > 120"
},
show:
"${height} > 20",
color: {
conditions: [
[
"${highBuilding}",
"color('red',0.9)"
],
[
"${usage} === 'office'",
"color('blue',0.8)"
],
[
"${usage} === 'residential'",
"color('green',0.8)"
],
[
"true",
"color('gray',0.5)"
]
]
},
meta: {
title: "${name}",
buildingHeight:
"${height}"
}
});
Такой стиль одновременно выполняет несколько задач: