GIS

H3是什么

了解H3六边形空间索引系统的基本概念、层级结构、分辨率、编码方式以及H3在GIS空间分析、附近搜索、热力图和地理数据聚合中的应用。

阅读约 87 分钟

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

两者可以简单对比:

特性GeoHashH3
网格矩形六边形
层级
空间编码字符串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 数据