1 首先实现添加一个圆的逻辑
let entity= viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(103.0, 40.0),
name: 'Red ellipse on surface with outline',
ellipse: {
semiMinorAxis: 250000.0,
semiMajorAxis: 400000.0,
material: Cesium.Color.RED.withAlpha(0.5),
outlineColor: Cesium.Color.RED
}
});
2 实现 添加一个动态扩散圆的逻辑
查看API可以发现semiMinorAxis,semiMajorAxis都可以指定Property值,Property的各项使用说明可参见该篇文章
https://www.jianshu.com/p/f0b47997224c
因此,想得到一个动态扩散的圆逻辑就很简单了,只需要将semiMinorAxis,semiMajorAxis设置为动态改变的回调函数即可
var r1=data.minR //指定扩散圆的最小半径,maxR为扩散圆的最大半径
function changeR1() { //这是callback,参数不能内传
r1=r1+data.deviationR;//deviationR为每次圆增加的大小
if(r1>=data.maxR){
r1=data.minR;
}
return r1;
}
let entity={
id:data.id,
name:"",
position:Cesium.Cartesian3.fromDegrees(data.lon,data.lat,data.height),
ellipse : {
semiMinorAxis :new Cesium.CallbackProperty(changeR1,false),
semiMajorAxis :new Cesium.CallbackProperty(changeR1,false),
height:data.height,
material: Cesium.Color.RED.withAlpha(0.3),
}
}
3 上述实现的扩散圆比较丑,这是因为各处颜色均相同,导致视觉效果较差,因此引入一个各处颜色不一的圆形图片作为圆形的材质。(实际上纯canvas也可以实现这种效果,有机会再研究吧)
https://blog.csdn.net/A873054267/article/details/102570812-------canvas实现动态扩散
viewer.entities.add({
id:data.id,
name:"",
position:Cesium.Cartesian3.fromDegrees(data.lon,data.lat,data.height),
ellipse : {
semiMinorAxis :new Cesium.CallbackProperty(changeR1,false),
semiMajorAxis :new Cesium.CallbackProperty(changeR1,false),
height:data.height,
material:new Cesium.ImageMaterialProperty({
image:data.imageUrl,
repeat:new Cesium.Cartesian2(1.0, 1.0),
transparent:true,
color:new Cesium.CallbackProperty(function () {
var alp=1-r1/data.maxR;
return Cesium.Color.WHITE.withAlpha(alp) //entity的颜色透明 并不影响材质,并且 entity也会透明哦
},false)
})
}
});
使用的图片
4 要实现两个,只需要延时执行第二个添加扩散圆的逻辑即可。
setTimeout(function () {
viewer.entities.add({
name:"",
position:Cesium.Cartesian3.fromDegrees(data.lon,data.lat,data.height),
ellipse : {
semiMinorAxis :new Cesium.CallbackProperty(changeR2,false),
semiMajorAxis :new Cesium.CallbackProperty(changeR2,false),
height:data.height,
material:new Cesium.ImageMaterialProperty({
image:data.imageUrl,
repeat:new Cesium.Cartesian2(1.0, 1.0),
transparent:true,
color:new Cesium.CallbackProperty(function () {
var alp=1;
alp=1-r2/data.maxR;
return Cesium.Color.WHITE.withAlpha(alp)
},false)
})
}
});
},data.eachInterval)
5所有代码
function addCircleRipple(viewer,data){
var r1=data.minR,r2=data.minR;
function changeR1() { //这是callback,参数不能内传
r1=r1+data.deviationR;
if(r1>=data.maxR){
r1=data.minR;
}
return r1;
}
function changeR2() {
r2=r2+data.deviationR;
if(r2>=data.maxR){
r2=data.minR;
}
return r2;
}
viewer.entities.add({
id:data.id,
name:"",
position:Cesium.Cartesian3.fromDegrees(data.lon,data.lat,data.height),
ellipse : {
semiMinorAxis :new Cesium.CallbackProperty(changeR1,false),
semiMajorAxis :new Cesium.CallbackProperty(changeR1,false),
height:data.height,
material:new Cesium.ImageMaterialProperty({
image:data.imageUrl,
repeat:new Cesium.Cartesian2(1.0, 1.0),
transparent:true,
color:new Cesium.CallbackProperty(function () {
var alp=1-r1/data.maxR;
return Cesium.Color.WHITE.withAlpha(alp) //entity的颜色透明 并不影响材质,并且 entity也会透明哦
},false)
})
}
});
setTimeout(function () {
viewer.entities.add({
name:"",
position:Cesium.Cartesian3.fromDegrees(data.lon,data.lat,data.height),
ellipse : {
semiMinorAxis :new Cesium.CallbackProperty(changeR2,false),
semiMajorAxis :new Cesium.CallbackProperty(changeR2,false),
height:data.height,
material:new Cesium.ImageMaterialProperty({
image:data.imageUrl,
repeat:new Cesium.Cartesian2(1.0, 1.0),
transparent:true,
color:new Cesium.CallbackProperty(function () {
var alp=1;
alp=1-r2/data.maxR;
return Cesium.Color.WHITE.withAlpha(alp)
},false)
})
}
});
},data.eachInterval)
}
var lon=117.286419;
var lat=31.864436;
addCircleRipple(viewer,{ //默认只绘制两个圆圈叠加 如遇绘制多个,请自行源码内添加。
id:"111",
lon:lon,
lat:lat,
height:500,
maxR:3000,
minR:0,//最好为0
deviationR:10,//差值 差值也大 速度越快
eachInterval:2000,//两个圈的时间间隔
imageUrl:"./redCircle2.png"
});
//如果添加中心线的话:
viewer.entities.add({
name:"",
polyline: {
positions: Cesium.Cartesian3.fromDegreesArrayHeights([
lon,lat,0,
lon,lat, 5000,]
),
width: 4,
material : new Cesium.PolylineGlowMaterialProperty({ //发光线
glowPower : 0.1,
color : Cesium.Color.RED
})
}
});
viewer.zoomTo(viewer.entities);