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

五角大楼




请注意,不可能用六边形完全平铺球体/二十面体。二十面体六边形网格的每个分辨率在每个分辨率下都必须恰好包含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的布局如下表所示。“保留/边缘”字段的解释因索引的模式而异。


0x300F0x300E --- 0x300B0x300A --- 0x30080x3007 ---- 0x30040x3003 --- 0x200D0x200C --- 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已经发布了JavaJavaScript的绑定,而社区也为更多的语言提供了绑定。Python和Go的绑定即将推出。

指数



邻接



袖珍的



边缘



应用领域


流量分析

地理空间分片

地理可视化

Uber Golang规范是Uber专门为其Golang代码库制定的一套代码编写指南和规范。以下是Uber Golang规范的主要特点: 命名规范:采用驼峰命名法,遵循Go语言的命名约定。使用有意义且描述性强的名称,避免使用缩写。 包和依赖管理:使用Go的标准工具go mod来管理包和依赖。在代码库的根目录下创建go.mod文件,明确定义需要使用的外部依赖。 代码布局:代码文件应按照功能逻辑进行组织,每个文件夹下应包含一个独立的Go模块。避免使用过深的嵌套文件夹结构。 错误处理:在函数签名中使用`error`类型,以便清晰地表示可能出现的错误。避免使用panic来处理错误,而是使用返回错误信息来处理。 并发:使用Go语言提供的并发原语,如goroutine和channel,来编写并发代码。避免使用传统的同步原语,如互斥锁。 测试:为每个包编写相应的测试代码,测试代码应放在与源代码相同的包中,以便方便进行单元测试。使用`go test`来运行测试。 文档:代码应有清晰的注释,包括每个公共函数和方法的文档注释。注释应使用规范的格式,方便生成文档。 性能优化:在编写代码时要考虑性能,并进行必要的性能优化。可以使用Go的性能分析工具来找出性能瓶颈并进行优化。 此外,Uber Golang规范还提供了关于代码风格、错误处理、日志记录、版本管理和代码重用等方面的指导。遵循这些规范可以使代码更易于理解、维护和扩展,并提高代码库的整体质量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值