当前位置: 首页 > news >正文

cesium 实战系列之独栋建筑选中特效

在某个项目中有这样一个需求,在众多建筑中选中其中的一个,并给其加上选中效果,我在网上找了很多篇文章都是说的模棱两可的,要不就是根本不能实现,要不就是实现出来的效果不对,我这里给出我的实现思路和效果。

最终效果:

实现思路:通过鼠标拾取事件获取建筑物信息,我这里是拿到建筑物的bsm唯一标识码,然后通过后端拿到建筑物的geojson数据,根据geojson和建筑物高度,生成面之后拉伸高度,就有了这个建筑物的外部轮廓,然后利用canvas 生成渐变色材质给entity的material贴图即可。有了geojson也就可以知道中心点坐标,然后再生成其他图标,将他们放在合适的位置即可。

代码实现:

点击获取建筑物信息,后端请求获取geojson

initMapListener() { var that = this; handler.setInputAction((movement) => { //获取点击模型 let pick = viewer.scene.pick(movement.position); if (pick instanceof Cesium.Cesium3DTileFeature) { that.api .queryBuildingRange({ BSM: pick.getProperty("bsm") }) .then((res) => { if (res.build_range) { createBuildEntity( JSON.parse(res.build_range), pick.getProperty("jzgd") ); } }); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); },

根据geojson生成建筑物外轮廓,attach渐变色材质。

//生成渐变色材质 var getColorRamp = function () { var ramp = document.createElement('canvas'); let ctx = ramp.getContext("2d"); var grad = ctx.createLinearGradient(0, 0, 200,200) // 创建一个渐变色径向/圆对象 grad.addColorStop(0, "rgba(18,56,254,0.60)"); // 设置渐变颜色 grad.addColorStop(1, "rgba(167,254,254,0.37)"); ctx.fillStyle = grad; // 设置fillStyle为当前的渐变对象 ctx.fillRect(0,0,500,500); // 绘制渐变图形 return ramp; } //根据geojson生成建筑物外轮廓 function createBuildEntity(geojson,height) { viewer.dataSources.removeAll(); Cesium.GeoJsonDataSource.load(geojson).then(function(dataSource) { viewer.dataSources.add(dataSource); // viewer.flyTo(dataSource) let entities = dataSource.entities.values; for (let i = 0; i < entities.length; i++) { let entity = entities[i]; entity.polygon.material = new Cesium.ImageMaterialProperty({ image: getColorRamp(), transparent: true }) entity.polygon.outline = true; entity.polygon.outlineColor = Cesium.Color.fromCssColorString('#02d8fe') // 将高度拉伸至35米 entity.polygon.extrudedHeight = height+2; } }); }

根据建筑物中心坐标生成其余entities,放上去。

function addLeftEntity(lng,lat,height){ removeEntityById("left_1"); removeEntityById("left_2"); let position0 = Cesium.Cartesian3.fromDegrees(lng,lat,height) let entity = viewer.entities.add({ id: `left_1`, position: position0, billboard: { image: "static/img/center.png", scale: 0.5, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.CENTER, disableDepthTestDistance: Number.POSITIVE_INFINITY,//被建筑物遮挡问题 } }) var polyline1 = viewer.entities.add({ id:"left_2", polyline: { positions: [ Cesium.Cartesian3.fromDegrees(lng,lat,height), Cesium.Cartesian3.fromDegrees(lng,lat,height+60), Cesium.Cartesian3.fromDegrees(lng+0.0002,lat,height+60) ], width: 1, material: new Cesium.PolylineDashMaterialProperty({ color: Cesium.Color.WHITE, dashLength: 20 //短划线长度 }) } }); }

至此就结束了,至于弹框内容就是个div,通过经纬度转换平面像素给定位置,显示出来即可,这里就不过多介绍。

http://www.cnnetsun.cn/news/4068842.html

相关文章:

  • 笔记 25 - 2 :linux 驱动模块移植,创建自定义驱动(编译为模块),调整 shell 里字体大小,
  • Ryujinx模拟器终极配置指南:从五分钟上手到性能拉满
  • Plain Craft Launcher 2 快速上手指南:免费开源 Minecraft 启动器的完整玩法
  • 国产大模型落地业务系统的优选载体:京微智枢信创 AI 业务支撑平台
  • iperf3 Windows版完整实测指南:8条命令测穿带宽上限,新手避坑与版本选择全解析
  • 为什么选择Llama-3.1-8B-Instruct-w4a16-asym-torchao-v0.17.0?16GB模型瘦身至5.8GB的W4A16量化方案解析
  • 单片机毕设选题推荐:基于 STM32 的雨水光照传感器数据监测与执行系统设计 基于 STM32 的步进电机模拟雨刮智能控制系统设计(013403)
  • Windows 驱动优化终极指南:AutoGpuAffinity、GoInterruptPolicy 与 MSI Utility V3 三剑客实战手册
  • AMD 显卡也能用 DLSS?OptiScaler 带你玩转显卡超采样切换
  • 装完这个免费开源的英雄联盟游戏助手,我把排队选人的时间还给了自己
  • Unity 脚本层与原生引擎层分离架构:原理、实现与工程实践
  • 智能体开发全流程:从框架选型到落地实践
  • 台州热水器壁挂炉维修-欧米到家持证师傅同城上门全家电检修维保|承诺全类故障根治|先报价再维修不加价不返工
  • MySQL表差集查询:NOT IN、LEFT JOIN、NOT EXISTS与EXCEPT性能对比与实战指南
  • 嵌入式开发必备:5款高效串口网络调试工具深度解析与实战指南
  • 铝合金氩弧焊实战指南:从氧化膜清理到熔池控制的工艺精髓
  • YOLO技术应用11-YOLO 工业质检实战:从 0 到 1 搭建汽车零件缺陷检测系统
  • D2DX宽屏补丁快速上手指南:让暗黑破坏神2在现代PC上跑出高清画面与60帧流畅体验
  • 基于Java的医院综合管理系统实现与设计
  • 排位遇到高手还是菜鸟?英雄联盟战绩查询工具 Seraphine 用3秒给你答案
  • C语言运算符深度解析:从优先级到实战避坑指南
  • JDBC从入门到连接池小白教程
  • 国产奥迪Q2定价策略与市场前景分析:豪华入门SUV新变数
  • 黑苹果EFI工具怎么选?OpCore-Simplify:15分钟一键生成EFI的免费神器
  • 洛雪音乐音源资源库完整指南:一篇文章轻松搞定免费高品质音源导入与选择
  • 自研 Geo 地域优化源码,批量构建城市分站技术思路
  • elli WebSocket 实现指南:Handover 机制让双工通信更简单的 30 分钟实战
  • PingFangSC字体免费开源:绕过中文网页跨平台排版的三道坎
  • Linux系统下R语言环境搭建与包管理全攻略
  • KMS激活工具完整实战记录:一条脚本让 Windows 和 Office 激活不再是难题