cesium 闪烁点 实体闪烁
# 效果
最终完整代码请看下面的封装一栏
# 基本思路
可以把当前效果,动态分成两部分,添加一个点,和添加一个圆,当点击时,动态改变点的颜色,动态改变圆的大小
# 实现方法
1. 首先我们需要生成一个球体做我们标记的容器。
viewer = new Cesium.Viewer('cesiumContainer',{// terrainProvider: Cesium.createWorldTerrain(),// animation: false, // 控制场景动画的播放速度控件// baseLayerPicker: true, // 底图切换控件// baselLayerPicker:false,// 将图层选择的控件关掉,才能添加其他影像数据// // fullscreenButton: false, // 全屏控件// geocoder: false, // 地理位置查询定位控件// homeButton: true, // 默认相机位置控件// timeline: false, // 时间滚动条控件// infoBox: false, //是否显示信息框// sceneModePicker: false, //是否显示3D/2D选择器// selectionIndicator: false, // 点击点绿色弹出 是否显示选取指示器组件// sceneMode: Cesium.SceneMode.SCENE3D, //设定3维地图的默认场景模式:Cesium.SceneMode.SCENE2D、Cesium.SceneMode.SCENE3D、Cesium.SceneMode.MORPHING// navigationHelpButton: false, // 默认的相机控制提示控件// scene3DOnly: true, // 每个几何实例仅以3D渲染以节省GPU内存// navigationInstructionsInitiallyVisible: false,// showRenderLoopErrors: false, //是否显示渲染错误// orderIndependentTranslucency:false,//设置背景透明});
2. 然后利用cesium中 billboard 来添加目标点位
添加点位的数据格式
poin : [{id:'12321321' , name: "北京西路测试点", type: "固定枪机", state: "在线", position: { x: 116.4568, y: 39.8926} ,text:'X'},{id:'43244324' , name: "阿乐修理厂门口", type: "固定枪机", state: "在线", position: { x: 116.4568, y: 39.8944 } ,text:'+'},{id:'43764324', name: "裕华路加油站", type: "固定枪机", state: "在线", position: { x: 116.4566, y: 39.8923 } ,text:'?'},{id:'437543345', name: "康佳大药房", type: "固定枪机", state: "在线", position: { x: 116.4513, y: 39.8923 } ,text:'!'},],
添加点位先上代码(class封装)
//加载点dragEntity(){let drag = new DragEntity({viewer:this.$store.state.viewer, })let _this = this// this.poin = [{id:234,position:[122.8,39.9],text:"L"},{id:432,position:[122,39],text:"C"}]this.poin.forEach(item => {let entity = drag.addEntity(item);_this.poinEntity[item.id] = entity;})},
创建dragEntity.js文件
/*** @param {Viewer} viewer*
*/
export default class DragEntity{constructor(val){this.viewer = val.viewer,}addEntity(value){//数据格式{id:543595234324_432423,position:[122.8,39.9],text:"L"}let pinBuilder = new Cesium.PinBuilder();let poin = this.viewer.entities.add({id:value.id,name: value.name,position: Cesium.Cartesian3.fromDegrees(value.position.x, value.position.y),billboard: {image: pinBuilder.fromText(value.text,Cesium.Color.ROYALBLUE, 48).toDataURL(),verticalOrigin: Cesium.VerticalOrigin.BOTTOM,},monitoItems:{data:value},});return poin}}
解读一下,我们封装了一个class类,将添加点的方法封装到类中方便调用,我们用“billboard”方法与cesium中PinBuilder来进行添加目标点,"PinBuilder"不会的可以看一下官网https://sandcastle.cesium.com/?src=Map%20Pins.html&label=All,然后我们将创建好的实体,return出来,用一个对象来进行接收,用对象的目的就是为了以后方便查找。来看一眼效果
3. 第三步我们来动态扩散圆,只需要修改上面dragEntity.js文件即可,运用ellipse方法加载圆,动态扩散元具体讲解请看https://blog.csdn.net/weixin_46730573/article/details/119505757?spm=1001.2014.3001.5502
/*** @param {Viewer} viewer*
*/
export default class DragEntity{constructor(val){this.viewer = val.viewer,}addEntity(value){let minR=value.minR;//最小半径let maxR = value.maxR;// 最大半径let deviationR = value.deviationR; // 每次增加的大小var r1 = minRfunction changeR1() { r1=r1+deviationR;//deviationR为每次圆增加的大小if(r1>=maxR){r1=minR;}return r1;}function color() {let x=1-r1/maxR;return Cesium.Color.RED.withAlpha(x);}//数据格式{id:543595234324_432423,position:[122.8,39.9],text:"L"}let pinBuilder = new Cesium.PinBuilder();let poin = this.viewer.entities.add({id:value.id,name: value.name,position: Cesium.Cartesian3.fromDegrees(value.position.x, value.position.y),billboard: {image: pinBuilder.fromText(value.text,Cesium.Color.ROYALBLUE, 48).toDataURL(),verticalOrigin: Cesium.VerticalOrigin.BOTTOM,},ellipse: {semiMinorAxis: new Cesium.CallbackProperty(changeR1,false),semiMajorAxis: new Cesium.CallbackProperty(changeR1,false),material: new Cesium.ColorMaterialProperty(new Cesium.CallbackProperty(color,false)),outlineColor: Cesium.Color.RED,show: false},monitoItems:{data:value},});return poin}
}
修改dragEntity函数,添加给动态圆传的半径大小{minR:0, maxR:40, deviationR:1,}
//加载点dragEntity(){let drag = new DragEntity({viewer:this.$store.state.viewer, })let _this = thisthis.poin.forEach(item => {let entity = drag.addEntity(Object.assign(item,{minR:0, maxR:40, deviationR:1,}));_this.poinEntity[item.id] = entity;})},
现在动态扩散圆我们就加载出来了;
4. 我们来加载点击事件,获取是点击实体
leftDownAction(){let viewer = this.$store.state.viewerthis.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);let _this = thislet id_this.handler.setInputAction(function (movement) {let pick = viewer.scene.pick(movement.position); if (Cesium.defined(pick) && (pick.id.id) ) {// _this.leftDownFlag = true;id= pick.id.id;console.log(id)}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);},
5. 当点击到实体时,点闪烁,点击空白处时,清除闪烁,运用 Cesium.CallbackProperty() 来控制点的闪烁
clearClick(){let _this = this;if(_this.oldId){_this.poinEntity[_this.oldId].billboard.color = Cesium.Color.WHITE.withAlpha(1);_this.poinEntity[_this.oldId].ellipse.show = false;}},callbackProperty(id){this.clearClick()let flog = true;let x = 1;let callbackProperty = new Cesium.CallbackProperty(function () {if(flog){x=x-0.05;if(x<=0){flog=false;}}else{x=x+0.05;if(x>=1){flog=true;}}return Cesium.Color.RED.withAlpha(x);},false);setTimeout(()=>{this.poinEntity[id].billboard.color = callbackProperty;this.poinEntity[id].ellipse.show = true;this.oldId = id;},1000)},
当点击事件获取到id时调用callbackProperty(id)即可,在这个函数中我们创建了一个callbackProperty 方法为修改属性颜色
# 封装(完整代码)
创建dragEntity.js文件
/*** @param {Viewer} viewer*
*/
export default class DragEntity{constructor(val){this.viewer = val.viewer,}addEntity(value){let minR=value.minR;//最小半径let maxR = value.maxR;// 最大半径let deviationR = value.deviationR; // 每次增加的大小var r1 = minRfunction changeR1() { r1=r1+deviationR;//deviationR为每次圆增加的大小if(r1>=maxR){r1=minR;}return r1;}function color() {let x=1-r1/maxR;return Cesium.Color.RED.withAlpha(x);}//数据格式{id:543595234324_432423,position:[122.8,39.9],text:"L"}let pinBuilder = new Cesium.PinBuilder();let poin = this.viewer.entities.add({id:value.id,name: value.name,position: Cesium.Cartesian3.fromDegrees(value.position.x, value.position.y),billboard: {image: pinBuilder.fromText(value.text,Cesium.Color.ROYALBLUE, 48).toDataURL(),verticalOrigin: Cesium.VerticalOrigin.BOTTOM,},ellipse: {semiMinorAxis: new Cesium.CallbackProperty(changeR1,false),semiMajorAxis: new Cesium.CallbackProperty(changeR1,false),material: new Cesium.ColorMaterialProperty(new Cesium.CallbackProperty(color,false)),outlineColor: Cesium.Color.RED,show: false},monitoItems:{data:value},});return poin}}
在实例中调用
import DragEntity from './dragentity.js'
data(){return{poinEntity:{},oldId:null,//储存上次点位IDpoin : [{id:'12321321' , name: "北京西路测试点", type: "固定枪机", state: "在线", position: { x: 116.4568, y: 39.8926} ,text:'X'},{id:'43244324' , name: "阿乐修理厂门口", type: "固定枪机", state: "在线", position: { x: 116.4568, y: 39.8944 } ,text:'+'},{id:'43764324', name: "裕华路加油站", type: "固定枪机", state: "在线", position: { x: 116.4566, y: 39.8923 } ,text:'?'},{id:'437543345', name: "康佳大药房", type: "固定枪机", state: "在线", position: { x: 116.4513, y: 39.8923 } ,text:'!'},],}},
mounted(){this.dragEntity()this.leftDownAction()
},
methods:{// 左键点击事件leftDownAction(){let viewer = this.$store.state.viewerthis.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);let _this = thislet id_this.handler.setInputAction(function (movement) {let pick = viewer.scene.pick(movement.position); if (Cesium.defined(pick) && (pick.id.id) ) {id= pick.id.id;_this.callbackProperty(id)}else{_this.clearClick();}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);},// 清除效果clearClick(){let _this = this;if(_this.oldId){_this.poinEntity[_this.oldId].billboard.color = Cesium.Color.WHITE.withAlpha(1);_this.poinEntity[_this.oldId].ellipse.show = false;}},//添加效果展示callbackProperty(id){this.clearClick()let flog = true;let x = 1;let callbackProperty = new Cesium.CallbackProperty(function () {if(flog){x=x-0.05;if(x<=0){flog=false;}}else{x=x+0.05;if(x>=1){flog=true;}}return Cesium.Color.RED.withAlpha(x);},false);setTimeout(()=>{this.poinEntity[id].billboard.color = callbackProperty;this.poinEntity[id].ellipse.show = true;this.oldId = id;},1000)},//加载点和圆dragEntity(){let drag = new DragEntity({viewer:this.$store.state.viewer, })let _this = this// this.poin = [{id:234,position:[122.8,39.9],text:"L"},{id:432,position:[122,39],text:"C"}]this.poin.forEach(item => {let entity = drag.addEntity(Object.assign(item,{minR:0, maxR:40, deviationR:1,}));_this.poinEntity[item.id] = entity;})},
}
想要完整demo可私信备注来意
cesium 闪烁点 实体闪烁相关推荐
- cesium 如何使实体平滑更新位置
如果需要不断更新实体位置,实现平滑过渡的效果可以借鉴该方式,两种方式实现,一是直接赋值新坐标位置,但有时会出现闪烁情况:这里推荐第二种,通过回调函数的方式更新位置 1 直接赋值方式 直接赋值方式:ce ...
- android设置光标闪烁,Android EditText闪烁光标
我的Activity中只有一个EditText,我希望它在输入完成后隐藏闪烁的光标 – 焦点切换或用户按下Done – 换句话说,当输入键盘消失时. 这是EditText的代码. android:la ...
- python 弹出窗口闪烁_游戏窗口闪烁
这是我的文字冒险代码,碎片.当我开始我的代码,我的按钮和窗口总是闪烁,我不知道如何解决这个问题.我试过了pygame.window.update(),但它没有带来任何东西.可能是FPS的问题,我不知道 ...
- android手机屏幕总是闪烁,手机屏幕闪烁是什么原因
手机屏幕闪烁会严重影响到我们对手机的使用,那么在遇到这种情况的时候我们应该怎么解决呢?下面是小编精心为你整理的手机屏幕闪烁的原因,一起来看看. 手机屏幕闪烁的原因 其实很多时候是由于静电造成的,我们可 ...
- 宽带服务器盒信号灯红色闪烁,光纤灯红色闪烁怎么解决(图文)
摘 要 [导读]光纤灯红色闪烁怎么解决,下面就是路由器之家整理的网络知识百科,来看看吧!大家好,我是191路由器网小编,上述问题将由我为大家讲解.光纤灯红色闪烁的原因及解决方法有: 1.光猫光接口有问 ...
- 解决html页面闪烁,前端页面闪烁的问题解决方案
平时遇见使圈是的编小久据直请结未屏屏会气机页实应高用VUE遇见页面闪烁的问题,总结了三点希望对以后大家开发有帮助能调页代事求都学是功发解开宗这维视如间请前框来总在行回断元随来以4移和泉果: 遇见在如C ...
- android 屏幕闪烁,手机屏幕闪烁怎么办
手机屏幕闪烁怎么办 手机屏幕闪烁怎么办?Android手机屏幕总是不停闪烁,让我帮忙看看怎么回事.其实这是常见的手机屏幕故障.那么手机屏幕闪烁是什么原因呢?有些是因为设置产生的,有些是由于屏幕质量的问 ...
- 计算机桌面闪烁,电脑屏幕闪烁怎么办
品牌型号:联想GeekPro 2020 系统:win7 64位旗舰版 部分用户可能电脑型号不一样,但系统版本一致都适合该方法. 在信息 现代 化和计算机普及的社会,想必我们对于电脑一点都不陌生,电脑正 ...
- echarts折线图让某一个点闪烁,echarts闪烁动画。
先贴效果图 先封装一个js import * as echarts from "echarts";export const zhexiantuChart = (id, data) ...
最新文章
- Linux下遍历文件夹的实现
- Thread系列——Thread.Sleep(0)
- python---pandas.merge使用
- AcWing - 165 小猫爬山(dfs)
- P3978 [TJOI2015]概率论
- bash知识点:文件测试
- 分解连续自然数的和_小学奥数各年级经典题解题技巧大全——分解因数法(2)...
- linux端口对ip开放,Linux 开放IP端口
- 通过while循环一步步实现九九乘法表
- DirectX9 ShadowMap例子学习笔记
- H3C WA2220E-AG 设置本地MAC+PSK认证:mac-and-psk
- 基于Easyui框架的datagrid绑定数据,新增,修改,删除方法(一)
- ActiveSync的使用
- Spring boot(四):整合Mybatis
- Spring Cloud Loadbalancer
- 最低销售量计算机公式,最低、最高、安全库存量的计算公式
- 关于Mongodb的全面总结
- css一个点,用纯CSS从一个点到另一个点绘制一条线(路径)
- javax.net.ssl.SSLHandshakeException: Unacceptable certificate: CN=GeoTrust SSL C
- 完美解决surface pro6 CPU降频导致性能下降的问题