目录
4.3 设置各种条件,并根据不同条件设置3dtile的不同样式:
之前的文章讲过通过new Cesium.createOsmBuildings()在Cesium加载Open street map建筑模型,但加载后为白膜,当我们需要对其样式进行更改时,就需要使用Cesium3DTileStyle进行更改。3D 切片样式提供磁贴集要素的简洁声明性样式。样式定义表达式以评估要素的显示,例如(RGB 和半透明性)和属性,通常基于存储在切片的 Batch 表中的要素属性。color show
样式可以应用于不包含要素的切片,在这种情况下,切片将被视为没有属性的隐式单个要素。
虽然可以为切片集创建样式并为其引用属性,但样式独立于切片集,因此任何样式都可以应用于任何切片集。
样式是用JSON定义的,表达式写在JavaScript的一小部分中,为样式进行了扩充。此外,样式语言还提供了一组内置函数来支持常见的数学运算。
下面的示例根据建筑物高度分配颜色。
{
"show" : "${Area} > 0",
"color" : {
"conditions" : [
["${Height} < 60", "color('#13293D')"],
["${Height} < 120", "color('#1B98E0')"],
["true", "color('#E8F1F2', 0.5)"]
]
}
}
Cesium3DTileStyle应用于Cesium3DTileset的样式,通过new Cesium.Cesium3DTileStyle ( style )创建并使用。官方文档:3D磁贴/规格/样式在主 ·铯GS/3D瓷砖 ·GitHub
可用于设置样式特征的视觉属性是属性,其分配的表达式将计算为确定特征是否可见的布尔值,以及属性,其分配的表达式将计算为对象(RGB 和半透明性),后者确定特征的显示颜色。showcolorColor
以下样式为每个要素指定默认的显示和颜色属性:
{
"show" : "true",
"color" : "color('#ffffff')"
}
例如,以下表达式将仅显示 19341 邮政编码中的要素,而不是显示所有要素,可以是依赖于要素属性的表达式:show
{
"show" : "${ZipCode} === '19341'"
}
show也可用于更复杂的查询;例如,此处的复合条件和正则表达式仅用于显示其县以 1970 开头且其建成年份大于或等于 1970 的要素:'Chest'
{
"show" : "(regExp('^Chest').test(${County})) && (${YearBuilt} >= 1970)"
}
颜色也可以由依赖于要素属性的表达式来定义。例如,以下表达式将温度高于 90 的特征颜色着色为红色,将其他表达式颜色着色为白色:
{
"color" : "(${Temperature} > 90) ? color('red') : color('white')"
}
颜色的 alpha 分量定义了要素的不透明度。例如,以下命令根据要素的属性设置要素的 RGB 颜色分量,并使体积大于 100 的要素透明:
{
"color" : "rgba(${red}, ${green}, ${blue}, (${volume} > 100 ? 0.5 : 1.0))"
}
除了包含表达式的字符串之外,还可以是定义一系列条件的数组(类似于语句)。例如,条件可用于制作具有任何类型的包含/排除间隔的色彩映射表和色带。colorshowif...else
例如,下面的表达式将 ID 属性映射到颜色。条件按顺序计算,因此如果不是 或 ,则条件返回白色。如果未满足任何条件,则要素的颜色将为:${id}'1''2'"true"undefined
{
"color" : {
"conditions" : [
["${id} === '1'", "color('#FF0000')"],
["${id} === '2'", "color('#00FF00')"],
["true", "color('#FFFFFF')"]
]
}
}
下一个示例演示如何使用条件,使用具有非独占下限和独占上限的间隔创建色带:
"color" : {
"conditions" : [
["(${Height} >= 1.0) && (${Height} < 10.0)", "color('#FF00FF')"],
["(${Height} >= 10.0) && (${Height} < 30.0)", "color('#FF0000')"],
["(${Height} >= 30.0) && (${Height} < 50.0)", "color('#FFFF00')"],
["(${Height} >= 50.0) && (${Height} < 70.0)", "color('#00FF00')"],
["(${Height} >= 70.0) && (${Height} < 100.0)", "color('#00FFFF')"],
["(${Height} >= 100.0)", "color('#0000FF')"]
]
}
由于条件是按顺序计算的,因此可以更简洁地编写以下内容:
"color" : {
"conditions" : [
["(${Height} >= 100.0)", "color('#0000FF')"],
["(${Height} >= 70.0)", "color('#00FFFF')"],
["(${Height} >= 50.0)", "color('#00FF00')"],
["(${Height} >= 30.0)", "color('#FFFF00')"],
["(${Height} >= 10.0)", "color('#FF0000')"],
["(${Height} >= 1.0)", "color('#FF00FF')"]
]
}
常用的表达式可以存储在具有变量名称作为键的对象中。如果变量引用了已定义表达式的名称,则会将其替换为引用的计算表达式的结果:defines
{
"defines" : {
"NewHeight" : "clamp((${Height} - 0.5) / 2.0, 1.0, 255.0)",
"HeightColor" : "rgb(${Height}, ${Height}, ${Height})"
},
"color" : {
"conditions" : [
["(${NewHeight} >= 100.0)", "color('#0000FF') * ${HeightColor}"],
["(${NewHeight} >= 50.0)", "color('#00FF00') * ${HeightColor}"],
["(${NewHeight} >= 1.0)", "color('#FF0000') * ${HeightColor}"]
]
},
"show" : "${NewHeight} < 200.0"
}
定义表达式不能引用其他定义;但是,它可能引用具有相同名称的功能属性。在下面的样式中,高度为 150 的特征将获得红色:
{
"defines" : {
"Height" : "${Height}/2.0}",
},
"color" : {
"conditions" : [
["(${Height} >= 100.0)", "color('#0000FF')"],
["(${Height} >= 1.0)", "color('#FF0000')"]
]
}
}
可以使用该属性定义要素的非可视属性。例如,下面将 meta 属性设置为包含功能名称的字符串:metadescription
{
"meta" : {
"description" : "'Hello, ${featureName}.'"
}
}
元属性表达式的计算结果可以是任何类型。例如:
{
"meta" : {
"featureColor" : "rgb(${red}, ${green}, ${blue})",
"featureVolume" : "${height} * ${width} * ${depth}"
}
}
表达式的语言是 JavaScript (EMCAScript 5) 的一小部分,加上本机矢量和正则表达式类型,以及以只读变量形式访问 tileset 功能属性。
点表示法用于按名称访问属性,例如 。building.name
括号表示法 () 也用于访问属性,例如 building['name']或数组,例如temperatures[1]
调用函数时带有括号 () 和逗号分隔的参数,例如 (isNaN(0.0),color('cyan',0.5))
支持以下运算符,其语义和优先级与JavaScript相同。
一元的:+, -, !
不支持。~
二元的:||, &&, ===, ! ==, <, >, <=, >=, +, -, *, /, %, =~, ! ~
不支持。|, ^, &, <<, >>, 和>>>.
三元组: ? :
( )也支持对表达式进行分组,以达到清晰和优先的目的。
逻辑运算符 || 和 && 实现了简化流程;true || expression 不评估右边的表达式,而false && expression不评估右边的表达。
同样,true ? leftExpression : rightExpression只执行左边的表达式,而false ? leftExpression : rightExpression只执行右边的表达式。
BooleanNullUndefinedNumberStringArrayvec2vec3vec4RegExp除了vec2、vec3、vec4和RegExp,所有类型的语法和运行时行为都与JavaScript相同。颜色源于CSS3的颜色,并以vec4的形式实现。正则(RegExp)源自JavaScript,在正则部分有描述。
不同类型的示例表达式包括:
true,falsenullundefined1.0, NaN,Infinity'Cesium',"Cesium"[0, 1, 2]vec2(1.0, 2.0)vec3(1.0, 2.0, 3.0)vec4(1.0, 2.0, 3.0, 4.0)color('#00FFFF')regExp('^Chest'))下面主要讲解Vector向量类型(vec2 ,vec3 ,vec4),其他数据类型与JS一致,正则表达也与JS一致:
styling语言包括2、3和4组成的浮点向量类型:vec2、vec3和vec4。向量构造函数与GLSL共享相同的规则。
1)vec2
vec2(xy : Number) - 用数字初始化每个分量
vec2(x : Number, y : Number) - 使用两个数字进行初始化
vec2(xy : vec2) - 用另一个vec2进行初始化
vec2(xyz : vec3) - 丢弃vec3的第三个分量。
vec2(xyzw : vec4) - 丢弃vec4的第三和第四部分。
2)vec3
vec3(xyz : Number) - 用数字初始化每个分量。
vec3(x : Number, y : Number, z : Number) - 使用三个数字进行初始化
vec3(xyz : vec3) - 用另一个vec3进行初始化
vec3(xyzw : vec4) - 丢弃vec4的第四个分量。
vec3(xy : vec2, z : Number) - 用vec2和数字进行初始化。
vec3(x : Number, yz : vec2) - 使用vec2和数字进行初始化。
3)vec4
vec4(xyzw : Number) - 用数字初始化每个组件
vec4(x : Number, y : Number, z : Number, w : Number) - 使用四个数字进行初始化
vec4(xyzw : vec4) - 用另一个vec4进行初始化
vec4(xy : vec2, z : Number, w : Number) - 用一个vec2和两个数字进行初始化。
vec4(x : Number, yz : vec2, w : Number) - 用一个vec2和两个数字进行初始化。
vec4(x : Number, y : Number, zw : vec2) - 用一个vec2和两个数字进行初始化。
vec4(xyz : vec3, w : Number) - 初始化一个vec3和数字。
vec4(x : Number, yzw : vec3) - 初始化一个vec3和数字。
4)向量的使用
vec2组件可以用
.x, .y
.r, .g
[0], [1]
vec3组件可以用
.x, .y, .z
.r, .g, .b
[0], [1], [2]
vec4组件可以用
.x, .y, .z, .w
.r, .g, .b, .a
[0], [1], [2], [3]
与GLSL不同,styling语言不支持swizzling。例如,不支持vec3(1.0).xy。
向量支持以下单项运算符。-, +.
向量支持以下二进制运算符,通过执行分母操作:===,!==,+,-,*,/,和%。例如,vec4(1.0) === vec4(1.0)是真的,因为x、y、z和w分量相等。对于vec2、vec3和vec4,操作符基本上是重载的。
vec2、vec3和vec4有一个toString函数,用于显式(和隐式)转换为格式为'(x,y)'、'(x,y,z)'和'(x,y,z,w)的字符串。
toString() : 字符串
vec2、vec3和vec4没有暴露任何其他函数或原型对象。
根据建筑物的不同属性设置颜色,办公楼为红色、商业楼为橙色、居民楼为黄色、0.8透明度,其他为天空蓝、0.8透明度。
// Cesium全球3.5亿做建筑物,数据来源openStreetMap地图
let tiles3d = new Cesium.createOsmBuildings();
tiles3d.style = new Cesium.Cesium3DTileStyle({
color: {
conditions: [
["${feature['building']} === 'office'", "color('red')"],
["${feature['building']} === 'commercial'", "color('orange')"],
["${feature['building']} === 'residential'", "color('yellow',0.8)"],
["true", "color('skyblue',0.8)"],
],
},
});
console.log(tiles3d);
var buildings = viewer.scene.primitives.add(tiles3d);
实现效果:

