我刚刚了解了H3,并希望基本上获得“标准参考”点,在每个分辨率下参考每个六边形(和 12 个五边形),然后确定每个六边形的 lat/lng 坐标。这是如何运作的?
H3 网格是在二十面体上通过递归创建精度越来越高的六边形网格构建的,直到达到所需的分辨率。请注意,用六边形完全平铺球体/二十面体是不可能的;二十面体六边形网格的每个分辨率必须在每个分辨率下恰好包含 12 个五边形,其中一个五边形以每个二十面体顶点为中心。
第一个 H3 分辨率(分辨率 0)由 122 个单元(110 个六边形和 12 个二十面体顶点中心五边形)组成,称为基本单元。选择这些是为了尽可能多地捕捉球形二十面体的对称性。这些基本单元根据其中心点的纬度被分配从 0 到 121 的编号;基本单元 0 具有最北端的中心点,而基本单元 121 具有最南端的中心点。
超过分辨率 0 的每个后续分辨率都是使用孔径 7 分辨率间距创建的(孔径是指每个单元的下一个更精细分辨率网格中的单元数);随着分辨率的增加,单位长度按 sqrt(7) 缩放,并且每个六边形在下一个较粗的分辨率下(在二十面体上测量)具有六边形面积的 1/7。除了分辨率为 0 的基本单元之外,H3 还提供了 15 种更精细的网格分辨率。最好的分辨率,即 15 分辨率,其单元格的面积小于 1 平方米。
我想降低分辨率 10,大约是 15m^2 区域。我想以这个分辨率为每个六边形存储一个自定义生成的密钥,将密钥与六边形的索引或散列相关联,我假设它以某种方式与系统的起源相关联,并且以某种方式将起源硬编码为特定的放在地球上。
所以看起来这h3.getRes0Indexes
会给我们以 0 为底的 122 个原始单元格。并且层次结构文档在 JavaScript 库中显示了如何至少遍历分辨率。
function example() {
const h = '85283473fffffff';
return h3.h3ToCenterChild(h, 10);
}
因此,鉴于我已经弄清楚原始哈希是什么,这将使我以分辨率 10 为中心。在遍历代码中,我没有看到遍历每个节点一次的简单方法。那应该怎么做?
啊,没关系,难道只是,不是在分辨率 10 处跳转到中心子节点,而是要求基节点内的所有子节点?
const baseCells = h3.getRes0Indexes();
for (const index of baseCells) {
yield* await getChildrenAtRes(index, h3Res);
}
async function* getChildrenAtRes(h3Index, targetRes) {
const nextRes = h3.h3GetResolution(h3Index) + 1;
// Iterate over all direct children of the current index
for (const child of h3.h3ToChildren(h3Index, nextRes)) {
if (nextRes >= targetRes) {
await Promises.delay(300);
yield child;
} else {
yield* getChildrenAtRes(child, targetRes);
}
}
}
也许我可以尝试直接从 0 跳到分辨率 10 并获得所有数百个孩子?我会试试的。
也可以使用这个:
// Get the vertices of an H3 index as lat/lng points
h3.h3ToGeoBoundary("8928342e20fffff")
所以我想我已经回答了我所有的问题,除了起源在哪里?它将这些东西映射到实际地球的部分在哪里?这是否以某种方式在代码库中的某个地方进行了硬编码?我怎么知道当我今天使用这个库时,我从 API 获得的 122 个基本六边形将具有与我上次使用它时相同的哈希值?