Uber h3算法

Uber的六角分层空间指数

概述

关于H3

H3是一个针对地球的空间划分和空间索引系统。

H3地理空间索引系统是一个离散的全局网格系统,该系统由具有层次结构索引的球形多精度六边形拼贴组成。在球形外接二十面体的平面上创建六边形网格系统,然后使用反面为中心的多面体结构投影将网格单元投影到球体的表面。

名词解释

Icosahedron(正二十面体)

正二十面体(Regular twenty aspect) 是由20个等边三角形所组成的正多面体,共有12个顶点,30条棱,20个面。为五个柏拉图多面体之一。

在几何学上,二十面体是具有20个面的多面体。

Hexagons(正六边形)

正六边形就是在平面几何学中,具有六条相等的边和六个相等内角的多边形。各内角相等,六边相等。由多边形外角和等于360度,推出一个内角为180-(360/6)=120度,所以内角为120度。

侏儒投影

它从地球中心查看表面数据。

  • 将心射地图投影显示所有的大圆为直线。
  • 最小的变形发生在切点处。
  • 不到一半的球体可以投影到有限的地图上。
  • 由于子午线和赤道是大圆,它们始终显示为直线。

动态投影(Fuller Map)

用一个正二十面体内切地球,并且是多面体的顶点均映射到海洋区域,然后将地球使用Gnomonic projection 投影到多面体上,将多面体展成一个平面,保证大陆不会被分裂开。

地球地图,可在一张完整的图片中显示地理信息,而不会破坏任何大陆轮廓,也不会对陆地的相对形状或大小造成任何可见的扭曲。

可以忽略不计的失真的世界投影,可以一目了然地准确显示全球信息,例如人类迁徙方式和自然资源的分布。

动态最大值=动态+最大值+张力='事半功倍'

理论讲解

投影

对于地图投影,我们选择使用以二十面体面为中心的侏儒投影。它从地球作为一个球体投射到二十面体的二十面体柏拉图式实体。基于二十面体的地图投影会产生二十个单独的二维平面,而不是单个平面。二十面体可以通过多种方式展开,每次生成二维图。但是,H3不会展开二十面体以构建其网格系统,而是将其网格放置在二十面体的面自身上,从而形成了测地线离散的全局网格系统。

单元格(cell shape)

使用六边形作为单元格形状对于H3至关重要

H3用于在单个二十面体的面上创建网格。

H3网格是通过在地球上布置122个基本单元而构建的,每个面有10个单元。有些单元格包含多个面。由于不可能仅用六边形平铺二十面体,因此我们选择引入十二个五边形,每个二十面体顶点各一个。这些顶点是使用R. Buckminster Fuller的球形二十面体方向进行定位的,它将所有顶点都放置在水中。这有助于避免五边形在我们的工作中浮出水面。

细分

H3使用户可以将区域细分为越来越小的六边形

H3支持十六种分辨率。每个较精细的分辨率所具有的像元的面积为较粗糙分辨率的七分之一。六边形不能完美地细分为七个六边形,因此,较细的单元仅近似包含在父单元中。

这些子单元格的标识符可以很容易地被截断,以较粗的分辨率找到它们的祖先单元格,从而实现高效索引。

解析度

使用孔径7分辨率间距(分辨率是指每个像元的下一个更精细的分辨率网格中的像元数)来创建分辨率高于0的每个后续分辨率。随着分辨率的提高,单位长度将按( sqrt {7} )进行缩放,并且每个六边形在下一个较粗的分辨率下(以二十面体测量)具有六边形的面积的(1 / 7th )。除了分辨率为0的基本像元之外,H3还提供了15种更精细的网格分辨率。分辨率最高的分辨率为15,其像元面积小于1 (m ^ 2 )。此处提供了一张表格,其中详细列出了每种H3分辨率的平均像元面积。

H3解析度 六角平均面积(平方千米) 六角形平均边缘长度(公里) 唯一索引数
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

五角大楼

请注意,不可能用六边形完全平铺球体/二十面体。二十面体六边形网格的每个分辨率在每个分辨率下都必须恰好包含12个五边形,其中一个五边形位于每个二十面体顶点的中心。

旋转的

每个栅格分辨率相对于下一个较粗分辨率旋转〜19.1°。在每个连续的分辨率下,旋转在逆时针和顺时针之间交替,因此每个分辨率将具有以下两种可能的方向之一:II类或III类(使用R. Buckminster Fuller创造的术语)。组成分辨率为0的基本单元是II类。

编码

H3系统为每个单元分配一个唯一的层次结构索引。分辨率r单元的H3索引以适当的分辨率0基本单元号开始。这之后是r个数字0-6的序列,其中第i个数字d i指定以较粗分辨率数字d 1至d i-1指示的像元为中心的7个像元之一。

基本单元号

第一个H3分辨率(分辨率0)由122个单元(110个六边形和12个二十面体顶点居中的五边形)组成,称为基本单元。选择它们是为了捕获尽可能多的球形二十面体对称性。这些基本单元根据其中心点的纬度分配了从0到121的数字。基本单元0具有最北端的中心点,而基本单元121具有最南端的中心点。

分辨率(N> 0)单元格号

局部六边形坐标系分配给每个分辨率为0的基本单元,并用于定向该基本单元的所有分层索引子单元。在每种分辨率下,数字0-6的分配使用中央位置索引安排。在12个五边形单元格的情况下,将以所有分辨率删除由子数字1生成的索引层次结构。

子六边形线性地小于其父六边形。

离散六边形平面网格系统自然具有3个坐标轴,彼此间隔120°。对于三个坐标轴ijk,我们称这种系统为ijk坐标系

H3Index的位布局

H3Index是H3索引的整数表示。

H3Index的布局如下表所示。“保留/边缘”字段的解释因索引的模式而异。

0x300F 0x300E — 0x300B 0x300A — 0x3008 0x3007 —- 0x3004 0x3003 — 0x200D 0x200C — 0x0000
模式 保留/边缘 解析度 基本单元 数字1 —-数字15

模式:模式1是H3单元(六角形)索引,模式2是H3单向边缘(六角形A->六角形B)索引,模式3计划是双向边缘(六角形A->六角形B)。模式0被保留,指示无效的H3索引。

模式1( 0x300A — 0x3008 ):保留3位,

模式2( 0x300A — 0x3008 :3位表示要遍历的单元格的边1-6,

缺点

失真

由于子单元格仅包含在其中,因此截断过程会产生固定量的形状失真。仅当执行单元标识符的截断时才会出现这种失真。当以特定分辨率索引位置时,单元格边界是精确的。

失真

个人感觉,由于H3不是一个完美的数学模型,而是一个地理模型,因此在真正的实现中,使用了大量的固定映射表格,如正二十面体的面的位置,base cell的序号已经他们的邻接关系等;

实现说明

该H3索引系统是开源的,可以在GitHub上。在H3库本身是用C语言编写,并绑定可用于不同的语言。建议使用绑定来开始使用H3。Uber已经发布了Java和JavaScript的绑定,而社区也为更多的语言提供了绑定。Python和Go的绑定即将推出。

指数

邻接

袖珍的

边缘

应用领域

流量分析

地理空间分片

地理可视化

Published by

风君子

独自遨游何稽首 揭天掀地慰生平