是否可以将 H3 索引结构映射到从 0 开始的递增整数?
Is it possible to map the H3 indexing structure to an incrementing integer start from 0?
我在理解 H3 indexing docs. For those who are new to H3 中的所有信息时遇到了一些困难,它是优步最近发布的“六角形层次地理空间索引系统”。这是这个问题的关键信息:
H3 Cell Index
An H3 Cell index (mode 1) represents a cell (hexagon or pentagon) in the H3 grid system at a particular resolution. The components of the H3 Cell index are packed into a 64-bit integer in order, highest bit first, as follows:
- 1 bit reserved and set to 0,
- 4 bits to indicate the H3 Cell index mode,
- 3 bits reserved and set to 0,
- 4 bits to indicate the cell resolution 0-15,
- 7 bits to indicate the base cell 0-121,
- 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total are reserved for resolutions 1-15)
The three bits for each unused digit are set to 7.
我不确定“指示基本单元格 0-121”是什么意思,或者下一行“指示每个后续数字 0-6" ...
问题的第一部分(可能会帮助我自己弄清楚)是最后两个项目符号的含义。但主要问题是,是否可以仅基于位操作(即不使用散列 table 或某种映射)将递增整数(从 0 开始)映射到单个分辨率级别内的每个单元格)?我不太清楚,而且不知道最后两行我还没有看到可能的方法。
This breakdown of the bit layout 可能会有所帮助(在理解索引结构方面)。
- 有 122 个基本单元格。网格中的每个单元格要么是这些基本单元格之一,要么是这些基本单元格之一的后代,因此每个索引都包含它所源自的基本单元格。
- 索引的其余部分是分层的,从基本单元格向下走。本质上是一个地址,如“Base cell 27 child 2 child 0 child 3...”。
完全可以通过位操作来完成您所描述的操作,但这需要对 H3 索引系统有相当多的了解。我以前做过这个,但是代码目前是专有的,我不能在这里分享它:(。和很多 H3 代码一样,五边形是最难的部分。
解决方案看起来像这样:
- 确定所需 res
r
的五边形细胞和 non-pentagon 基本细胞的细胞计数。六边形单元格有 7^r
children,五边形单元格有 1 + 5 * (7^r - 1) / 6
children(你可以使用 maxH3ChildrenSize
,但无论如何你都需要知道) .
- 您需要知道五角大楼的基本单元数。这些是
4, 14, 24, 38, 49, 58, 63, 72, 83, 97, 107, 117
对于给定的数字 n
:
- 从“空”索引开始,
8ffffffffffffff
。将分辨率位设置为 r
.
- 确定基本单元格
n
在和基本单元格偏移(numPrecedingHexBaseCells * hexBaseSize + numPrecedingPentBaseCells * pentBaseSize
)。
- 设置索引中的基本单元位。
- 从
n
中减去偏移量。这是您的 child 偏移量(即基本单元格列表中单元格的偏移量 children)。
- 使用 child 偏移量计算出资源 1、资源 2、...资源
r
的索引号。我不能在这里轻易地解释这个逻辑,但是你应该能够从上面的公式中推导出它来计算 child 计数(例如,在 res 1 处,一个十六进制基本单元格有 7 children。在 res 2,它有 49 - 首先找出 res 1 组 n
与 n % 7
,然后找出 res 2 编号,等等)。
这一切都非常复杂;我们计划将它添加到库中,但至少需要几个月的时间。如果您只需要一个 res 中所有单元格的流式列表,并且性能不是很强的要求,您可以改用 DFS 方法 - 对于每个基本单元格,找到所有 children,然后找到所有 children 一个 child 在下一个 res,然后一个 child 在下一个 res,等等,直到所需的分辨率。这只需要一次将 7 * r
个单元格保存在内存中。
我在理解 H3 indexing docs. For those who are new to H3 中的所有信息时遇到了一些困难,它是优步最近发布的“六角形层次地理空间索引系统”。这是这个问题的关键信息:
H3 Cell Index
An H3 Cell index (mode 1) represents a cell (hexagon or pentagon) in the H3 grid system at a particular resolution. The components of the H3 Cell index are packed into a 64-bit integer in order, highest bit first, as follows:
- 1 bit reserved and set to 0,
- 4 bits to indicate the H3 Cell index mode,
- 3 bits reserved and set to 0,
- 4 bits to indicate the cell resolution 0-15,
- 7 bits to indicate the base cell 0-121,
- 3 bits to indicate each subsequent digit 0-6 from resolution 1 up to the resolution of the cell (45 bits total are reserved for resolutions 1-15)
The three bits for each unused digit are set to 7.
我不确定“指示基本单元格 0-121”是什么意思,或者下一行“指示每个后续数字 0-6" ...
问题的第一部分(可能会帮助我自己弄清楚)是最后两个项目符号的含义。但主要问题是,是否可以仅基于位操作(即不使用散列 table 或某种映射)将递增整数(从 0 开始)映射到单个分辨率级别内的每个单元格)?我不太清楚,而且不知道最后两行我还没有看到可能的方法。
This breakdown of the bit layout 可能会有所帮助(在理解索引结构方面)。
- 有 122 个基本单元格。网格中的每个单元格要么是这些基本单元格之一,要么是这些基本单元格之一的后代,因此每个索引都包含它所源自的基本单元格。
- 索引的其余部分是分层的,从基本单元格向下走。本质上是一个地址,如“Base cell 27 child 2 child 0 child 3...”。
完全可以通过位操作来完成您所描述的操作,但这需要对 H3 索引系统有相当多的了解。我以前做过这个,但是代码目前是专有的,我不能在这里分享它:(。和很多 H3 代码一样,五边形是最难的部分。
解决方案看起来像这样:
- 确定所需 res
r
的五边形细胞和 non-pentagon 基本细胞的细胞计数。六边形单元格有7^r
children,五边形单元格有1 + 5 * (7^r - 1) / 6
children(你可以使用maxH3ChildrenSize
,但无论如何你都需要知道) . - 您需要知道五角大楼的基本单元数。这些是
4, 14, 24, 38, 49, 58, 63, 72, 83, 97, 107, 117
对于给定的数字 n
:
- 从“空”索引开始,
8ffffffffffffff
。将分辨率位设置为r
. - 确定基本单元格
n
在和基本单元格偏移(numPrecedingHexBaseCells * hexBaseSize + numPrecedingPentBaseCells * pentBaseSize
)。 - 设置索引中的基本单元位。
- 从
n
中减去偏移量。这是您的 child 偏移量(即基本单元格列表中单元格的偏移量 children)。 - 使用 child 偏移量计算出资源 1、资源 2、...资源
r
的索引号。我不能在这里轻易地解释这个逻辑,但是你应该能够从上面的公式中推导出它来计算 child 计数(例如,在 res 1 处,一个十六进制基本单元格有 7 children。在 res 2,它有 49 - 首先找出 res 1 组n
与n % 7
,然后找出 res 2 编号,等等)。
这一切都非常复杂;我们计划将它添加到库中,但至少需要几个月的时间。如果您只需要一个 res 中所有单元格的流式列表,并且性能不是很强的要求,您可以改用 DFS 方法 - 对于每个基本单元格,找到所有 children,然后找到所有 children 一个 child 在下一个 res,然后一个 child 在下一个 res,等等,直到所需的分辨率。这只需要一次将 7 * r
个单元格保存在内存中。