根据不同条件切换颜色:
首先可以根据需求安装一个小的切换插件dat.gui,一个轻量级的图形用户界面,用于在JavaScript中更改变量。dat.GUI 是一个轻量级的图形用户界面库(GUI 组件),使用这个库可以很容易地创建出能够改变代码变量的界面组件。
安装
npm install --save dat.gui
yarn add dat.gui
<script src="https://cdn.bootcdn.net/ajax/libs/dat-gui/0.7.7/dat.gui.min.js"></script>
使用
const dat = require('dat.gui');
// ES6:
import * as dat from 'dat.gui';
const gui = new dat.GUI();
api文档
https://github.com/dataarts/dat.gui/blob/master/API.md
import * as dat from "dat.gui";//一个轻量级的图形用户界面,用于在JavaScript中更改变量。
const gui = new dat.GUI();
条件一:根据建筑物的不同高度设置不同的颜色;
条件二:根据距离中心点距离的远近,由近至远色调逐渐变化;
//点击切换条件并更改颜色
let params = {
//根据高度不同设置不同颜色
heightColor: function () {
tiles3d.style = new Cesium.Cesium3DTileStyle({
color: {
conditions: [
["${feature['cesium#estimatedHeight']} > 300", "color('#0000CD')"],
["${feature['cesium#estimatedHeight']} > 200", "color('#4169E1')"],
["${feature['cesium#estimatedHeight']} > 100", "color('#1E90FF')"],
["${feature['cesium#estimatedHeight']} > 50", "color('#00BFFF')"],
["${feature['cesium#estimatedHeight']} > 20", "color('#87CEEB')"],
["true", "color('#ADD8E6',0.8)"],
],
},
});
},
//根据距离中心点位置距离设置不同颜色
distanceColor: function () {
tiles3d.style = new Cesium.Cesium3DTileStyle({
defines: {
distance:
//设置以广州塔为中心判断距离远近
"distance(vec2(${feature['cesium#longitude']},${feature['cesium#latitude']}),vec2(113.3191, 23.109))",
},
color: {
conditions: [
["${distance} < 0.005", "color('#0000CD')"],
["${distance} < 0.01", "color('#4169E1')"],
["${distance} < 0.015", "color('#1E90FF')"],
["${distance} < 0.02", "color('#00BFFF')"],
["${distance} < 0.025", "color('#87CEEB')"],
["true", "color('#ADD8E6',0.8)"],
],
},
});
},
};
gui.add(params, "heightColor");
gui.add(params, "distanceColor");
实现效果:
1.根据建筑物的不同高度设置不同的颜色;

