问问题
28 次
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 组n
与n % 7
,然后找出 res 2 编号等)。
这一切都非常复杂。我们计划将它添加到库中,但至少需要几个月的时间。如果您只需要一个 res 处所有单元格的流式列表,并且性能不是一个强要求,则可以使用 DFS 方法代替 - 对于每个基本单元格,找到所有子单元,然后在下一个 res,然后是下一个 res 的一个孩子,依此类推,直到所需的分辨率。这只需要7 * r
一次将单元格保存在内存中。
于 2022-01-13T23:32:59.357 回答