H3是什么
H3是一种层级化六边形地理空间索引系统。
它将地球表面划分成大量不同大小的网格,并使用唯一的索引编号标识每一个网格。
简单来说:
H3就是把地球划分成一层一层的六边形网格,并给每个网格一个唯一编号。
例如:
经纬度
↓
H3
↓
六边形网格
↓
H3 Index
H3特别适合:
- 空间聚合
- 热力图
- 附近搜索
- 区域统计
- 位置分析
- 轨迹分析
- 物流分析
- 城市分析
- LBS
- 地理数据可视化
H3的核心思想
传统GIS通常直接处理:
Point
LineString
Polygon
而H3会进一步将空间划分成规则网格:
Point
↓
H3 Cell
↓
空间网格
例如:
⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡
每一个六边形都是一个H3 Cell。
一个位置可以通过H3编码映射到其中一个Cell。
H3为什么使用六边形
常见的空间网格有:
正方形
三角形
六边形
H3主要使用六边形作为空间单元。
六边形具有一个非常重要的特点:
一个中心六边形通常有6个直接相邻的六边形。
例如:
⬡
⬡ ⬡
⬢
⬡ ⬡
⬡
这使六边形非常适合进行:
- 邻居搜索
- 距离分析
- 空间聚合
- 网格扩散
H3与正方形网格
传统地图网格经常使用正方形:
┌────┬────┬────┐
│ │ │ │
├────┼────┼────┤
│ │ │ │
├────┼────┼────┤
│ │ │ │
└────┴────┴────┘
H3则主要使用六边形:
⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡
六边形在邻居关系方面更加自然。
例如中心网格:
1
2 3
C
4 5
6
中心Cell可以直接连接6个邻居。
H3的层级结构
H3最大的特点之一是:
具有层级化的空间分辨率。
H3使用不同的Resolution表示不同的空间精度。
可以理解为:
Resolution 0
↓
Resolution 1
↓
Resolution 2
↓
...
↓
Resolution 15
随着Resolution增加:
网格越来越小
空间精度越来越高
例如:
低分辨率
↓
大区域
高分辨率
↓
小区域
H3 Resolution
H3通常使用:
0 ~ 15
共16个分辨率级别。
可以简单理解为:
Resolution 0
↓
全球级别的大网格
Resolution 5
↓
城市或区域级别
Resolution 9
↓
街区级别
Resolution 15
↓
非常精细的小区域
实际Cell大小会受到H3网格结构和地理位置影响,因此不能简单认为每一级都是固定的距离。
H3的层级关系
H3的父子关系可以表示为:
父Cell
↓
多个子Cell
例如:
Parent
⬡
/ / \ \
⬡ ⬡ ⬡ ⬡
随着Resolution增加,一个较大的Cell会被进一步划分成更小的Cell。
因此:
Resolution 5
↓
Resolution 6
↓
Resolution 7
↓
Resolution 8
可以形成空间层级。
H3与Hexagon
H3名称中的核心思想就是:
H
↓
Hierarchical
以及:
3
↓
H3系统名称
它本质上是:
Hierarchical
+
Hexagonal
+
Geospatial
Index
即:
层级化六边形地理空间索引。
H3 Cell
H3中的基本空间单元称为:
Cell
每一个Cell都有唯一的:
H3 Index
例如:
8928308280fffff
这个字符串就是一个H3索引。
可以理解为:
H3 Index
↓
唯一标识
↓
一个地理空间Cell
H3 Index
H3 Index通常以十六进制形式表示。
例如:
8928308280fffff
它不是普通的随机ID,而是包含H3索引结构信息的编码。
其中可以表达:
- H3版本相关信息
- Cell类型
- Resolution
- Base Cell
- Hierarchical位置
因此H3 Index不仅用于唯一标识,还能够表达空间层级信息。
H3与经纬度
H3最常见的使用方式是:
Longitude
Latitude
↓
H3
↓
H3 Index
例如:
116.397
39.908
指定一个Resolution:
Resolution = 9
就可以得到一个对应的H3 Cell。
完整流程:
经度
+
纬度
+
Resolution
↓
H3 Index
H3与Point
可以把H3理解成Point的空间网格映射。
例如:
Point
●
经过H3:
⬡
⬡ ⬡
●
⬡ ⬡
⬡
Point所在的六边形就是:
H3 Cell
因此:
Point
↓
H3 Cell
可以用于将大量Point转换为空间网格。
H3与空间聚合
这是H3最重要的应用之一。
假设有大量用户:
● ● ●
●
● ● ●
●
将这些Point映射到H3:
Point
↓
H3 Cell
↓
GROUP BY H3
结果:
H3 Index 用户数量
--------------- --------
8928308280fffff 120
8928308280bffff 85
89283082807ffff 230
这样就可以统计:
每个空间网格中有多少用户。
H3与热力图
H3非常适合制作空间热力图。
例如:
⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡
每个Cell保存一个统计值:
H3 Cell
+
count
例如:
⬡ 20
⬡ 80
⬡ 150
⬡ 35
然后根据数值进行颜色映射:
低
↓
中
↓
高
最终得到:
城市人口热力图
订单热力图
车辆热力图
用户活跃度热力图
H3与空间统计
H3可以把连续的地理空间转换成离散网格。
例如:
原始数据
Point
Point
Point
Point
Point
...
转换:
H3 Cell
↓
统计
例如统计订单:
H3 Cell | Order Count
--------|------------
A | 120
B | 85
C | 240
D | 65
因此H3特别适合:
将复杂的空间数据转换成规则网格数据。
H3与附近搜索
H3可以通过邻居关系寻找附近网格。
例如中心Cell:
⬡
⬡ ⬡
⬢
⬡ ⬡
⬡
中心Cell周围有邻居:
Ring 0
↓
当前Cell
Ring 1
↓
第一圈邻居
Ring 2
↓
第二圈邻居
因此可以实现:
当前位置
↓
H3 Cell
↓
附近H3 Cells
↓
候选对象
然后再进行精确距离计算。
H3与K Ring
H3提供了非常重要的邻域概念:
k-ring
例如:
k = 0
表示:
当前Cell
k = 1
表示:
当前Cell
+
周围第一圈Cell
k = 2
表示:
当前Cell
+
第一圈
+
第二圈
可以理解为:
⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡ ⬡
⬡ ⬡ C ⬡ ⬡
⬡ ⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡
这对于附近搜索非常有用。
H3与距离
H3可以帮助快速确定:
附近区域
但H3 Index本身不是精确距离。
例如:
用户
↓
H3
↓
附近Cells
↓
候选POI
↓
Distance
↓
精确距离
因此实际系统中经常组合:
H3
+
Distance
H3负责:
空间粗筛。
Distance负责:
精确计算。
H3与GeoHash
H3和GeoHash都可以将地理位置转换成空间索引。
GeoHash:
经纬度
↓
矩形网格
↓
字符串
H3:
经纬度
↓
六边形网格
↓
H3 Index
两者可以简单对比:
| 特性 | GeoHash | H3 |
|---|---|---|
| 网格 | 矩形 | 六边形 |
| 层级 | 有 | 有 |
| 空间编码 | 字符串 | H3 Index |
| 邻居关系 | 需要处理边界 | 原生支持 |
| 空间聚合 | 支持 | 非常适合 |
| 热力图 | 支持 | 非常适合 |
| 附近搜索 | 支持 | 支持 |
| GIS分析 | 辅助 | 辅助 |
可以简单记住:
GeoHash更像字符串化的空间网格编码,H3更强调层级六边形空间索引。
H3与QuadTree
QuadTree使用四叉树划分空间:
空间
↓
┌─────┬─────┐
│ │ │
├─────┼─────┤
│ │ │
└─────┴─────┘
H3则使用六边形:
⬡ ⬡
⬡ ⬡ ⬡
⬡ ⬡
两者都是空间索引思路,但结构不同。
QuadTree
↓
四叉树
H3
↓
层级六边形网格
H3与Geometry
H3并不是传统Geometry。
例如:
Point
LineString
Polygon
属于:
Geometry
而:
H3 Index
属于:
Spatial Index
因此:
Geometry
↓
真实空间对象
H3
↓
空间网格索引
H3可以根据Geometry生成对应的空间网格。
H3与Polygon
例如有一个行政区:
Polygon
↓
H3
↓
多个H3 Cells
结果可能是:
⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡
这些Cell共同覆盖这个Polygon。
这类操作通常称为:
Polygon
↓
H3 Polygon Covering
即使用H3网格覆盖一个多边形区域。
H3 Polygon Fill
H3可以将一个Polygon转换成一组H3 Cell。
例如:
行政区Polygon
↓
H3 Resolution 8
↓
H3 Cell集合
可以得到:
[
"88...",
"88...",
"88...",
"88..."
]
然后可以对这些Cell进行:
- 统计
- 查询
- 聚合
- 可视化
- 空间分析
H3与空间覆盖
例如一个城市:
Polygon
┌────────────────────┐
│ │
│ 城市区域 │
│ │
└────────────────────┘
转换成H3:
⬡ ⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡ ⬡
⬡ ⬡ ⬡ ⬡
这样就可以把城市变成规则的空间网格。
H3与轨迹分析
例如车辆轨迹:
●
●
●
●
●
将每个GPS点转换成H3:
GPS
↓
H3
↓
H3序列
例如:
H3-A
H3-A
H3-B
H3-B
H3-C
H3-D
然后可以分析:
- 车辆经过哪些区域
- 哪些区域最繁忙
- 车辆停留区域
- 交通热点
- 路线密度
H3与物流
物流系统可以将:
订单
车辆
仓库
配送地址
全部映射到H3。
例如:
订单
↓
H3 Cell
车辆
↓
H3 Cell
然后进行:
订单区域
+
车辆区域
匹配。
例如:
订单
↓
H3 A
车辆
↓
H3 A
↓
候选配送车辆
再进一步使用距离计算选择最优车辆。
H3与城市分析
城市数据非常适合H3。
例如:
人口
订单
车辆
餐厅
商店
出租车
共享单车
都可以映射到H3。
然后形成:
H3 Cell
↓
人口
订单
车辆
商店
最终可以分析:
人口密度
商业密度
交通流量
订单密度
用户活跃度
H3与数据库
H3 Index通常可以作为数据库字段保存。
例如:
id | longitude | latitude | h3
---|-----------|----------|----------------
1 | 116.397 | 39.908 | 8928308280fffff
2 | 116.405 | 39.915 | 8928308280bffff
3 | 116.412 | 39.920 | 89283082807ffff
可以建立:
h3
索引。
然后进行:
GROUP BY h3
等空间聚合。
H3与PostGIS
H3可以和PostGIS结合使用。
例如:
PostGIS Geometry
↓
H3
↓
空间网格
或者:
H3 Cell
↓
H3 Boundary
↓
PostGIS Geometry
这样可以同时使用:
H3
+
PostGIS
H3负责:
网格索引
空间聚合
邻域查询
PostGIS负责:
Geometry
空间关系
距离
面积
相交
缓冲区
H3与GeoJSON
H3 Index可以转换成对应的六边形边界。
例如:
H3 Index
↓
Boundary
↓
Polygon
↓
GeoJSON
最终可以得到:
{
"type": "Polygon",
"coordinates": [
[
[116.39, 39.90],
[116.40, 39.90],
[116.41, 39.91]
]
]
}
因此H3非常适合与Web地图结合。
典型流程:
H3
↓
Hexagon Boundary
↓
GeoJSON
↓
MapLibre / Mapbox / Leaflet
↓
地图显示
H3与WebGIS
在WebGIS中,可以将H3作为地图空间聚合基础。
例如:
大量Point
↓
H3
↓
Hexagon
↓
GeoJSON
↓
WebGIS
这样可以避免直接绘制大量Point。
例如有:
1,000,000个GPS点
可以先:
1,000,000 Points
↓
H3 Aggregation
↓
10,000 Cells
然后只显示10,000个六边形。
这可以显著降低前端数据量和渲染压力。
H3与大数据
H3特别适合大规模地理数据。
例如:
10亿条GPS记录
可以转换:
GPS
↓
H3
↓
分区
↓
统计
例如:
H3 Cell | GPS Count
---------|----------
A | 120000
B | 98000
C | 350000
这样可以将复杂的点数据转换为规则网格统计数据。
H3的优点
H3主要具有以下优势。
1. 六边形空间结构
六边形拥有良好的邻居关系:
一个Cell
+
6个直接邻居
适合空间分析。
2. 层级结构
支持不同Resolution:
粗粒度
↓
细粒度
适合多尺度空间分析。
3. 唯一索引
每个Cell都有唯一H3 Index:
H3 Index
方便数据库存储和数据关联。
4. 适合空间聚合
大量Point可以快速聚合:
Point
↓
H3
↓
COUNT / SUM / AVG
5. 适合可视化
H3 Cell可以转换为Polygon:
H3
↓
Boundary
↓
GeoJSON
↓
地图
非常适合热力图和空间统计地图。
H3的缺点
H3也有一些局限。
1. 并不是精确Geometry
H3主要是:
空间索引
而不是:
真实Geometry
因此不能替代Point、LineString、Polygon。
2. 六边形并非全球完全规则
由于H3覆盖整个地球,需要处理球面上的特殊区域,因此不同位置的Cell并不是数学意义上完全相同的平面正六边形。
3. 边界存在误差
将Polygon转换成H3网格时:
Polygon
↓
H3 Cells
可能存在:
部分覆盖
边界误差
因此精确空间分析仍然需要Geometry。
4. Resolution选择很重要
Resolution太低:
网格太大
↓
空间信息不足
Resolution太高:
网格数量巨大
↓
计算和存储成本增加
因此需要根据业务场景选择合适的Resolution。
H3 Resolution选择
可以按照数据规模和业务需求进行选择。
例如:
全球分析
↓
低Resolution
城市分析
↓
中等Resolution
街道分析
↓
较高Resolution
精细位置分析
↓
高Resolution
核心原则:
不要为了追求精度盲目使用最高Resolution。
因为Resolution越高,Cell数量会快速增加。
H3完整工作流程
一个典型的H3空间分析流程:
经纬度数据
↓
H3 Index
↓
空间网格
↓
数据库聚合
↓
统计分析
↓
GeoJSON
↓
WebGIS
例如订单热力图:
订单坐标
↓
H3 Resolution 8
↓
H3 Cell
↓
GROUP BY H3
↓
订单数量
↓
H3 Boundary
↓
GeoJSON
↓
地图热力图
H3与GeoHash的核心区别
可以简单记住:
GeoHash
↓
矩形网格
↓
字符串编码
H3
↓
六边形网格
↓
层级空间索引
如果主要需求是:
简单经纬度编码
GeoHash比较直观。
如果需求是:
空间聚合
六边形网格
邻域分析
热力图
大规模空间数据
H3通常更加合适。
H3知识结构
可以将H3知识体系理解为:
H3
├── H3 Index
│
├── Resolution
│
├── Cell
│
├── Parent / Child
│
├── Neighbor
│
├── K Ring
│
├── Boundary
│
├── Polygon Covering
│
└── Spatial Aggregation
其中最重要的是:
H3 Index
↓
Cell
↓
Resolution
↓
Neighbor
↓
Spatial Aggregation
H3与GIS知识体系
H3可以放在GIS空间数据体系中:
Coordinates
↓
Geometry
↓
Feature
↓
Spatial Index
↓
H3
↓
Spatial Aggregation
↓
Visualization
例如:
GPS Point
↓
Point Geometry
↓
H3 Cell
↓
统计
↓
Hexagon Polygon
↓
GeoJSON
↓
WebGIS
总结
H3是一种层级化六边形地理空间索引系统。
它的核心思想是:
地球
↓
六边形网格
↓
不同Resolution
↓
H3 Index
H3最适合:
空间索引
空间聚合
附近搜索
热力图
城市分析
轨迹分析
物流分析
大规模位置数据分析
可以记住:
H3不是一种Geometry,而是一种将地理空间划分成层级六边形网格,并为每个网格提供唯一索引的空间索引系统。
最典型的应用流程是:
经纬度
↓
H3 Index
↓
六边形Cell
↓
空间聚合
↓
统计分析
↓
Boundary
↓
GeoJSON
↓
WebGIS可视化
相关工具
使用 IYATools 在线工具快速处理 GIS 数据