deck.gl 如何使用 widgets 模块为可视化界面添加缩放、指北针等交互控件
deck.gl 如何使用 widgets 模块为可视化界面添加缩放、指北针等交互控件【免费下载链接】deck.glWebGL2 powered visualization framework项目地址: https://gitcode.com/GitHub_Trending/de/deck.gl如果你的 deck.gl 可视化页面只有裸的 canvas用户就只能靠鼠标手势控制视图。deck.gl/widgets模块在 canvas 之外提供了一组现成的 UI 控件ZoomWidget放大/缩小、CompressWidget之外的指北针CompassWidget显示方位角与俯仰角并支持点击复位、ScreenshotWidget截图下载、FullscreenWidget全屏切换等通过Deck实例的widgets属性即可挂载。该模块自 deck.gl v9.0 起提供ZoomWidget、CompassWidget、FullscreenWidget为 v9.0ScreenshotWidget自 v9.2zoomStep参数自 v9.4因此需要 deck.gl 9.x 版本。安装与引入安装依赖npm install deck.gl/core deck.gl/widgets也可以在package.json中直接安装完整包deck.gl。在代码中必须同时引入控件样式表deck.gl/widgets/stylesheet.css否则控件没有外观import {Deck} from deck.gl/core; import {ZoomWidget, CompassWidget} from deck.gl/widgets; import deck.gl/widgets/stylesheet.css;把控件挂到 Deck 实例控件以数组形式传给Deck的widgets属性。下面的例子在页面左上角placement默认值top-left放置缩放控件和指北针控件parent指向页面中一个已存在的容器元素import {Deck} from deck.gl/core; import {ZoomWidget, CompassWidget} from deck.gl/widgets; import deck.gl/widgets/stylesheet.css; new Deck({ parent: document.getElementById(deck-root), initialViewState: { longitude: -122.4, latitude: 37.8, zoom: 11, pitch: 45, bearing: 30 }, controller: true, widgets: [ new ZoomWidget({placement: top-left}), new CompassWidget({placement: top-left}) ] });placement可选top-left、top-right、bottom-left、bottom-right、fill用于决定控件在视图内的停靠位置。在 React 项目中同样的控件作为DeckGL的子组件传入import React from react; import {DeckGL, ZoomWidget, CompassWidget} from deck.gl/react; import deck.gl/widgets/stylesheet.css; function App() { return ( DeckGL initialViewState{{longitude: 0, latitude: 52, zoom: 4}} controller ZoomWidget placementtop-left / CompassWidget placementtop-left / /DeckGL ); }验证方式页面渲染后容器左上角应出现对应的按钮鼠标悬停时显示控件的提示文字v9.5 起内置主题化 tooltip。各控件的参数与验证ZoomWidget缩放控件点击放大、-缩小每次按zoomStep改变缩放级别支持 Map 视图和 Globe 视图。常用参数orientation按钮方向默认vertical可选horizontalzoomStep每次点击的缩放增量默认1v9.4 起提供transitionDuration缩放过渡时长毫秒默认200zoomAxis默认all可选X、Y仅在当前视图是OrthographicView时生效onZoom点击回调参数为{viewId, delta, zoom}其中delta为1放大或-1缩小zoom为新的缩放级别。用这个回调打印参数是确认控件确实驱动了视图变化的最直接方式。CompassWidget指北针控件指北针实时显示当前视图的bearing方位角和pitch俯仰角支持MapView和GlobeView。交互规则点击一次将bearing复位为 0再点击第二次将pitch复位为 0。回调onReset会收到{viewId, bearing, pitch}其中bearing为新值 0若bearing原本就是 0 则pitch为 0。验证方式先用initialViewState设置非零的pitch: 45, bearing: 30如上文示例点击指北针两次点击后视图应回到正北、无俯仰的状态。ScreenshotWidget截图控件v9.2 起点击控件后浏览器会将当前 deck.gl 画布截图并下载到用户的下载文件夹。常用参数filename下载文件名默认screenshot.pngimageFormat默认image/png浏览器还可能支持image/jpeg、image/webp、image/avifonCapture允许应用接管截图逻辑用于集成更高级的截图模块。注意文档明确的边界只截取 deck.gl 画布本身画布上下层的 HTML 元素不在截图内例如非交错式底图和控件本身都不会被截到。验证方式点击后在浏览器下载目录中出现对应文件默认名为screenshot.png。FullscreenWidget全屏控件可选点击控件进入或退出全屏默认将地图容器元素设为全屏container参数可指定其他兼容的 DOM 元素。onFullscreenChange(fullscreen)回调在状态变化时触发可用于记录状态。多视图下指定控件归属多视图场景中带 UI 的控件可以通过viewId绑定到具体视图控件会相对该视图定位并且只响应该视图内的事件viewId为null默认时控件位于共享的 widget 根容器接收所有视图的事件。new Deck({ views: [ new MapView({id: left-map}), new MapView({id: right-map}) ], widgets: [ new FullscreenWidget({placement: top-right}), new ZoomWidget({viewId: left-map}), new GimbalWidget({viewId: right-map}) ] });一个容易踩的坑deck.gl 要求每个控件的id唯一默认id基于控件类型。同一类型出现两个实例比如两个ZoomWidget时必须给至少一个显式设置id例如new ZoomWidget({id: tokyo-zoom, viewId: tokyo})。另外默认容器中的控件会被视图级控件覆盖显示同一视图内多个控件注意用不同的placement错开。主题与样式内置控件支持深色和浅色两套外观。跟随系统主题的一种写法import {DarkGlassTheme, LightGlassTheme} from deck.gl/widgets; const prefersDarkScheme window.matchMedia((prefers-color-scheme: dark)); const widgetTheme prefersDarkScheme.matches ? DarkGlassTheme : LightGlassTheme; new Deck({ widgets: [ new ZoomWidget({style: widgetTheme}), new CompassWidget({style: widgetTheme}) ] });主题对整个 deck 实例全局生效不能为不同视图指定不同主题。更细粒度的外观调整走 CSS 变量.deck-widget选择器作用于所有控件.deck-widget-fullscreen这类选择器只作用于指定类型style属性或自定义 class 可以只作用于单个实例。常用变量包括--button-size默认28px、--widget-margin默认12px、--button-background等。每个控件还有专属的图标变量例如缩放控件的--icon-zoom-in/--icon-zoom-out、指北针的--icon-compass可替换为自己的 SVG Data Url。限制与排查要点版本要求widgets 模块整体来自 v9.0ScreenshotWidget来自 v9.2zoomStep来自 v9.4tooltip 主题化来自 v9.5在 8.x 及以下版本中不存在该模块。控件不显示确认引入了deck.gl/widgets/stylesheet.css且parent指向的容器真实存在、有尺寸。zoomAxis只对OrthographicView生效在普通MapView上设置X或Y没有效果。同一类型多个控件未设置唯一id时deck.gl 无法在渲染调用之间匹配控件需要显式传id。截图控件不截取画布外的 HTML 内容和控件本身这是文档明确的行为不是 bug。完整控件清单、自定义控件写法继承Widget类并实现onRenderHTML、onRedraw以及样式变量全表可继续参考 widgets 模块总览、Widget 基类文档、样式指南 和 tooltip 文档。【免费下载链接】deck.glWebGL2 powered visualization framework项目地址: https://gitcode.com/GitHub_Trending/de/deck.gl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