2. 根据距离中心点距离的远近,由近至远色调逐渐变化;(中心点为广州塔)

设置显示距离中心点位置小于0.04且建筑物特征为公寓的建筑显示,且颜色从近至远(0.01,0.02,0.04为节点)逐渐变浅。
实现代码:
<template>
<div id="cesiumContainer" ref="cesiumContainer"></div>
</template>
<script setup>
// yarn add cesium
// 将cesium目录下的Build/Cesium4个目录拷贝到public,然后将widgets目录拷贝一份到src下
import * as Cesium from "cesium";
import "./Widgets/widgets.css";
import { onMounted } from "vue";
// 设置cesium token
Cesium.Ion.defaultAccessToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMzNkNTE5Zi1mMjY4LTRiN2QtOTRlZC1lOTUyM2NhNDYzNWYiLCJpZCI6NTU0OTYsImlhdCI6MTYyNTAyNjMyOX0.a2PEM4hQGpeuMfeB9-rPp6_Gkm6O-02Dm4apNbv_Dlk";
// 设置cesium静态资源路径
window.CESIUM_BASE_URL = "/";
onMounted(() => {
var viewer = new Cesium.Viewer("cesiumContainer", {
// 是否显示信息窗口
// infoBox: false,
shouldAnimate: true,
});
// 设置沙箱允许使用js
var iframe = document.getElementsByClassName("cesium-infoBox-iframe")[0];
iframe.setAttribute(
"sandbox",
"allow-same-origin allow-scripts allow-popups allow-forms"
);
iframe.setAttribute("src", "");
// 隐藏logo
viewer.cesiumWidget.creditContainer.style.display = "none";
// 添加3D建筑
let tiles3d = new Cesium.createOsmBuildings();
const osmBuildings = viewer.scene.primitives.add(tiles3d);
// 广州塔
var postion = Cesium.Cartesian3.fromDegrees(
// 经度
113.3191,
// 纬度
23.109,
// 高度
1000
);
viewer.camera.flyTo({
destination: postion,
duration: 2,
});
tiles3d.style = new Cesium.Cesium3DTileStyle({
defines: {
distance:
"distance(vec2(${feature['cesium#longitude']},${feature['cesium#latitude']}),vec2(113.3191,23.109))",//距离计算
},
color: {
conditions: [
["${distance} < 0.01", "color('rgba(92,167,186, 1)')"],
["${distance} < 0.02", "color('rgba(175,215,237, 1)')"],
["${distance} < 0.04", "color('rgba(199,237,233, 1)')"],
["true", "color('white')"],
],
},//颜色条件判断
show: "${distance} < 0.04 && ${feature['building']} === 'apartments'",//并列条件设置
});
});
</script>
<style>
* {
margin: 0;
padding: 0;
}
#cesiumContainer {
width: 100vw;
height: 100vh;
}
</style>
实现效果:

