0
4

1 回答 1

1

位布局的这种分解可能会有所帮助(在理解索引结构方面)。

  • 有 122 个基本单元。网格中的每个单元格要么是这些基本单元格之一,要么是这些基本单元格之一的后代,因此每个索引都包含它所来自的基本单元格。
  • 索引的其余部分是分层的,从基本单元向下走。本质上是一个像“基本单元格 27 孩子 2 孩子 0 孩子 3...”这样的地址。

完全可以通过位操作来完成您所描述的操作,但这需要对 H3 索引系统有相当多的了解。我以前做过,但代码目前是专有的,我不能在这里分享:(。与很多 H3 代码一样,五边形是困难的部分。

解决方案如下所示:

  • r确定五边形和非五边形基础单元所需资源的单元计数。六角细胞有7^r孩子,五边形有1 + 5 * (7^r - 1) / 6孩子(你可以用maxH3ChildrenSize这个,但无论如何你都需要知道)。
  • 您需要知道五边形基本单元格编号。这些是4, 14, 24, 38, 49, 58, 63, 72, 83, 97, 107, 117

对于给定的数字n

  • 从“空”索引开始,8ffffffffffffff. 将分辨率位设置为r
  • 确定基本单元格n所在和基本单元格偏移量 ( numPrecedingHexBaseCells * hexBaseSize + numPrecedingPentBaseCells * pentBaseSize)。
  • 设置索引中的基本单元位。
  • 从 中减去偏移量n。这是您的子级偏移量(即基本单元格子级列表中单元格的偏移量)。
  • 使用子偏移量计算 res 1, res 2, ...res 的索引号r。我不能在这里简单地介绍这个逻辑,但你应该能够从上面的公式中推导出它来计算子计数(例如,在 res 1 处,一个十六进制基本单元格有 7 个孩子。在 res 2 处,它有49 - 首先找出 res 1 组nn % 7,然后找出 res 2 编号等)。

这一切都非常复杂。我们计划将它添加到库中,但至少需要几个月的时间。如果您只需要一个 res 处所有单元格的流式列表,并且性能不是一个强要求,则可以使用 DFS 方法代替 - 对于每个基本单元格,找到所有子单元,然后在下一个 res,然后是下一个 res 的一个孩子,依此类推,直到所需的分辨率。这只需要7 * r一次将单元格保存在内存中。

于 2022-01-13T23:32:59.357 回答