使用 deck.gl 与 Esri ArcGIS API for JavaScript 集成:纯 JavaScript 示例实战指南
使用 deck.gl 与 Esri ArcGIS API for JavaScript 集成纯 JavaScript 示例实战指南【免费下载链接】deck.glWebGL2 powered visualization framework项目地址: https://gitcode.com/GitHub_Trending/de/deck.gl本文基于 deck.gl 仓库中的 examples/get-started/pure-js/arcgis 示例讲解如何在 ArcGIS JavaScript 应用中通过deck.gl/arcgis模块接入 deck.gl 图层实现 ArcGIS 底图与 deck.gl 高性能 WebGL 可视化层的同屏渲染。读完本文你将掌握DeckLayer的接入方式、deck.*属性转发机制、完整示例代码的逐行拆解以及基于 Vite 的开发与生产构建流程并了解该集成方案的能力边界与注意事项。示例概览ArcGIS 底图上的 deck.gl 图层examples/get-started/pure-js/arcgis是一个极简的纯 JavaScript无框架示例页面加载 ArcGIS 地图dark-gray-vector 暗色底图在其上叠加由DeckLayer承载的两组 deck.gl 图层——用GeoJsonLayer渲染全球机场点、用ArcLayer绘制从伦敦出发的航线弧线。整个工程使用 Vite 负责模块打包与本地服务支持热更新开发与生产构建。示例目录仅包含四个文件结构一目了然app.js—— 核心逻辑创建DeckLayer并挂载到MapViewindex.html—— 页面骨架与 ArcGIS 样式引用package.json—— 依赖声明与 npm 脚本README.md—— 使用说明即本文所依据的关联文档环境准备与依赖安装首先在示例目录下安装依赖README 提供了 npm 与 yarn 两种方式npm install # 或 yarn从 package.json 可以看到实际安装的依赖{ dependencies: { arcgis/core: ^4.28.0, deck.gl/arcgis: ^9.0.0, deck.gl/core: ^9.0.0, deck.gl/layers: ^9.0.0 }, devDependencies: { vite: ^7.3.3 } }依赖说明deck.gl/arcgis—— deck.gl 与 ArcGIS 的桥接模块提供DeckLayer、DeckRenderer、loadArcGISModules等 API详见 docs/api-reference/arcgis/overview.mddeck.gl/core与deck.gl/layers—— deck.gl 核心运行时及内置图层GeoJsonLayer、ArcLayer等均来自 layers 模块arcgis/core—— Esri 官方 ES Modules 形式的 ArcGIS API for JavaScript本示例采用本地安装的 ES Modules 方式因此DeckLayer可以直接从deck.gl/arcgis导入关于 AMD/CDN 与 ES Modules 两种加载方式的差异见下文加载方式的选择vite—— 开发服务器与构建工具。运行命令开发与生产构建README 给出两条核心命令npm start—— 开发模式启动 Vite 开发服务器并自动打开浏览器支持热更新Hot Module Replacement修改app.js或index.html后页面即时刷新npm run build—— 生产模式执行vite build将源码打包为最终产物并写入磁盘默认输出到dist/目录。此外 package.json 中还提供了一条本地开发脚本npm run start-local它通过vite --config ../../../vite.config.local.mjs使用仓库根目录下的 vite.config.local.mjs 配置便于在 deck.gl 源码仓库内部以本地模块workspace 中的 modules替代 npm 发布版本进行联调——如果你正在开发 deck.gl 本身或需要调试最新未发布特性这条命令会非常有用。页面骨架index.html 解析index.html 是标准的 HTML 入口!doctype html html head meta charsetUTF-8 / titledeck.gl w/ Esri ArcGIS API for JavaScript example/title link relstylesheet hrefhttps://js.arcgis.com/4.14/esri/themes/light/main.css/ style html, body, #viewDiv { padding: 0; margin: 0; width: 100%; height: 100%; } /style /head body div idviewDiv/div script typemodule srcapp.js/script /body /html要点引入 ArcGIS 官方主题样式main.css保证地图控件样式正常CSS 将html、body、#viewDiv全部铺满视口这是 ArcGIS 地图容器填满整个页面的标准写法script typemodule加载app.jsVite 会将其作为 ES Module 入口进行依赖解析与打包。核心集成代码逐行拆解app.js 是整个示例的核心全部逻辑只有几十行。下面分段说明。1. 导入依赖与数据源import {DeckLayer} from deck.gl/arcgis; import {GeoJsonLayer, ArcLayer} from deck.gl/layers; import ArcGISMap from arcgis/core/Map; import MapView from arcgis/core/views/MapView; const AIR_PORTS https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_airports.geojson;DeckLayer是deck.gl/arcgis提供的 ArcGIS Layer 子类负责把 deck.gl 图层嵌入 ArcGIS 地图详见 docs/api-reference/arcgis/deck-layer.md数据源使用 Natural Earth 的全球机场数据GeoJSON 格式经 deck.gl 的异步数据加载机制自动拉取。2. 创建 DeckLayer 并声明 deck.gl 图层const layer new DeckLayer({ deck.getTooltip: info info.object info.object.properties.name, deck.layers: [ new GeoJsonLayer({ id: airports, data: AIR_PORTS, filled: true, pointRadiusMinPixels: 2, pointRadiusScale: 2000, getPointRadius: f 11 - f.properties.scalerank, getFillColor: [200, 0, 80, 180], pickable: true, autoHighlight: true, onClick: info info.object alert(${info.object.properties.name} (${info.object.properties.abbrev})) }), new ArcLayer({ id: arcs, data: AIR_PORTS, dataTransform: d d.features.filter(f f.properties.scalerank 4), getSourcePosition: f [-0.4531566, 51.4709959], // London getTargetPosition: f f.geometry.coordinates, getSourceColor: [0, 128, 200], getTargetColor: [200, 0, 80], getWidth: 1 }) ] });这里体现了DeckLayer最关键的设计凡是以deck.前缀开头的属性都会被转发给内部的一个Deck实例。本示例用到了其中两个deck.layers—— 声明要渲染的 deck.gl 图层数组这是最常用的属性deck.getTooltip—— 返回悬停提示文本这里显示机场名称。GeoJsonLayer的样式与交互配置也很有参考价值pointRadiusMinPixels: 2与pointRadiusScale: 2000—— 半径下限像素与缩放系数保证在低缩放级别下点不至于过小getPointRadius: f 11 - f.properties.scalerank—— 根据数据的scalerank属性动态决定半径等级越高数字越小半径越大getFillColor: [200, 0, 80, 180]—— 半透明洋红色填充pickable: true、autoHighlight: true、onClick—— 开启拾取、悬停高亮与点击弹窗显示机场名称及缩写。ArcLayer则展示了数据预处理与轨迹绘制dataTransform: d d.features.filter(f f.properties.scalerank 4)—— 只保留scalerank 4的机场减少弧线数量保证画面清晰getSourcePosition—— 固定为伦敦坐标[-0.4531566, 51.4709959]所有弧线从伦敦出发getTargetPosition: f f.geometry.coordinates—— 目标点为各机场坐标getSourceColor/getTargetColor—— 起点为蓝色、终点为洋红色形成渐变视觉效果。3. 挂载到 ArcGIS MapViewconst mapView new MapView({ container: viewDiv, map: new ArcGISMap({ basemap: dark-gray-vector, layers: [layer] }), center: [0.119167, 52.205276], zoom: 5 });这段代码遵循 ArcGIS API for JavaScript 的标准组织方式MapView负责显示MapMap通常至少包含一个底图basemap。deck.gl 的DeckLayer与普通 ArcGIS 图层完全同构直接放进map.layers数组即可container: viewDiv对应 HTML 中的容器元素basemap: dark-gray-vector选用暗色矢量底图与弧线、机场点的亮色形成对比center与zoom将初始视角定位到伦敦与弧线起点一致缩放级别 5。DeckLayer会把内部 deck.gl 视图状态与MapView的相机同步因此平移、缩放地图时deck.gl 图层会与 ArcGIS 底图无缝联动。底层原理DeckLayer 是如何工作的深入 modules/arcgis/src 源码可以看到集成的实现方式。核心工厂函数 createDeckLayer 通过 ArcGIS 的Layer.createSubclass创建图层子类其构造函数内部维护一个deck属性ArcGISAccessor实例用于承载全部deck.*转发属性。当MapView需要为图层创建图层视图时会调用createLayerView(view)若视图类型为2d即MapView返回DeckLayerView2D实例由 deck-layer-view-2d.ts 负责把 deck.gl 渲染进 ArcGIS 的绘制管线若视图为 3DSceneView则明确报错并提示改用DeckRenderer——这印证了当前DeckLayer仅支持 2D 集成的限制见 docs/api-reference/arcgis/deck-layer.md 与 docs/api-reference/arcgis/overview.md。DeckLayer上还声明了blendMode与effect两个可配置属性示例中被注释掉的effect: bloom(1.5, 0.5px, 0.1)展示了一种后处理特效的用法可在需要时取消注释体验辉光效果。动态更新 deck 属性由于deck是一个 ArcGISAccessor图层创建后仍可随时更新// 替换全部图层 layer.deck.layers [...]; // 批量更新多个属性 layer.deck.set({ layers: [...], pickingRadius: 5, getTooltip: ..., });这在数据源切换、交互参数调整等场景中非常实用。加载方式的选择AMD 模块还是 ES Modulesoverview.md 强调DeckLayer和DeckRenderer继承自 ArcGIS 核心类因此只有当 ArcGIS 可用时才存在。ArcGIS API for JavaScript 有两种加载方式deck.gl/arcgis的导入方式必须与之匹配AMD 模块CDN esri-loader若应用通过esri-loader从 CDN 加载 ArcGIS例如使用esri/react-arcgis的场景则不应直接import {DeckLayer}而应调用loadArcGISModules异步获取集成类import {loadArcGISModules} from deck.gl/arcgis; loadArcGISModules([esri/Map, esri/views/MapView], {version: 4.21}) .then(({DeckLayer, DeckRenderer, modules}) { const [ArcGISMap, MapView] modules; // 之后与示例中用法一致 });loadArcGISModules(modules, loadScriptOptions)接受 esri 模块名数组与 esri-loader 配置返回的 Promise 解析为{DeckLayer, DeckRenderer, modules}详见 docs/api-reference/arcgis/load-arcgis-modules.md。仓库的集成测试应用 test/apps/arcgis/app.js 正是采用这种模式通过loadArcGISModules同时加载esri/Map、esri/views/MapView、esri/views/SceneView与esri/views/3d/webgl/RenderNode并显式指定 ArcGIS CDN 版本https://js.arcgis.com/4.32/再分别创建 2D 的DeckLayer与 3D 的DeckRenderer。ES Modules本地安装 arcgis/core本示例即属此类——应用直接import ArcGISMap from arcgis/core/Map此时DeckLayer也应直接从deck.gl/arcgis导入。关键原则是Deck 类的导入方式必须与 ArcGIS 依赖的加载方式保持一致。另外若使用独立打包Standalone Bundle方式通过script标签引入则只有loadArcGISModules会被导出DeckLayer/DeckRenderer需在其 Promise 解析后才可用。3D 集成的实验性方案DeckRenderer虽然本示例只演示了 2D 的MapView集成但deck.gl/arcgis还提供了针对 3DSceneView的实验性支持——DeckRenderer详见 docs/api-reference/arcgis/deck-renderer.md它实现 ArcGIS 的RenderNode接口可挂接到 3D 场景的渲染管线目前仅支持viewingMode: local局部坐标模式的SceneView构造函数为new DeckRenderer(sceneView, props)sceneView的viewingMode必须为localDeckRenderer会从SceneView的实时相机管理自身的 deck.gl 视图状态并自动注册为 RenderNode不要再将其添加到map.layers其props直接透传给Deck实例支持的属性与DeckLayer的deck.*属性集合基本一致layers、effects、onClick、onHover等。能力边界与注意事项overview.md 明确列出了该集成方案的支持范围支持的 deck.gl 特性图层Layers特效Effects属性过渡Attribute transitions自动高亮Auto-highlightingonHover与onClick回调不支持的特性多视图Multiple views控制器Controller即由 deck.gl 直接接管交互相机React 集成React integration抗锯齿注意事项deck.gl 在此集成中会渲染到一个辅助帧缓冲再合成进 ArcGIS 场景。该帧缓冲未开启多重采样抗锯齿MSAA因此依赖 MSAA 处理边缘的图层——包括PathLayer、LineLayer、ArcLayer、PointCloudLayer——会产生明显的锯齿边缘这与 ArcGIS 上下文本身的抗锯齿设置无关。解决办法是在这些图层上显式设置antialiasing: true让其在着色器中自行计算边缘覆盖率对于组合图层如GeoJsonLayer、PolygonLayer对应属性名为lineAntialiasing。这一点对追求高画质的应用非常关键本示例中的ArcLayer绘制弧线时同样可以应用该建议。小结examples/get-started/pure-js/arcgis示例展示了 deck.gl 与 Esri ArcGIS API for JavaScript 集成的最小完整路径通过deck.gl/arcgis的DeckLayer把 deck.gl 图层作为普通 ArcGIS 图层挂入MapView配合 Vite 即可获得开发热更新与生产构建能力。其核心机制——deck.*属性转发、createLayerView的 2D/3D 分派、以及 AMD 与 ES Modules 两种加载方式的匹配规则——决定了集成的灵活性也划定了能力边界。无论是希望在 ArcGIS 地图上叠加 GeoJSON 数据、轨迹弧线还是更进一步探索 3D 的DeckRenderer实验方案都可以以此为起点快速落地。如需进一步查阅可参考仓库内的 deck.gl/arcgis 模块源码、API 参考文档 以及 集成测试应用。【免费下载链接】deck.glWebGL2 powered visualization framework项目地址: https://gitcode.com/GitHub_Trending/de/deck.gl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考