VTK医学图像三维重建:体绘制与面绘制的实战要点与选型指南

VTK医学图像三维重建:体绘制与面绘制的实战要点与选型指南

这个选题我很早就想写了。医学图像三维重建是 VTK 最经典的应用方向之一,而体绘制和面绘制这两条技术路线,几乎每一位做医疗可视化、手术导航、影像后处理的人都会遇到。很多人一上来就用体绘制,结果调了半天颜色、透明度,还是糊成…

2026/11/7 5:55:02 阅读更多 →
LangChain4j 集成 Jina Reranker:在 Java RAG 管线中实现语义重排

LangChain4j 集成 Jina Reranker:在 Java RAG 管线中实现语义重排

LangChain4j 集成 Jina Reranker:在 Java RAG 管线中实现语义重排 【免费下载链接】langchain4j LangChain4j is an idiomatic, open-source Java library for building LLM-powered applications on the JVM. It offers a unified API over popular LLM providers …

2026/11/13 19:35:57 阅读更多 →
人工势场法实现多机器人编队协同避障:原理、代码与调参实战

人工势场法实现多机器人编队协同避障:原理、代码与调参实战

多机器人编队这事,听起来高大上,但落地时你会发现,真正的难点根本不是“让机器人排好队”,而是它们遇到障碍物之后,还能不能稳住队形接着走。我最早做多机器人协同搬运项目时,就卡在这个问题上——单机避障…

2026/11/6 23:22:54 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/13 5:13:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/13 5:13:25 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/13 5:13:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