
GIS【免费下载链接】h3Hexagonal hierarchical geospatial indexing system项目地址https://gitcode.com/gh_mirrors/h3/h3点击查看免费下载导读H3 是一个十六进制层级地理空间索引系统Hexagonal Hierarchical Geospatial Indexing System它属于离散全球网格系统Discrete Global Grid System, DGGS的范畴。本文以仓库内 overview.md 为基础结合源码深入讲解 H3 的网格构建原理从球体外接二十面体、Dymaxion 定向、面心多面体球心投影到 aperture 7 的递归细分与五边形必然存在的原因。读完本文你将掌握 H3 网格为何是分层 六边形 必须含五边形的组合理解分辨率 0 到 15 各层级的面积、边长与单元数量规律并能正确使用kml构建目标可视化 H3 网格。一、离散全球网格系统与 H3 的设计定位H3 是一个离散全球网格系统其核心思想是把地球表面划分成一系列尽可能等大、具有层级关系的单元并用这些单元作为空间索引的基础。H3 在仓库中的项目描述为 Hexagonal hierarchical geospatial indexing system而 README.md 进一步说明它使用六边形网格并且可以近似地不断细分出更细的六边形网格从而同时具备六边形网格的优点与 S2 那样的层级细分能力。从技术谱系上看H3 的 DGGS 设计参考了 Sahr et al. (2003) 的研究成果。与常见的经纬度方格等经度-纬度网格相比H3 的关键优势在于每个单元cell的相邻单元数量固定且各向同性有利于距离与邻域计算通过层级索引粗粒度到细粒度的聚合与下钻无需重新建索引。H3 网格的理论定义与数据结构对应关系可以在源码中找到印证例如 constants.h 中定义了MAX_H3_RES 1516 个分辨率编号 0 到 15、NUM_ICOSA_FACES 20二十面体面数、NUM_BASE_CELLS 122基础单元数等核心常量。二、球体外接二十面体与球心投影H3 网格的几何起点H3 并不直接在地球表面铺网格而是先把六边形网格构建在一个球体外接的二十面体的平面面上然后再把网格单元投影回球面。这一先平面、后球面的两步策略是 H3 几何构建的核心。2.1 两步构建流程在球体外接的二十面体icosahedron的 20 个平面三角形面上建立平面六边形网格使用面心多面体球心投影inverse face-centered polyhedral gnomonic projection把网格单元投影到球面。源码 coordijk.h 的注释明确记载了两种坐标系统gnomonic面心多面体球心投影空间采用传统缩放x 轴与面 Class II 的 i 轴对齐hex2d局部面心坐标系按指定 H3 分辨率单位长度缩放x 轴与局部 i 轴对齐。投影的核心实现位于 faceijk.c_vec3ToHex2d约 410 行把球面上的点映射到某个二十面体面并计算该点相对面中心的角度与距离随后执行gnomonic scaling对 r 取tan(r)再按分辨率缩放_hex2dToVec3约 458 行执行逆操作通过inverse gnomonic scalingatan(r)把平面坐标还原回球面单位向量。在这两个函数中可以看到若干关键几何常量M_SQRT7/M_RSQRT7分辨率间缩放、RES0_U_GNOMONIC与INV_RES0_U_GNOMONIC从分辨率 0 的单位长度到球心投影单位长度的换算定义在 constants.h。2.2 坐标参考系与地球模型H3 使用的坐标参考系统CRS是球面坐标采用 WGS84/EPSG:4326 的等积半径authalic radius。实际应用中最常见的做法就是直接使用 WGS84 CRS 数据配合 H3 库使用。这一选择同样体现在源码中EARTH_RADIUS_KM 6371.007180918475见 constants.h正是 WGS84 authalic radius 的千米数值用于各类球面面积、距离计算。需要注意的是这里的球面模型是等面积球并非椭球体因此面积与边长数值与真实椭球地表存在细微差异。三、Dymaxion 定向让 12 个二十面体顶点全部落于海洋二十面体有 12 个顶点。H3 使用巴克敏斯特·富勒R. Buckminster Fuller提出的Dymaxion 定向将球面二十面体固定到地球上。该定向的关键性质是二十面体的 12 个顶点全部位于海洋中。这一性质对网格系统的可用性意义重大顶点处是 H3 网格中五边形单元的所在位置详见下文把五边形藏在海洋里可以避免在人口稠密的陆地地区频繁出现五边形畸变降低对空间分析与可视化应用的影响。文档同时指出在 H3 开发之时这是已知的唯一满足该性质的定向后来学术界发现了其他可行的定向Barnes et al., 2019。H3 至今仍保留 Dymaxion 定向因此其网格几何与坐标系与具体定向强绑定。从源码看二十面体 20 个面的中心点坐标被静态定义在 faceijk.c 的faceCenterPoint[NUM_ICOSA_FACES]数组中配合faceAxesAzRadsCII各面 Class II 的 i/j/k 轴方位角构成面级几何基础面之间的相邻关系则记录在faceNeighbors查找表中。四、从二十面体到全球网格递归细分与分辨率4.1 构建方式递归细分H3 网格通过在二十面体上递归地创建更高精度的六边形网格来构建直到达到所需分辨率。这意味着每一层分辨率都是上一层网格的细分结果天然形成层级索引结构。4.2 aperture 7 与 sqrt(7) 缩放分辨率间距采用aperture 7孔径 7即每个单元在下一级更细网格中对应约 7 个单元。其几何结果是随着分辨率增加单位长度按sqrt(7)缩放每个六边形的面积约为下一更粗分辨率六边形面积的1/7在二十面体平面上测量。在源码中这一孔径关系体现为多种 IJK 坐标变换函数见 coordijk.h_downAp7/_upAp7逆时针 aperture 7 细分/聚合、_downAp7r/_upAp7r顺时针以及M_ONESEVENTH常量1/7的缩放运算。这些函数是实现 cell→children / children→cell 层级操作的核心。4.3 Class II 与 Class III 的分辨率交替由于 aperture 7 的旋转特性H3 分辨率存在Class II偶数分辨率与Class III奇数分辨率两种网格取向二者轴线相差一个固定角度M_AP7_ROT_RADSasin(sqrt(3/28)) ≈ 0.3335 rad见 constants.h。源码在 faceijk.c 的投影函数中针对 Class III 进行了角度修正_vec3ToHex2d中if (isResolutionClassIII(res)) theta ... - M_AP7_ROT_RADS_hex2dToVec3中逆修正确保奇偶分辨率网格在球面上正确衔接。五、12 个五边形为什么纯六边形无法铺满球面一个重要的几何事实是不可能仅用六边形完全铺满球面或二十面体。这是欧拉多面体公式的必然结果——任何细分方案都会在二十面体顶点处产生五边形。因此H3 在每个分辨率都必须包含恰好 12 个五边形且每个五边形的中心正好位于二十面体的一个顶点上。这一约束在源码中得到严格保证constants.h 定义NUM_PENTAGONS 12、NUM_HEX_VERTS 6、NUM_PENT_VERTS 5基础单元邻接表baseCellNeighbors见 baseCells.c中对 12 个五边形基础单元标注了INVALID_BASE_CELL无某个方向的邻居H3 索引定义中五边形会跳过一个细分方向PENTAGON_SKIPPED_DIGIT K_AXES_DIGIT见 coordijk.h确保每个五边形只有 6 个直接子单元5 个六边形 1 个五边形而不是 7 个。六、分辨率 0 基础单元122 个单元构成的网格底座第一个 H3 分辨率分辨率 0由122 个单元组成110 个六边形 12 个以二十面体顶点为中心的五边形这些单元被称为base cells基础单元。这 122 个基础单元的选择经过了专门设计目标是尽量保留球面二十面体的对称性。它们被赋予 0 到 121 的编号编号规则基于单元中心点的纬度基础单元 0 的中心点纬度最高最北基础单元 121 的中心点纬度最低最南。编号与邻接关系、旋转参数全部固化在 baseCells.c 的查找表中如baseCellNeighbors定义了每个基础单元在 7 个方向上的邻居以及baseCellNeighbor60CCWRotations等旋转信息这些查找表构成 H3 索引编码/解码的基础。基础单元的方位与拓扑信息也可以由 generateBaseCellNeighbors.c 等生成工具复现。七、16 个分辨率0–15的统计规律H3 在分辨率 0 之上还提供15 个更细的网格分辨率总计 16 个分辨率0 到 15。最细的分辨率 15 的单元面积小于 1 平方米。各分辨率的详细统计表单元数量、平均面积、边长收录在 restable.md 中核心规律如下单元数量每层恰好 12 个五边形六边形数量随分辨率指数增长总单元数满足公式c(r) 2 120 × 7^r推导过程见 restable.md 附录基于每个六边形 7 个子单元、每个五边形 6 个子单元的递归关系。分辨率总单元数六边形数五边形数01221101218428301252,016,8422,016,830121033,897,029,88233,897,029,8701215569,707,381,193,162569,707,381,193,15012平均面积球面模型WGS84 authalic radius分辨率 0 的六边形平均面积约 4,357,449.4 km²分辨率 15 约 0.895 m²同级五边形面积约为六边形的 0.5046 倍高分辨率下趋近该比值。同一分辨率内六边形面积并不完全相等靠近二十面体顶点的单元更小最小/最大面积比约为 1.99。平均边长球面模型从分辨率 0 的约 1281.26 km 递减到分辨率 15 的约 0.000584 km约 58 cm。注意 0–6 级边长为精确计算更细级别为外推值。面积与边长均基于球面模型计算与椭球地表实际数值有细微差别且同分辨率内单元面积随位置相对二十面体顶点的远近而变化。八、实操用kml构建目标可视化 H3 网格overview.md 提到可以通过 make 目标kml生成 KML 文件来可视化 H3 网格。结合 README.md 的构建流程完整操作如下# 1. 从仓库根目录编译默认最新开发版如需用发布版可先 git checkout v$(VERSION) mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease .. make # 2. 生成 KML 可视化文件 make kml运行后KML 文件会输出到仓库的KML子目录。当前仓库根目录下已有一个示例输出 icosa.kml可以配合 Google Earth 等工具打开查看二十面体/网格结构。kml目标的定义与依赖可以在根目录 CMakeLists.txt 中查阅。提示kml目标依赖make已成功构建 H3 库若需要生成不同分辨率或不同区域的网格可参考 filters 文档与KML目录内现有产物结合使用。九、从几何原理到 H3 索引层级结构的工程落地H3 网格的分层结构最终编码为 64 位整数索引H3Index其位布局定义在 h3Index.h最高位bit 63保留位H3_HIGH_BIT_MASK4 位 modebit 59–62标识索引类型H3_CELL_MODE 1、H3_DIRECTEDEDGE_MODE 2、H3_EDGE_MODE 3、H3_VERTEX_MODE 4见 constants.h4 位 resolutionbit 52–55分辨率 0–157 位 base cellbit 45–51基础单元编号 0–121之后每 3 位为一个分辨率 digitbit 0–44 共 15 个 digit表示该单元在对应层级沿 i/j/k 轴方向的细分位置0–6 有效7 表示超出当前分辨率的填充位。因此H3 索引天然携带分辨率 基础单元 逐级细分方向三层信息从索引中可以直接解析出单元所在层级与位置——这正是层级索引在工程上的实现读取索引即可判断分辨率与基础单元遍历 digit 即可沿层级上溯或下钻。而前文所述12 个五边形的几何约束、base cell 编号规则、aperture 7 的细分方向均被固化在这套位布局与 baseCells.c 的查找表中。十、常见问题辨析Q1H3 网格能只用六边形吗不能。欧拉公式决定每个分辨率必须恰好有 12 个五边形五边形中心位于二十面体顶点。Q2分辨率 0 与更高分辨率是什么关系分辨率 0 是 122 个基础单元更高分辨率通过 aperture 7 递归细分每层六边形面积约为上一层 1/7边长按 sqrt(7) 递减。Q3为什么面积表要区分六边形与五边形五边形面积约为同级六边形的 0.5046 倍不能混为一谈且同分辨率内六边形面积随相对二十面体顶点的位置波动最大/最小约 1.99 倍。Q4H3 的面积/边长数值是基于椭球还是球面基于球面模型WGS84 authalic radius见 restable.md 的说明若需要椭球模型需另行换算。Q5KML 文件如何生成在构建完成后于build目录执行make kml产物位于仓库根目录KML/子目录。总结H3 是一个球体外接二十面体 面心多面体球心投影 aperture 7 递归细分构成的离散全球网格系统。其核心设计要点可以概括为四件事一是用 Dymaxion 定向把 12 个顶点也是五边形所在位置放到海洋中二是以 122 个基础单元110 六边形 12 五边形作为分辨率 0 底座三是通过 aperture 7 实现 0–15 共 16 个分辨率的分层四是把每层恰好 12 个五边形的几何约束固化进索引位布局与查找表。理解了这四件事就掌握了 H3 索引为什么能同时做到分层、可聚合、空间近邻一致。延伸阅读各分辨率统计表单元数量、面积、边长、推导公式restable.md源码级坐标系统定义gnomonic / hex2d / IJKcoordijk.h球心投影与面间坐标变换实现faceijk.c基础单元邻接与旋转查找表baseCells.c索引位布局与模式定义h3Index.h、constants.hKML 可视化示例输出icosa.kml赞分享GIS【免费下载链接】h3Hexagonal hierarchical geospatial indexing system项目地址https://gitcode.com/gh_mirrors/h3/h3点击查看免费下载相关推荐H3 六边形层级地理空间索引系统全景解析从二十面体剖分到 16 级分辨率网格H3 六边形层级地理空间索引系统全景解析从二十面体剖分到 16 级分辨率网格 H3 是一套基于六边形网格的离散全球网格系统Discrete Global GGISH3-JS基于六边形的地理网格系统H3 JS基于六边形的地理网格系统 项目简介 H3 JS 是一个基于 JavaScript 语言的开源项目它为 H3 核心库提供了一个纯 JavaScripGIS解密六边形网格H3地理空间索引系统的终极架构解析解密六边形网格H3地理空间索引系统的终极架构解析 在当今数据驱动的世界中 H3地理空间索引系统 作为Uber开源的六边形分层地理空间索引工具正在彻底改变我GIS上一篇如何快速调整vim-airline终端透明度终极配置指南下一篇终极指南autojump v22.4.0 发布让你的文件导航速度提升10倍创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考