ARTICLE DETAIL

资讯详情

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

deck.gl 之 H3TileLayer:用 H3 空间索引可视化海量瓦片数据的实战指南

deck.gl 之 H3TileLayer:用 H3 空间索引可视化海量瓦片数据的实战指南 deck.gl 之 H3TileLayer用 H3 空间索引可视化海量瓦片数据的实战指南【免费下载链接】deck.glWebGL2 powered visualization framework项目地址: https://gitcode.com/GitHub_Trending/de/deck.glH3TileLayer是 deck.gl CARTO 模块中用于可视化以 H3 空间索引描述的瓦片数据的图层。它把 H3 六边形网格系统与 deck.gl 的瓦片加载机制结合到一起数据按 H3 六边形单元切分为瓦片随视口移动按需加载既能处理海量数据又能保持流畅的交互体验。读完本文你将掌握 H3TileLayer 的完整用法——从数据源接入、安装配置到继承属性与底层瓦片切分原理并能直接在项目中落地一个可运行示例。概述H3TileLayer 是什么H3TileLayer位于deck.gl/carto模块源码见 modules/carto/src/layers/h3-tile-layer.ts是一个复合图层CompositeLayer。它的设计目标很明确把按 H3 空间索引组织的瓦片数据用最自然的方式渲染出来。从源码结构看它由两层能力叠加而成瓦片化能力继承自SpatialIndexTileLayer见 modules/carto/src/layers/spatial-index-tile-layer.ts后者继承自deck.gl/geo-layers的TileLayer负责按视口范围动态请求、缓存、卸载瓦片H3 渲染能力通过自定义的H3Tileset2D见 modules/carto/src/layers/h3-tileset-2d.ts把传统 Web Mercator 的{x, y, z}瓦片坐标换算成 H3 单元索引再用H3HexagonLayer完成实际绘制。因此H3TileLayer直接继承了 H3HexagonLayer 与 TileLayer 的全部属性并有少量例外与新增详见下文属性说明。快速上手第一个 H3TileLayer官方文档给出了一个可以直接运行的 React 示例从 CARTO 的 BigQuery 演示表中查询芝加哥犯罪数据按 H3 空间索引切瓦片渲染import {DeckGL} from deck.gl/react; import {H3TileLayer} from deck.gl/carto; import {h3QuerySource} from carto/api-client; function App({viewState}) { const data h3QuerySource({ accessToken: XXX, connectionName: carto_dw, sqlQuery: select * from carto-demo-data.demo_tables.chicago_crime_sample, }); const layer new H3TileLayer({ data, getFillColor: d d.properties.color }) return DeckGL viewState{viewState} layers{[layer]} /; }要点解读data直接传 Promise 即可。h3QuerySource(...)返回的是一个 Promise详见后文数据源而 deck.gl 的 Layerdata属性原生支持 Promise见 Layer 文档 中data一节所以无需await图层会在数据就绪后自动渲染。getFillColor的入参是要素对象。瓦片内每个要素带有properties字段来自 CARTO 服务端聚合结果示例中d d.properties.color直接读取了服务端下发的颜色字段。安装与引入方式官方文档提供了两种安装路径按需选择即可。方式一npm 安装npm install deck.gl # 或按需拆分安装 npm install deck.gl/core deck.gl/layers deck.gl/carto注意H3TileLayer的完整链路依赖deck.gl/geo-layersTileLayer、H3HexagonLayer所在模块与deck.gl/layersdeck.gl聚合包会一并带上若采用拆分安装需要确保上述依赖可用deck.gl/carto自身的依赖声明已覆盖。引入与构造import {H3TileLayer} from deck.gl/carto; new H3TileLayer({});方式二预打包脚本CDN适用于无需构建工具的场景script srchttps://unpkg.com/deck.gl^9.0.0/dist.min.js/script script srchttps://unpkg.com/deck.gl/carto^9.0.0/dist.min.js/script !-- 或 -- script srchttps://unpkg.com/deck.gl/core^9.0.0/dist.min.js/script script srchttps://unpkg.com/deck.gl/layers^9.0.0/dist.min.js/script script srchttps://unpkg.com/deck.gl/geo-layers^9.0.0/dist.min.js/script script srchttps://unpkg.com/deck.gl/carto^9.0.0/dist.min.js/script使用全局命名空间构造new deck.carto.H3TileLayer({});与 H3HexagonLayer 文档的提示一致如果直接使用H3HexagonLayer还需要在deck.gl之前引入h3-js而H3TileLayer通过 CARTO 模块内部封装好的瓦片链路处理 H3 索引换算使用 CDN 方式时同样建议保证h3-js全局可用。数据源如何获得TilejsonResultH3TileLayer的data属性必填要求一个合法的TilejsonResult对象。官方推荐使用以下三种 CARTO Data Source 函数之一来获取详见 Data Sources 文档数据源函数用途关键参数h3TableSource从数据仓库表读取 H3 数据tableName、aggregationExp、aggregationResLevel?、columns?、spatialDataColumn?h3QuerySource从SQL 查询读取 H3 数据sqlQuery、aggregationExp、aggregationResLevel?、spatialDataColumn?、queryParametersh3TilesetSource读取已预聚合的 H3 瓦片集tableName这三个函数都来自carto/api-client是浏览器fetch的封装你不需要拼 URL只需给出描述数据在哪的选项对象。Promise API 与内置缓存所有 Data Source 函数返回 Promise可直接传给data属性import {H3TileLayer} from deck.gl/carto; import {h3TilesetSource} from carto/api-client; new H3TileLayer({ data: h3TilesetSource({ accessToken: XXX, connectionName: carto_dw, tableName: carto-demo-data.demo_tables.h3_data }), getFillColor: d d.properties.color });两个值得注意的特性完全类型化所有数据源函数都带有 TypeScript 类型定义帮助调用方提供正确参数、正确处理返回值内置缓存数据源函数有内部缓存当参数未变化时不会重复请求服务端。因此可以直接在 React 的render()中调用而无需额外 memoization。全局选项所有数据源函数都接受以下公共选项type SourceOptions { accessToken: string; connectionName: string; apiBaseUrl?: string; clientId?: string; headers?: Recordstring, string; maxLengthURL?: number; };其中accessToken与connectionName为必填apiBaseUrl用于指向私有部署的 CARTO 实例headers可附加自定义请求头。h3 系列数据源的专属选项type H3TableSourceOptions { aggregationExp: string; // 聚合表达式如 SUM(value) AS value aggregationResLevel?: number; // 聚合分辨率级别 columns?: string[]; // 需要返回的列 spatialDataColumn?: string; // H3 索引所在列名 tableName: string; }; type H3QuerySourceOptions { aggregationExp: string; aggregationResLevel?: number; spatialDataColumn?: string; sqlQuery: string; // SQL 查询 queryParameters: QueryParameters; // 参数化查询参数 };QueryParameters的格式随底层数据仓库 provider 而异例如 PostgreSQL / Redshift / BigQuery 位置参数使用$1数组BigQuery 命名参数使用username对象Snowflake 使用?或:1Databricks ODBC 使用?详见 Data Sources 文档。属性说明PropertiesH3TileLayer继承自 H3HexagonLayer 与 TileLayer 的全部属性其中最重要的几个继承属性如下。继承自 H3HexagonLayer 的核心属性highPrecisionboolean | auto可选默认autoH3 网格中的每个六边形形状存在细微差异。为了高效绘制大量六边形图层在非高精度模式下采用实例化instanced绘制——假定当前视口内所有六边形与视口中心处的六边形形状一致这种差异通常小到肉眼不可见。以下情形会触发高精度模式以性能换取精度数据中包含五边形pentagon全球每个分辨率仅有 12 个但其与相邻单元形状差异显著数据处于粗分辨率res 0 ~ res 5在 Mercator 投影下形状差异更大数据中混有不同分辨率的六边形。取值含义auto由图层自动判断仅在遇到上述边界情形时启用高精度true始终使用高精度渲染false始终使用实例化渲染。从 h3-hexagon-layer.ts 源码 可见_shouldUseHighPrecision()在auto模式下会检查hasPentagon、hasMultipleRes以及resolution 5等条件且渲染层面对应两种子图层高精度时由SolidPolygonLayer渲染hexagon-cell-hifi非高精度时由ColumnLayer渲染hexagon-cell。coveragenumber可选默认1六边形半径乘数取值 0 ~ 1。coverage 1时六边形按实际大小绘制调小数值可以按比例缩小六边形在相邻单元之间制造间距效果。getHexagonAccessorstring可选从每个数据对象中取回 H3 索引的方法。注意H3HexagonLayer要求单个图层内所有六边形使用相同分辨率。对H3TileLayer而言这一 accessor 由内部瓦片渲染逻辑接管见下文渲染原理用户一般无需自行提供。继承自 TileLayer 的关键属性H3TileLayer的瓦片行为来自TileLayer常用属性包括完整列表见 TileLayer 文档minZoom/maxZoom视口缩放级别限制。需要注意在H3TileLayer语境下这两个属性最终会被换算成H3 分辨率级别见 h3-tile-layer.ts 的 renderLayers而不是 Web Mercator 的 zoom 层级tileSize默认512瓦片像素尺寸见 modules/carto/src/constants.ts 中的DEFAULT_TILE_SIZE 512getTileData自定义瓦片数据加载函数测试用例中即用它来返回每个 H3 瓦片下的要素autoHighlight/pickable/highlightColor交互高亮相关属性SpatialIndexTileLayer对其有专门实现见下文。新增属性dataTilejsonResult必填这是H3TileLayer自己定义的唯一必填属性类型为null | TilejsonResult | PromiseTilejsonResult即一个合法的TilejsonResult对象或其 Promise推荐通过上文三种 H3 Data Source 获取。从类型定义看h3-tile-layer.tsH3TileLayer的属性集是OmitH3HexagonLayerProps, data OmitSpatialIndexTileLayerProps, data再加上上述data类型——即除data外两边的属性全部透传。渲染原理从 TileJSON 到 H3 六边形理解H3TileLayer的底层机制有助于在实际项目中预判性能与行为。结合 h3-tile-layer.ts 与 h3-tileset-2d.ts 源码整个链路如下。1. 请求头注入与加载选项getLoadOptions()会从TilejsonResult中取出accessToken为瓦片请求注入Authorization: Bearer token请求头并标记cartoSpatialTile.scheme h3通知 CARTO 瓦片加载器按 H3 方案解析源码位置。请求/解析由CartoSpatialTileLoader完成它在 spatial-index-tile-layer.ts 中被全局注册。2. 分辨率换算与裁剪renderLayers()中图层的minZoom/maxZoom属性Mercator 缩放级别会被getHexagonResolution()换算为 H3 分辨率并与 TileJSON 提供的minresolution/maxresolution取交集裁剪源码位置。getHexagonResolution()h3-tileset-2d.ts的核心思想是根据视口 zoom、纬度与tileSize计算一个 H3 分辨率使六边形在屏幕上的尺寸与预期瓦片尺寸相当const zoomOffset Math.log2(tileSize / 512); // tileSize 相对 512 内部尺寸的偏移 const hexagonScaleFactor (2 / 3) * (viewport.zoom - zoomOffset); // 缩放比例因子 const latitudeScaleFactor Math.log(1 / Math.cos((Math.PI * viewport.latitude) / 180)); // 纬度补偿 return Math.max(0, Math.floor(hexagonScaleFactor latitudeScaleFactor - BIAS)); // BIAS 2用于偏置3. 视口内的瓦片枚举H3Tileset2D.getTileIndices()根据当前视口包围盒计算应加载的 H3 索引集合源码位置若计算出的分辨率低于minZoom返回空数组不加载瓦片若高于maxZoom则退化为以视口中心六边形为中心的gridDisk(center, 1)环形集合否则用padBoundingBox()对包围盒做缓冲补偿六边形以中心填充、边缘单元可能跨出边界的问题同时处理了 h3-js 在经度跨度超过 180° 时的已知缺陷再调用polygonToCells()枚举包围盒内的所有 H3 单元。4. 每个瓦片的渲染子图层管线每个 H3 瓦片通过renderSubLayers渲染为一个H3HexagonLayer子图层源码位置export const renderSubLayers props { const {data} props; const {index} props.tile; if (!data || !data.length) return null; return new H3HexagonLayer(props, { getHexagon: d d.id, // 瓦片内要素的 id 字段即 H3 索引 centerHexagon: index, // 以瓦片本身作为形状基准 highPrecision: true // 瓦片场景下始终使用高精度渲染 }); };值得注意的是这里强制highPrecision: true瓦片数据中可能混入跨分辨率或边界单元高精度渲染SolidPolygonLayer能保证六边形形状精确。测试用例test/modules/carto/layers/h3-tile-layer.spec.ts中也印证了这一点——拾取测试中命中的子图层 id 是h3-tile-layer-h3-tile-8075fffffffffff-hexagon-cell-hifi-fill即高精度模式的hexagon-cell-hifi渲染路径。5. 跨瓦片的自动高亮SpatialIndexTileLayer对autoHighlight做了专门处理spatial-index-tile-layer.tshover 时记录要素 id_featureInTile()会沿 H3 父单元链向上追溯把要素 id 归属到正确的瓦片再通过highlightedObjectIndex传给对应子图层实现高亮。这样即使要素跨越了瓦片边界高亮也不会错位。测试用例中的H3TileLayer autoHighlight即验证了 hover 命中的要素info.object内容正确spec 第 48-92 行。小结H3TileLayer把两件复杂的事情——按需加载海量空间瓦片与H3 六边形网格渲染——封装成了一个开箱即用的复合图层。实际使用时的关键决策点数据接入用h3TableSource/h3QuerySource/h3TilesetSource生成TilejsonResult直接传给data样式定制通过继承自H3HexagonLayer的getFillColor、getElevation、coverage、extruded等属性控制视觉效果性能与行为minZoom/maxZoom控制加载范围内部换算为 H3 分辨率tileSize调整瓦片粒度autoHighlight配合pickable提供跨瓦片正确的交互高亮。相关参考完整属性清单见 H3HexagonLayer 文档 与 TileLayer 文档同类基于空间索引的瓦片图层还有 QuadbinTileLayerQuadbin 方案可对比选用。【免费下载链接】deck.glWebGL2 powered visualization framework项目地址: https://gitcode.com/GitHub_Trending/de/deck.gl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表