H3 是什么#

H3 是一种地理编码机制,将全世界用六边形划分,随着分辨率的提高,六边形也越来越小,更加精细。

同类的还有 GeoHash, S2 等,我认为最大的优势在于:

  1. 任意纬度六边形面积基本一致,GeohHash 在赤道地区畸变特别明显,Grab 在 Gopher China 大会上也分享过这一点
  2. 相对轻量
    • H3 只是提供了基本的处理方法,所以各个语言的 SDK 实际上是在 C 实现的基础上包装一层
    • 相比之下 S2 是更加野心勃勃的,不光有转换的方法,还有大量的地理计算的算法实现,Go 的移植进度已经暂停了好久

分辨率#

Table

https://h3geo.org/docs/core-library/restable/

H3 ResolutionAverage Hexagon Area (km^2^)Average Hexagon Edge Length (km)Number of unique indexes
04,250,546.84770001,107.712591000122
1607,220.9782429418.676005500842
286,745.8540347158.2446558005,882
312,392.264862159.81085794041,162
41,770.323551722.606379400288,122
5252.90336458.5444082762,016,842
636.12905213.22948277214,117,882
75.16129321.22062975998,825,162
80.73732760.461354684691,776,122
90.10533250.1743756684,842,432,842
100.01504750.06590780733,897,029,882
110.00214960.024910561237,279,209,162
120.00030710.0094155261,660,954,464,122
130.00004390.00355989311,626,681,248,842
140.00000630.00134857581,386,768,741,882
150.00000090.000509713569,707,381,193,162

64-bit 都存储了些什么#

可视化工具#

H3 虽然好用,但是直接给一个字符形式的编码 8a62e9d08a1ffff 或者整数形式编码 623236850426970111 是完全「看」不出来这个地方在哪里的。

参考这个 Notebook 在 Jupyter 里看还算方便。

二次开发: PlaceKey#

Placekey 用 what@where 两个部分表示任意一个地点。 其中 where 是一定有的,what 需要调用 Placekey 的 API 才能获取的。

一个样例如下:

223-227@5vg-7gq-tvz

前缀 223 表示了一个地址,精准到门牌号。227 表示 POI 信息(这部分信息可能有也可能没有)

5vg-7gq-tvz 实际表示一个 H3 ID。 上边的 64-bit 图能看到在固定分辨率场景下,很多基础信息是一样的。 所以 Placekey 将这部分信息抽取出来,用字母组合的方式来表示。

这个编码的思路在 Placekey 的文档中有提供,开源的 SDK 工具也有对应的实现。 春节期间闲来无事在 Go 里移植出来了 pk

其他固定分辨率场景下用 H3 聚合海量数据,参考这个思路,也能显著降低存储的体积。

参考资料#