快速导航(持续更新中…)Cesium源码解析一(terrain文件的加载、解析与渲染全过程梳理)Cesium源码解析二(metadataAvailability的含义)Cesium源码解析三(metadata元数据拓展中行列号的分块规则解析)Cesium源码解析四(Quantized-Mesh(.terrain)格式文件在CesiumJS和UE中加载情况的对比)目录1.前言2.本篇的由来3.terrain文件的加载3.1更新环境3.2更新和执行渲染命令3.3数据优化3.4结束当前帧4.总结1.前言 目前市场上三维比较火的实现方案主要有两种,b/s的方案主要是Cesium,c/s的方案主要是u
我试图在Cesiummap上放置数千个点,但遇到了Firefox崩溃的问题。我必须使用Firefox。该map似乎能够显示15,000个点(如图像)。但是,它也几乎无法使用。缩放和平移有巨大的延迟并最终崩溃。有谁知道极限应该是多少分?另外,有没有比我现在做的更好的方式来显示这些点?我真的希望是我而不是铯。我听说创建czml然后传入它比较慢,所以我有以下javascript测试:functiontest(){for(vari=0;i90){tempLat=0;tempLon=0;}addBillboard(scene,ellipsoid,tempLat,tempLon);}}//this
我有多个GeoJsonDataSource对象,我想将它们放在Cesium地球仪上。问题是,如果它们重叠,我会遇到一些z-fighting问题,我无法调整它们的顺序。有没有一种方法可以指定DataSourceCollection中DataSource对象的顺序?例如,我想使用以下代码将绿色多边形置于红色多边形之上:varviewer=newCesium.Viewer('cesiumContainer');varred=Cesium.GeoJsonDataSource.load('map1.geojson',{fill:newCesium.Color(1,0,0,1.0)});vargr
Cesimum可以做什么Cesium是一个开源的3D地球可视化引擎,它可以在Web浏览器中以高性能和高质量呈现全球范围内的地球表面数据。Cesium可以用于以下领域:地理信息系统:Cesium可以呈现地球表面上的各种地理信息数据,包括卫星影像、数字高程模型、地形数据、矢量数据等。用户可以使用Cesium创建交互式的地图应用程序,从而更好地了解地球上的各种地理信息。智能城市:Cesium可以用于可视化城市规划、交通流量、气象预报、环境监测等数据。通过Cesium,用户可以更好地了解城市的运转情况,并对城市的规划、管理等方面进行决策。航空航天:Cesium可以呈现卫星轨道、星座分布、航空交通等数据
我正在遵循沙堡椭圆轮廓几何体。我想知道是否有办法让椭圆线的宽度变宽?有使用width属性使折线变宽的示例,但似乎没有办法制作ellipseOutlineGeometry对象。沙堡示例在末尾有一个lineWidth设置,但对此的更改似乎不会影响椭圆轮廓的宽度。沙箱代码://Createtheellipsegeometry.Toextrude,specifythe//heightofthegeometrywiththeextrudedHeightoption.//ThenumberOfVerticalLinesoptioncanbeusedtospecify//thenumberoflin
Cesium现在在npm上。在npminstallcesium之后-进入我的项目,所有代码进入node_modules.在铯中helloworld,它包括cesium通过类似的方式我的问题是,为了从html使用cesium,我需要执行哪些额外步骤? 最佳答案 有几种方法。如果正在提供node_modules文件夹本身,您可以从那里拉Cesium。在调试期间,使用未缩小的版本:@importurl(node_modules/cesium/Build/CesiumUnminified/Widgets/widgets.css);但对于生产
我想为cesium应用程序设置默认View/主页位置。我不只是想飞到那个地点一次;我希望将位置设置为默认/家-以便它可以在应用程序的其他地方使用-例如在HomeButton小工具。我试过设置Camera.DEFAULT_VIEW_RECTANGLE(docshere)像这样:varextent=Cesium.Rectangle.fromDegrees(117.940573,-29.808406,118.313421,-29.468825);viewer.camera.DEFAULT_VIEW_RECTANGLE=extent;但是没用..为了完整起见,下面是我初始化应用程序的方式:va
Cesium中的离屏渲染本文参考了众多文章,均列在了最后。先感谢各位的分享精神,如觉有冒犯,请与我联系。部分内容来自个人理解,欢迎指正交流。为了达到更加真实的渲染效果或其他计算需求,很多时候需要利用被渲染物体在其他状态下(比如通过另一相机渲染)的中间渲染结果,处理到最终显示的渲染场景中。这种中间渲染结果,就保存在帧缓冲区对象(FrameBufferObject,FBO)中,包含颜色缓冲区和深度缓存区。由于其结果并不直接被显示出来,所以这种技术也被称为离屏渲染(Off-ScreenRendering)。在深入了解Cesium的离屏渲染前,需要先了解WebGL的渲染过程。WebGL渲染过程大家都知
前段时间想将某地的一些点线面矢量图层添加到Cesium视图中,到官网找了找示例发现有个“添加MVT”的示例,但是示例里面是将各矢量图层制作成了一幅地图并发布加载,而我的需求是在Cesium场景中通过图层管理模块将每个矢量图层单独加载或移除,具体实现见下文,如有不足欢迎评论区指正、交流。一、矢量数据处理及发布流程说明:本人使用的是64位SuperMapiDesktop11i和SuperMapiServer11.0.0版本软件。第一步:打开SuperMapiDesktop软件鼠标右击“数据源”→“新建文件型数据源”。第二步:鼠标右击新建的数据源点击“导入数据集”,选择需要导入的矢量图层点击“导入”
目录1切换二维地图2删除默认图层3隐藏版权信息4加载cesiumlab切片影像出现栅格阴影5解决相机控制问题6cesium中限制地图浏览范围7鼠标移动显示经纬度8禁用cesium选取实体操作8.1禁用操作8.2双击事件改写8.3信息隐藏(index.html页面)9自定义动画10小车轨迹切分11label跟随模型12自定义label样式13轨迹输出坐标点14识别实体模型14.1识别3DTitles模型14.2识别一般实体15修改3DTitles高度16解决影像拼接黑色锯齿17去除cesium默认功能18vite全局整合cesium19相机定位问题我将对我在最近与数字孪生项目的对接过程中所实现的