恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

在 Mars3d 中实现多点重叠右击选择重叠点菜单

  • 首页
  • 资讯中心
  • /
  • 在 Mars3d 中实现多点重叠右击选择重叠点菜单

相关资讯

林伽一 · AI科技日报 | 2026年08月28日 2026/8/29 20:20:08
基于ROS的双UR10机械臂协同控制:从Gazebo仿真到真机部署 2026/8/29 20:20:08
海淀区创业扶持机构哪家适合小微企业?[博亚信诚]深度解析小微企业适配标准 2026/8/29 20:20:08

最新资讯

牙科AI训练数据集:多类别蛀牙精细分割实战指南
03-vscode
CSP-S 2022 提高级 第一轮 阅读程序(1)
Vue3上传(Upload)
百度校招网络笔试题深解:从TCP到epoll的底层原理与工程实践
如何为Caveman添加新的Compressor:压缩器注册与开发完全指南

今日推荐

云计算SPI三类服务模式是逐层抽象的关系:IaaS提供最底层的硬件资源,PaaS在IaaS基础上封装了开发运行环境,SaaS则进一步封装为可直接使用的软件
最新稳定版(Python 3.14):这是目前官方推荐的最新稳定版本。作为最后一个采用传统“3.x”命名的版本
etc目录下的profile.d文件目录设置环境变量和全局脚本shell

本周热门

Nextcloud 桌面客户端:把同步交给它,你只管改文件
如何将 HTML 转成 Word 文档且格式不丢失?html-to-docx 使用教程
Anki 批量操作卡片完整指南:一次搞定上千张,不再逐张修改

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

在 Mars3d 中实现多点重叠右击选择重叠点菜单

发布时间:2026/8/29 20:20:08
在 Mars3d 中实现多点重叠右击选择重叠点菜单 在 Mars3d 中实现多点重叠右击选择重叠点菜单标签Mars3DCesiumVue3三维地图前言最近用 Mars3D 做三维地图项目时遇到个需求地图上加载若干 3D 模型站点当多个站点位置完全重叠同一经纬度时右键弹出选择列表让用户挑哪一个单个 graphic 时弹出详情/定位/删除操作菜单。之前使用算法计算麻烦改为插件方法drillPick一、需求场景地图上加载 12 个城市站点北京1和北京2坐标完全一致用于测试重叠拾取用户右键时命中单个模型菜单 [“详情”, “定位”, “删除”]命中重叠模型如 北京1北京2菜单 [“北京2”, “北京1”]点哪一项就操作哪个没命中模型空地不弹菜单普通scene.pick()只能拿到顶层 graphic要拿到所有命中对象必须用穿透拾取scene.drillPick(position, limit)。二、踩坑drillPick 拿不到 graphic第一直觉代码graphicLayer.on(mars3d.EventType.rightDown,function(event){constpickedmap.scene.drillPick(event.windowPosition,10);console.log(picked);});输出结果picked.length 2✓穿透拾取正确picked[0].id undefined❌按 Cesium 文档pickedObject.id应该返回 primitive id进而能拿到绑定的 graphic 对象。Mars3D 包装后这个字段是空的这是第一个坑。三、破局三个隐藏字段 必须显式开启3.1 关键字段打开 Console 一层层扒primitivepicked[0].primitive._mars3d_graphicId// 2graphic 在图层内的 idpicked[0].primitive._mars3d_layerId// m-0f6db520-...图层 idpicked[0].primitive._id// Cesium 原生 id未设置时也是 undefinedMars3D 把 graphic id 挂在了带_mars3d_前缀的私有字段上。结合map.getLayer(lid).getGraphicById(gid)即可反查constgraphicspicked.map((p){constgidp.primitive?._mars3d_graphicId;constlidp.primitive?._mars3d_layerId;if(gidnull)returnnull;constlayerlid?map.getLayer(lid):graphicLayer;returnlayer?layer.getGraphicById(gid):null;}).filter(Boolean);3.2 必须显式开启穿透拾取这是第二个坑Mars3D 默认allowDrillPick false出于性能考虑必须显式设置newmars3d.graphic.ModelPrimitive({id:i1,name:item.name,position:item.position,allowDrillPick:true,// ← 不开则 drillPick 返回空数组style:{/* ... */},});四、最终实现4.1 右键回调核心 30 行graphicLayer.on(mars3d.EventType.rightDown,function(event){constgraphicevent.graphic;// 穿透拾取limit 给个合理上限constpickedObjectsmap.scene.drillPick(event.windowPosition,20);if(!graphic)return;// 从 drillPick 反查 graphic 实例过滤非 modelPconstgraphicspickedObjects.map((p){constgidp.primitive?._mars3d_graphicId;constlidp.primitive?._mars3d_layerId;if(gidnull)returnnull;constlayerlid?map.getLayer(lid):graphicLayer;returnlayer?layer.getGraphicById(gid):null;}).filter(Boolean).filter((g)g.typemodelP);if(graphics.length0)return;// 多 graphic 重叠 → 聚合选择单个 → 操作菜单if(graphics.length1){handleBindSelectContextMenu(graphic,graphics);}else{handleBindContextMenu(graphic);}});4.2 数据驱动的菜单分发不同类型 graphic 显示不同菜单项新增类型只需加一行constMENU_BY_TYPE{modelP:[{text:详情,action:detail},{text:定位,action:flyTo},{text:删除,action:remove},],default:[{text:详情,action:detail}],};consthandleMenuAction(action,graphic){switch(action){casedetail:console.log(详情:,graphic);break;caseflyTo:graphic.flyTo({duration:1});break;caseremove:graphic.remove();break;default:console.log(未实现:,action);}};consthandleBindContextMenu(graphic){constitemsMENU_BY_TYPE[graphic.type]||MENU_BY_TYPE.default;graphic.bindContextMenu(items.map((item)({text:item.text,callback:()handleMenuAction(item.action,graphic),})));};consthandleBindSelectContextMenu(graphic,graphics){// 多要素聚合每项名 真实 graphic 的 name/attrgraphic.bindContextMenu(graphics.map((g)({text:g.name||g.attr?.remark||#${g.id??},callback:()handleBindContextMenu(g),})));};五、效果验证场景右键菜单成都单 graphic[详情, 定位, 删除]北京1北京2 重叠[北京2, 北京1]南京滁州 重叠[滁州, 南京]空地无模型不弹菜单六、总结四个关键点反查 graphic用primitive._mars3d_graphicId_mars3d_layerId别用pickedObject.id必须开启new ModelPrimitive({ allowDrillPick: true })数据驱动菜单MENU_BY_TYPE表 action 派发新增类型零成本多 graphic 重叠先弹聚合选择菜单再递归绑定详情菜单希望帮到同样用 Mars3D 的朋友。有问题评论区交流

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号