Google S2 对 Hilbert Curve 的使用如何解决(如果不是,则最小化)具有不同前缀值的更接近单元格的问题,例如 Geohash 中的问题?

Posted

技术标签:

【中文标题】Google S2 对 Hilbert Curve 的使用如何解决(如果不是,则最小化)具有不同前缀值的更接近单元格的问题,例如 Geohash 中的问题?【英文标题】:How does Google S2's use of Hilbert Curve solve (if not, minimize) the problem of closer cells having different prefix values like in Geohash? 【发布时间】:2021-12-19 05:08:18 【问题描述】:

在 GeoHash 的情况下,靠近的两个点可以具有完全不同的哈希值,从而无法进行前缀比较之类的事情。这是因为在祖先的某处,有一个分裂(在地理分组中)。

为了查询的目的,S2 如何尝试解决这个问题?我在 S2 上看了一堆帖子,但看不懂。

【问题讨论】:

【参考方案1】:

我不会说 S2 解决了这个问题。两个关闭点在 S2 中也可能仍然具有完全不同的单元格 ID。可以说 S2 的希尔伯特曲线比 GeoHash 使用的 Z 曲线稍微少一些,但根本问题仍然存在。

当您使用 S2 时,您通常不会使用前缀比较,而是使用区间搜索。或者,您可以在一个点的特定半径内计算一些可能的前缀并搜索它们。当然,您也可以使用 GeoHash 实现这两种方法。

S2 使用 GeoHash 解决了一个不同的问题,这使得使用 GeoHash 进行附近搜索变得不切实际,除非在局部情况下:单元格的大小和几何形状非常不同。两极附近的 GeoHash 单元比赤道附近的同级单元要小得多(在实际面积上)。近极地 GeoHash 单元格也被拉伸。 S2 细胞在全球范围内更加均匀。

【讨论】:

你能详细说明你的第二段吗?似乎您在说前缀比较,除了位操作之外,还可以部署。哪种技术一般适用于什么条件等...? 检查 S2CellUnion 类的工作方式。您通常会计算一小组覆盖感兴趣区域的 S2Cell,然后使用 S2CellUnion.Intersects 搜索这些单元

以上是关于Google S2 对 Hilbert Curve 的使用如何解决(如果不是,则最小化)具有不同前缀值的更接近单元格的问题,例如 Geohash 中的问题?的主要内容,如果未能解决你的问题,请参考以下文章

Hilbert曲线简介及生成算法

Python版本的谷歌S2空间索引算法

重构核Hilbert空间(RKHS)

新星计划Matlab绘制信号包络线hilbert或者envelope实现

Hilbert-Peano 曲线扫描任意大小的图像

信号处理——Hilbert端点效应浅析