网格系统对于分析大型空间数据集至关重要,它将地球的区域划分为可识别的网格单元。
考虑到这一点,优步开发了H3.,我们的网格系统,有效地优化乘车定价和调度,可视化和探索空间数据。H3使我们能够分析地理信息,以制定动态价格,并在全市范围内做出其他决策。我们使用H3作为整个市场分析和优化的网格系统。H3就是为这个目的而设计的,它引导我们做出了一些选择,比如使用六边形的层次索引。
今年早些时候,我们开放的H3在GitHub上,让别人访问这种强大的解决方案,上周我们开放了我们的H3 JavaScript绑定.在本文中,我们将讨论为什么要使用网格系统,H3的一些独特属性,以及如何开始使用H3。
分析使用网格
每天,大量的事件发生在优步市场。每分钟,骑手请求游乐设施,司机合作伙伴开始旅行,饥饿的用户要求食物,以及在平台上的其他行动中。例如,每个事件发生在特定位置,例如,骑车者请求从家里乘车,并且驾驶员接受在他们的车内只需几英里之外的要求。
这些活动使优步能够更好地了解和优化我们的用户服务的市场。例如,这些事件可能会告诉我们,在一个城市的某个地方,需求大于供应,并据此调整价格,或者通知平台,在uberPOOL上的某个特定司机附近有两个搭车请求。
从UBER Marketplace中的数据中获取信息和见解需要在整个城市中分析数据。因为城市在地理上多样化,所以这种分析需要以细粒度发生。分析最好的粒度,事件发生的确切位置是非常困难和昂贵的。对城市内的社区等地区的分析更加实用。
![]() |
![]() |
![]() |
| 图2。上面的地图描绘了H3的冲击点的过程:城市中的汽车;在六边形的汽车;六边形被汽车的数量所遮蔽。 |
我们使用网格系统将铲斗事件进入六角形区域,换句话说,细胞。数据点托成六边形,可以使用六角铲数据的数据写入。例如,我们通过在我们服务的每个城市的六边形中测量供需来计算浪涌定价。这些六边形构成了我们对优步市场的分析的基础。
六边形是一个重要的选择,因为一个城市的人往往是运动,六边形最小化量化错误当用户通过一个城市时介绍。六边形也允许我们很容易地近似半径,比如这个例子使用Elasticsearch.
还有其他选择我们可以使用铲斗事件进入区域,例如各个区域的多边形区域。这些可能是邮政编码领域,但这些领域具有不同的形状和尺寸,这些形状和大小对分析并不有帮助,并且可能会导致原因发生变化完全无关紧要我们将使用它们。基于他们对城市的知识,Uber运营团队也可以绘制区域,但这种区域需要频繁更新随着城市的变化,并且通常是任意定义区域的边缘。
电网系统可以在优步经营的城市中具有可比的形状和尺寸,并且不受任意变化的影响。虽然网格系统不与城市的街道和街区保持一致,但它们可用于通过聚类网格细胞有效地代表邻居。可以使用客观函数来完成聚类,产生形状对于分析更有用。确定群集的成员资格与集合查找操作有效。
H3.
我们决定创建H3以将六边形全球电网系统的优势与分层索引系统相结合。
一个全球网格系统通常需要至少两样东西:一个地图投影和一个在地图上的网格。从地球上的三维位置到地图上的二维点需要地图投影。然后一个网格覆盖在地图上,形成一个全球网格系统。
这个过程可以通过结合不同的地图投影和网格来完成,例如,广泛认可的墨卡托投影和一个方形网格。虽然这种简单的方法工作,但它有许多缺点。要开始,Mercator投影具有显着的尺寸失真,因此一些细胞将具有截然不同的区域。方形电网还具有缺点,在用于分析时需要多组系数。这个缺点是具有两种不同类型的邻居的平方根,它们共用边缘(在四个基形方向上)和它们共享顶点(在四个对角线方向上)的一种类型的结果。
![]() |
![]() |
![]() |
| 图5.我们选择使用以Icosahedron面孔(左)为中心的GNOMONIC投影用于H3的地图投影,将地球投影为球形ICOSAHEDRON(右)。 |
对于地图投影,我们选择使用中心点投影二十面体的脸。它从地球作为一个球体投射到一个二十面体,一个二十边的柏拉图立体。以二十面体为基础的地图投影产生20个独立的二维平面,而不是一个单一的平面。二十面体可以是以多种方式展开,每次都生成一张二维地图。然而,H3并没有展开二十面体来建立它的网格系统,而是在二十面体的面上展开它的网格,形成一个GeodeSic离散全局网格系统.
![]() |
![]() |
![]() |
| 图6。三角形到它的邻近点(左),正方形到它的邻近点(中),六边形到它的邻近点(右)的距离。 |
使用六边形作为细胞形状对H3是至关重要的。如图6所示,相对于正方形的两段距离和三角形的三段距离,六边形的中心点和相邻的中心点之间只有一段距离。这个性质极大地简化了对梯度的分析和平滑。
通过将122个碱基细胞铺设在地球上,每张腹部10个细胞构成H3网格。一些细胞包含多于一面。由于无法仅将ICOSahedron铺设六边形,因此我们选择在每个Icosahedron顶点的一个处引入12个五角星。这些顶点使用球面ICOSAHEDRON取向定位r·巴克明斯特·富勒,它将所有顶点放置在水中。这有助于避免在我们的工作中出现五边形。
![]() |
![]() |
![]() |
| 图8. H3使用户能够将区域细分为较小和较小的六边形。 |
H3支持十六分辨率。每个更精细的分辨率都有一个具有较粗糙分辨率的区域的细胞。六边形不能完全细分成七个六边形,因此粮食细胞仅包含在父细胞内。
可以容易地截断这些子单元格的标识符以粗略分辨率,从而实现高效索引的祖先单元。因为仅近似包含儿童细胞,所以截断过程产生固定量的形状失真。执行小区标识符的截断时才存在此失真;当以特定分辨率索引位置时,单元边界精确。
从H3开始
的H3索引系统是开源并在GitHub上提供。的H3图书馆本身是用c编写的,并且有许多语言的绑定都有绑定。使用绑定是推荐的开始使用H3的方式。优步发表了绑定Java和JavaScript的绑定,社区提供了更多的语言.Python和Go很快就会有绑定。
![]() |
![]() |
![]() |
| 图9.该点(蓝色,左)及其含六边形的六边形,其含六边形的质心(较轻的蓝色,中间)以及含六边形(右)的点和质心描绘了两者之间的可能差异。 |
代码:https://github.com/uber/h3/blob/master/examples/index.c
H3库的基本功能用于索引位置,将纬度和经度对转换为a64位H3指数,识别网格单元格。功能geoToH3采用纬度,经度和分辨率(在0到15之间,0个是最粗化的,15个是最好的),并返回索引。H3Togeo.和H3ToGeGoboundary.是该函数的反函数,分别提供由H3索引指定的网格单元的中心坐标和轮廓。
使用H3索引数据后,H3 API具有用于使用索引的功能。
![]() |
![]() |
![]() |
| 图10.邻居索引的六角形,距离为0(左;只有原始索引),1(中间;与原始索引的邻居),2(右;与邻居的邻居)。 |
代码:https://github.com/uber/h3/blob/master/examples/neighbors.c
邻近的六边形具有使用网格系统近似圆圈的有用财产。的kring.函数提供网格距离内的网格单元k原始索引的。
![]() |
![]() |
| 图11.代表加利福尼亚州的密集六边形与代表国家的紧凑六角形突出,需要较少的六边形来表示相同区域。 |
代码:https://github.com/uber/h3/blob/master/examples/compact.c
H3的分层性质允许有效地截断索引的精度(或分辨率)并恢复原始索引。的uncompact紧凑上面显示了一组六边形的表示。未分辨表示在第6号决议中有10,633个六边形,但紧凑的表示在决议上有901个六边形,在这两种情况下,六角形指数是64位整数。
单个索引的精度也可以作为位操作有效地截断,或者扩展为更高精度的索引集。
代码:https://github.com/uber/h3/blob/master/examples/edge.c
H3具有职能网格细胞的定向边缘这可以代表从一个电池到另一个电池的运动。定向边沿可以存储为64位整数,并且可以从两个相邻小区获得,或者通过查找小区的所有边缘获得。在需要时,可以将边沿转换回原点或目标索引。
前进
H3在整个优点中使用,以支持我们的市场的定量分析,现在它是开放的,你也可以六角形世界!我们期待着通过以下方式加入H3社区GitHub上的存储库和推特#uberh3井号。
使用的映射使用MapboxGL.
了解更多信息我们的映射数据提供者.
H3图书馆的主要贡献者还包括Kevin Sahr(俄勒冈州南部大学),Joseph Gilley(优步),Nick Rabinowitz(优步)和David Ellis(Cardash)。
订阅我们的新闻以跟上优步工程的最新创新。



















