ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

deck.gl 主模块(modules/main)完全指南:安装、图层系统与三种接入方式实战

deck.gl 主模块(modules/main)完全指南:安装、图层系统与三种接入方式实战 deck.gl 主模块modules/main完全指南安装、图层系统与三种接入方式实战【免费下载链接】deck.glWebGL2 powered visualization framework项目地址: https://gitcode.com/GitHub_Trending/de/deck.gldeck.gl 是一个基于 WebGL2 的 GPU 加速、面向大规模数据可视化的开源框架而deck.gl主模块即仓库中的 modules/main是把 core、layers、geo-layers、react、widgets 等全部子模块聚合打包的全家桶入口。本文以 modules/main/README.md 为骨架结合仓库源码深入讲解如何安装主模块、理解 Layer 图层 API、以及用 React 组件和纯 JavaScript 两种方式快速上手构建可视化应用。一、什么是 deck.gl 主模块根据 modules/main/README.md 的定义deck.gl 是一个GPU-poweredGPU 驱动、高性能的大规模数据可视化框架。它的核心设计哲学是数据驱动图层的输入通常是一个 JSON 对象数组框架负责将数据转换为 GPU 可绘制的顶点数据图层Layer是核心抽象每个图层都是一个可复用的渲染单元拥有高度灵活的 API 来控制数据如何被渲染覆盖层Overlay定位图层作为透明覆盖层叠加在地图或其他容器之上因此可以无缝与 Mapbox、MapLibre、Google Maps、ArcGIS 等底图集成。从仓库的模块划分看deck.gl框架由一个主模块和一系列子模块组成而deck.gl主模块npm包名即deck.gl是唯一一个依赖全部功能子模块的聚合包。查看 modules/main/package.json 可以看到它声明了这些依赖依赖包职责deck.gl/core核心渲染管线、数据管理、用户交互Deck类所在地deck.gl/layers基础图元图层是所有可视化的积木deck.gl/aggregation-layers聚合类图层热力图、等高线、六边形格网等deck.gl/geo-layers地理空间场景图层与 GIS 格式支持deck.gl/mesh-layers3D 网格与场景图渲染deck.gl/reactReact 封装组件deck.gl/widgetsUI 组件缩放、罗盘、图例等deck.gl/extensions、deck.gl/carto、deck.gl/mapbox、deck.gl/maplibre、deck.gl/google-maps、deck.gl/arcgis、deck.gl/json等扩展、数据源与第三方地图平台集成因此对于大多数开发者来说安装一个deck.gl主模块就等于拥有了全部能力。二、安装一条命令引入全家桶主模块 README 给出的安装方式非常简洁npm install deck.gl若使用 Yarn可参考仓库的 docs/get-started/getting-started.mdyarn add deck.gl2.1 按需安装子模块可选优化deck.gl主模块包含所有功能及其依赖包体积较大。若想按需裁剪可以只安装用到的子模块例如# 仅渲染 PointCloudLayer 所需的两个包 yarn add deck.gl/core deck.gl/layers # 使用 HexagonLayer 且配合 React yarn add deck.gl/core deck.gl/layers deck.gl/aggregation-layers deck.gl/react需要注意的是子模块之间是同步发布的版本当前仓库中统一为9.4.0-beta.4单独安装时需要手动保证版本一致否则可能出现 API 不匹配。大部分打包工具Webpack、Rollup、Vite 等都支持 tree-shaking会从主模块中剔除未使用的导出这也是很多项目直接安装deck.gl的原因。从 modules/main/package.json 还可以看到主模块的peerDependencies中react、react-dom16.3.0、maplibre-gl、arcgis/core都被声明为可选意味着即使你不使用 React 或任何底图库主模块依然可以正常工作这保证了纯 JS 也可用全家桶。三、图层Layer系统可视化的核心积木README 指出deck.gl 提供了丰富的预打包可视化图层目录包括但不限于ScatterplotLayer散点图图层ArcLayer弧线图层TextLayer文本标注图层GeoJsonLayerGeoJSON 数据图层这些只是冰山一角。查看主模块的聚合导出文件 modules/main/src/index.ts可以看到它从各子模块 re-export 了完整的图层家族基础图层来自deck.gl/layersArcLayer、BitmapLayer、IconLayer、LineLayer、PointCloudLayer、ScatterplotLayer、GridCellLayer、ColumnLayer、PathLayer、PolygonLayer、SolidPolygonLayer、GeoJsonLayer、TextLayer聚合图层来自deck.gl/aggregation-layersScreenGridLayer、HexagonLayer、ContourLayer、GridLayer、HeatmapLayer地理图层来自deck.gl/geo-layersGreatCircleLayer、S2Layer、QuadkeyLayer、H3ClusterLayer、H3HexagonLayer、TileLayer、TripsLayer、Tile3DLayer、TerrainLayer、MVTLayer、GeohashLayer等网格图层来自deck.gl/mesh-layersScenegraphLayer、SimpleMeshLayer。每个图层的输入通常是一个 JSON 对象数组图层提供高度灵活的访问器AccessorAPI 来决定如何从数据中提取位置、半径、颜色等视觉属性。四、第一个实战示例ScatterplotLayer 散点图README 给出了一个构造ScatterplotLayer的典型示例数据形状如下与仓库中的 test/data/bart-stations.csv 所描述的场景一致即旧金山 BART 地铁站数据{ name: Montgomery St. (MONT), address: 598 Market Street, San Francisco CA 94104, entries: 43430, exits: 45128, coordinates: [-122.401407, 37.789256] }对应的图层构造代码import {ScatterplotLayer} from deck.gl/layers; const scatterplotLayer new ScatterplotLayer({ id: bart-stations, data: https://github.com/visgl/deck.gl-data/blob/master/website/bart-stations.json, getRadius: d Math.sqrt(d.entries) / 100, getPosition: d d.coordinates, getColor: [255, 228, 0], });4.1 逐项解析三个核心访问器id图层唯一标识用于图层更新与调试data数据源。可以是 URL、数组或已加载的数据对象getPosition位置访问器返回每个数据点的[经度, 纬度]或[x, y, z]坐标。示例中直接返回d.coordinatesgetRadius半径访问器控制散点半径示例中通过Math.sqrt(d.entries) / 100让客流更大的站点画得更大getColor颜色访问器返回[r, g, b]或[r, g, b, a]颜色数组示例中为亮黄色。4.2 源码级的默认值与细节对照散点图图层的真实实现 modules/layers/src/scatterplot-layer/scatterplot-layer.ts可以确认更多细节默认值定义defaultPropsgetPosition默认为x x.position即数据中默认取position字段getRadius默认为1getFillColor、getLineColor默认均为黑色[0, 0, 0, 255]radiusUnits默认为meters米制另有radiusScale默认 1、radiusMinPixels默认 0、radiusMaxPixels默认Number.MAX_SAFE_INTEGER控制半径的缩放与像素上下限stroked默认false、filled默认true、billboard默认false圆点默认平行于地面而非始终面向相机、antialiasing默认true。兼容性提示源码中getColor已被标记为deprecatedFor: [getFillColor, getLineColor]即推荐改用getFillColor填充色与getLineColor描边色来分别控制。README 示例中使用的getColor是历史写法新代码建议直接使用拆分后的两个访问器。属性管线图层内部通过AttributeManager注册instancePositionssize 3、支持 64 位浮点坐标fp64、instanceRadius、instanceFillColors、instanceLineColors、instanceLineWidths等 GPU 属性所有访问器都支持过渡动画transition: true。五、三种接入方式主模块 README 展示了两种最常用的接入方式加上脚本化Scripting方式共三种。5.1 方式一React 组件接入DeckGL如果项目使用 React可以直接使用主模块导出的DeckGLReact 组件import DeckGL from deck.gl; DeckGL width100% height100% longitude{-122.4} latitude{37.78} zoom{8} controller{true} layers{[scatterplotLayer]} /要点说明longitude/latitude/zoom定义了初始相机视角旧金山区域缩放级别 8controller{true}开启交互控制器用户可拖拽、缩放、旋转视角layers传入图层数组可传入多个图层叠加渲染从源码 modules/main/src/index.ts 可以看到主模块通过export {default, DeckGL} from deck.gl/react将 React 组件作为默认导出因此import DeckGL from deck.gl与命名导入DeckGL均可使用。官方推荐的 React 用法是使用initialViewState代替散落的longitude/latitude/zoom详见 docs/api-reference/react/deckgl.md 与 docs/get-started/using-with-react.md。当通过initialViewState传入时deck.gl 会以受控方式维护视角状态。5.2 方式二纯 JavaScript 接入Deck 类不依赖任何框架时使用deck.gl/core的Deck类import {Deck} from deck.gl/core; const deck new Deck({ container: document.body, width: 100vw, height: 100vh, longitude: -122.4, latitude: 37.78, zoom: 8, controller: true, layers: [scatterplotLayer] });与 React 方式的差异container指定将自动创建的canvas挂载到哪个 DOM 容器默认document.bodywidth/height既可以是像素数值也可以是 CSS 字符串100vw/100vh/100%Deck实例会全权接管画布的创建、渲染循环、事件监听与 resize 处理。同样官方推荐使用initialViewState属性来声明初始视角。参考 docs/api-reference/core/deck.md 的示例import {Deck} from deck.gl/core; import {ScatterplotLayer} from deck.gl/layers; const deck new Deck({ initialViewState: { longitude: -122.45, latitude: 37.78, zoom: 12 }, controller: true, layers: [new ScatterplotLayer({data})] });5.3 方式三脚本化CDN接入主模块的构建脚本build-bundle见 modules/main/package.json还会产出dist.min.js独立浏览器包。脚本化场景下可直接通过script标签加载 deck.gl 的独立 bundle然后使用全局变量。仓库中 examples/get-started/scripting 目录下提供了对应的 HTML 示例适合无构建工具的快速原型演示。注意独立 bundle 默认不打包h3-js。若要使用H3HexagonLayer等 H3 相关图层需要在 deck.gl 脚本标签之前引入 h3-js 脚本。这一限制在 modules/main/bundle.ts 中有明确说明并在运行时通过_checkH3Lib抛出带安装指引的报错。六、完整的纯 JS 实战多图层叠加仓库中的官方示例 examples/get-started/pure-js/basic/app.js 展示了如何用纯 JS 方式同时叠加三个图层世界地图 GeoJSON 机场散点 航线弧线比 README 中的单图层示例更进一步import {Deck} from deck.gl/core; import {GeoJsonLayer, ArcLayer} from deck.gl/layers; const INITIAL_VIEW_STATE { latitude: 51.47, longitude: 0.45, zoom: 4, bearing: 0, pitch: 30 }; new Deck({ initialViewState: INITIAL_VIEW_STATE, controller: true, layers: [ new GeoJsonLayer({ id: base-map, data: COUNTRIES, // GeoJSON URL stroked: true, filled: true, lineWidthMinPixels: 2, opacity: 0.4, getLineColor: [60, 60, 60], getFillColor: [200, 200, 200] }), 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}) }), new ArcLayer({ id: arcs, data: AIR_PORTS, dataTransform: d d.features.filter(f f.properties.scalerank 4), getSourcePosition: f [-0.4531566, 51.4709959], // 伦敦 getTargetPosition: f f.geometry.coordinates, getSourceColor: [0, 128, 200], getTargetColor: [200, 0, 80], getWidth: 1 }) ] });这个示例延伸展示了几个重要能力多图层叠加layers数组内按声明顺序依次渲染GeoJSON 底图、机场点、航线弧线交互拾取pickable: true配合onClick回调可读取被点击的对象信息info.object数据变换dataTransform在渲染前对原始数据做过滤只保留scalerank 4的机场样式细节pointRadiusScale/pointRadiusMinPixels、lineWidthMinPixels等像素级约束保证不同缩放级别下渲染稳定。该示例的运行方式见其所在目录的 README克隆仓库后在examples/get-started/pure-js/basic目录执行npm install npm start即可本地预览。七、深入 Deck 类常用配置速查无论哪种接入方式最终都收敛到Deck类的配置React 的DeckGL组件本质是对Deck的封装。以下是 docs/api-reference/core/deck.md 中与 README 示例直接相关的核心配置配置项默认值说明initialViewState无初始视角状态longitude/latitude/zoom/pitch/bearingcontrollerfalse是否启用视角交互控制器拖拽/缩放/旋转width/height100%画布尺寸数值像素或 CSS 字符串canvas自动创建指定渲染目标 canvas元素或 idparentdocument.body自动创建 canvas 时的挂载容器layers[]要渲染的图层数组useDevicePixelstrue是否以物理像素渲染设为false或1的数值可提升性能debugfalseGPU 调试模式需额外引入luma.gl/debug会显著降低性能iddeckgl-overlay自动创建 canvas 的 DOM id便于 CSS 定制此外Deck还支持通过setProps()在运行时热更新视角、图层等属性实现视角过渡动画配合FlyToInterpolator/LinearInterpolator见 docs/api-reference/core/fly-to-interpolator.md等进阶玩法。八、从源码看主模块的聚合结构最后从工程实现角度理解主模块为什么一个包管所有聚合导出modules/main/src/index.ts 是主模块的类型与运行时导出总入口除了图层家族还从deck.gl/core导出了Deck、Layer、CompositeLayer、各类View/Viewport/Controller、AttributeManager、shader 模块project、picking、color等、灯光与特效LightingEffect、PostProcessEffect、各类Light、插值器TransitionInterpolator、LinearInterpolator、FlyToInterpolator并从deck.gl/widgets导出了ZoomWidget、CompassWidget、FullscreenWidget、PopupWidget、ScreenshotWidget等全套 UI 组件。也就是说仅 import 一个deck.gl即可获得从渲染内核到 UI 控件的全部 API。类型支持同一文件末尾还导出了MapViewState、LayerProps、Accessor、PickingInfo、ScatterplotLayerProps等大量 TypeScript 类型配合 modules/main/package.json 中types: dist/index.d.ts的声明开箱即得完整类型提示。独立 bundlemodules/main/bundle.ts 是ocular-bundle打包的入口将 core、layers、aggregation-layers、geo-layers、widgets 等全部 re-export 成一个独立脚本文件产出dist.min.js供无构建工具的场景使用同时包含 H3 库的运行时校验逻辑。样式文件widgets 组件所需的样式由构建脚本复制为./dist/stylesheet.css见 modules/main/package.json 的build脚本使用时可通过deck.gl/stylesheet.css子路径引入。九、总结围绕 modules/main/README.md 这篇官方主模块说明可以得出如下实践要点安装npm install deck.gl或yarn add deck.gl一条命令获得全家桶追求极致包体积时可按deck.gl/core 对应功能包的方式按需安装。图层是核心抽象输入 JSON 数组 访问器getPosition/getRadius/getColor等即可完成渲染推荐使用getFillColor/getLineColor而非已废弃的getColor。接入方式灵活React 项目用DeckGL组件无框架项目用Deck类快速原型可用 CDN 脚本方式三者底层统一。主模块 聚合枢纽从 modules/main/src/index.ts 的导出清单可以确认deck.gl单包聚合了 core、layers、geo-layers、aggregation-layers、mesh-layers、react、widgets 等全部能力配合 tree-shaking 既可一次引入也可按需剔除。对于想进一步深入学习的读者建议继续阅读仓库中的 docs/get-started/getting-started.md安装与示例运行、docs/api-reference/core/deck.mdDeck 全量配置以及 docs/api-reference/layers/scatterplot-layer.md散点图图层完整 API。【免费下载链接】deck.glWebGL2 powered visualization framework项目地址: https://gitcode.com/GitHub_Trending/de/deck.gl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表