H3 简介
H3 是什么#
H3 是一种地理编码机制,将全世界用六边形划分,随着分辨率的提高,六边形也越来越小,更加精细。
同类的还有 GeoHash, S2 等,我认为最大的优势在于:
- 任意纬度六边形面积基本一致,GeohHash 在赤道地区畸变特别明显,Grab 在 Gopher China 大会上也分享过这一点
- 相对轻量
- H3 只是提供了基本的处理方法,所以各个语言的 SDK 实际上是在 C 实现的基础上包装一层
- 相比之下 S2 是更加野心勃勃的,不光有转换的方法,还有大量的地理计算的算法实现,Go 的移植进度已经暂停了好久
分辨率#
Table
https://h3geo.org/docs/core-library/restable/
H3 Resolution | Average Hexagon Area (km^2^) | Average Hexagon Edge Length (km) | Number of unique indexes |
---|---|---|---|
0 | 4,250,546.8477000 | 1,107.712591000 | 122 |
1 | 607,220.9782429 | 418.676005500 | 842 |
2 | 86,745.8540347 | 158.244655800 | 5,882 |
3 | 12,392.2648621 | 59.810857940 | 41,162 |
4 | 1,770.3235517 | 22.606379400 | 288,122 |
5 | 252.9033645 | 8.544408276 | 2,016,842 |
6 | 36.1290521 | 3.229482772 | 14,117,882 |
7 | 5.1612932 | 1.220629759 | 98,825,162 |
8 | 0.7373276 | 0.461354684 | 691,776,122 |
9 | 0.1053325 | 0.174375668 | 4,842,432,842 |
10 | 0.0150475 | 0.065907807 | 33,897,029,882 |
11 | 0.0021496 | 0.024910561 | 237,279,209,162 |
12 | 0.0003071 | 0.009415526 | 1,660,954,464,122 |
13 | 0.0000439 | 0.003559893 | 11,626,681,248,842 |
14 | 0.0000063 | 0.001348575 | 81,386,768,741,882 |
15 | 0.0000009 | 0.000509713 | 569,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 聚合海量数据,参考这个思路,也能显著降低存储的体积。
参考资料#
Read other posts