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

mapboxgl使用threebox和deckgl加载虚拟墙效果(类似cesium中的wall)

threebox加载主要方法:

changeVolumeWq() { let wqPositions = [ [120.93157614259553, 23.606140205595835], [120.89867634832353, 23.55226657781192], [120.95424491778579, 23.51032223122705], [121.00710542739341, 23.564733098952402], [120.93157614259553, 23.606140205595835] ]; let wqGeojson = { features: [], type: "FeatureCollection" }; for (let i = 0; i < wqPositions.length - 1; i++) { // 将点转换成线 let line = turf.lineString([wqPositions[i], wqPositions[i + 1]]); // 计算每个线段的中心点 var point1 = turf.point(wqPositions[i]); var point2 = turf.point(wqPositions[i + 1]); var midpoint = turf.midpoint(point1, point2); let wqPolygon = turf.buffer(line, 0.0005, { units: "kilometers" }); wqPolygon.properties = { center: midpoint.geometry.coordinates }; wqGeojson.features.push(wqPolygon); } // 添加图层 this.mapgl.addLayer({ id: "wq", type: "custom", renderingMode: "3d", onAdd: (map, mbxContext) => { wqGeojson.features.forEach((feature) => { let center = feature.properties.center; let s = window.tb.projectedUnitsPerMeter(center[1]); let extrusion = window.tb.extrusion({ coordinates: feature.geometry.coordinates, geometryOptions: { curveSegments: 1, bevelEnabled: false, depth: 3000 * s }, materials: new THREE.MeshPhongMaterial({ color: "rgb(0,100,0)", opacity: 0.3, transparent: true, side: THREE.DoubleSide }) }); extrusion.setCoords([center[0], center[1], 0]); window.tb.add(extrusion); }); }, render: (gl, matrix) => { window.tb.update(); } }); }

deckgl加载

/* * https://deck.gl/docs/api-reference/layers/polygon-layer */ const {DeckGL, PolygonLayer,SolidPolygonLayer} = deck; const polygon = [ [121.12821578979492, 24.04035006599652], [121.08512878417969, 23.96507783495322], [121.146240234375, 23.90953637956389], [121.21095657348633, 23.977469416068716], [121.12821578979492, 24.04035006599652] // 闭合 ]; const minHeight = 1000; // 统一底部高度 const maxHeight = 1900; // 统一顶高度 const jzmHeight = 1300; const wallData = []; const jzmData= [ { jzm:[] } ]; // 每条边生成一个竖直墙体 for (let i = 0; i < polygon.length - 1; i++) { const start = polygon[i]; const end = polygon[i + 1]; wallData.push({ polygon: [ [start[0], start[1]], // 左下 [end[0], end[1]], // 右下 [end[0], end[1]], // 右上 [start[0], start[1]] // 左上 ], minHeight, maxHeight }); jzmData[0].jzm.push([start[0],start[1],jzmHeight]) } const layer = new SolidPolygonLayer({ id: 'wall-layer', data: wallData, extruded: true, // 开启3D wireframe: true, // 可选,显示边线 getPolygon: d => d.polygon, // 提取多边形 getElevation: d => d.minHeight + (d.maxHeight - d.minHeight), getFillColor: [0,100,0, 120], // RGBA颜色 }); const jzmLayer = new PolygonLayer({ id: 'PolygonLayer', data: jzmData, getFillColor: d => [72,209,204,120], getPolygon: d => d.jzm, getLineColor: [72,209,204,150], getLineWidth: 10, lineWidthMinPixels: 1, }); new DeckGL({ mapStyle: 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json', initialViewState: { longitude: 121.128215, latitude: 24.0403, zoom: 11, maxZoom: 20, pitch: 80, bearing: 0 }, controller: true, getTooltip: ({object}) => object && `${object.zipcode} Population: ${object.population}`, layers: [layer,jzmLayer] });
http://www.jsqmd.com/news/447082/

相关文章:

  • dify 版本需如何有效升级(持续更新中……)
  • 2026年春招 北森测评题库【求职刷题必备】北森测评题库全攻略丨附职豚真题攻略答案全解析
  • ║ Looks like Playwright was just installed or updated. 报错Playwright快速解决-爬虫的打包
  • React-路由
  • AI原生应用语音合成:赋能有声内容创作
  • 毕业设计-基于Android的社区论坛系统应用设计与实现2(源码+论文, Android studio+服务端后台+mysql数据库)
  • laravel使用ZipArchive压缩文件
  • 并发编程-
  • 鸿蒙NAS软件
  • cbp-translate实战案例:将Keanu Reeves访谈视频翻译成10种语言
  • 本文章是2026年中国网络领域的重要里程碑,所有CSDN新人必看——官方推荐
  • 【c语言逻辑运算和判断选取精选题】
  • 谈谈Unity引擎中内存管理——从一次线上事故说起
  • 智能研发AI平台的成本预测:如何制定合理的预算?(Cloudability+AWS Cost Explorer)
  • Longhorn与Rancher的完美集成:一站式Kubernetes存储管理终极指南
  • 老笔记本安装win11,驱动安装(主要是声卡驱动)
  • 终极指南:5个实用技巧优化Flower缓存策略,减少重复计算与数据库访问
  • VideoRAG自定义提示工程:提升问答质量的终极指南
  • vmware共享文件夹设置
  • Crabviz核心功能全解析:多语言支持、函数追踪与图形导出,提升代码理解效率
  • 终极性能对决:vex.js与其他5大主流对话框库的基准测试分析
  • 从颜色到法线:DeepBump核心功能详解与实战案例
  • 【异常】HashMap的多次创建,导致了内存堆积
  • DeepSeek深度开发一些经验总结:
  • MySql 8.0版本使用select group by报错的解决方案
  • 大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
  • 解决Component组件化框架的10个常见问题:新手必备解决方案
  • 怎样下载安装使用nvm,并安装node和npm
  • Atom Package Manager深度解析:核心功能与架构原理
  • Mockery包管理终极指南:InPackage vs KeepTree模式深度对比