《系统设计》课程学习笔记—地理哈希和四叉树

617 阅读3分钟

地理哈希

地理哈希(Geohashing)是一种地理编码方法,用于将纬度和经度等地理坐标编码为短字母数字字符串。它由 Gustavo Niemeyer 于2008年创建。

例如,坐标为 37.7564,-122.4016 的旧金山可以在地理哈希中表示为 9q8yy9mf

地理哈希是如何工作的?

地理哈希是一种使用32进制字母编码的分层空间索引,地理哈希中的第一个字符将初始位置标识为32个单元格之一。该单元还将包含32个单元。这意味着,为了表示一个点,世界通过增加位数被递归地划分为越来越小的单元,直到达到所需的精度。精度因子还决定了单元的大小。

geohashing.webp

点的地理哈希共享的前缀越长,则地理哈希保证点在空间上更接近,这意味着字符串中的字符越多,位置越精确。例如,地理哈希 9q8yy9mf9q8yy9vx 在空间上更接近,因为它们共享前缀 9q8yy9

地理哈希也可以用于提供一定程度的匿名性,因为我们不需要公开用户的确切位置,根据地理哈希的长度,我们只知道他们的位置在某个区域内。

不同长度的地理哈希的单元格大小如下:

Geohash lengthCell widthCell height
15000 km5000 km
21250 km1250 km
3156 km156 km
439.1 km19.5 km
54.89 km4.89 km
61.22 km0.61 km
7153 m153 m
838.2 m19.1 m
94.77 m4.77 m
101.19 m0.596 m
11149 mm149 mm
1237.2 mm18.6 mm

使用场景

以下是地理哈希的一些常见使用场景:

  • 它是一种在数据库中表示和存储位置的简单方法。
  • 它也可以作为 URL 在社交媒体上共享,因为它比纬度和经度更容易共享和记忆。
  • 通过非常简单的字符串比较和高效的索引搜索,我们可以高效地找到点的最近邻居。

例子

地理哈希被广泛使用,并受到流行数据库的支持。

四叉树

四叉树是一种树数据结构,其中每个内部节点正好有四个子节点。它们通常用于通过递归地将二维空间细分为四个象限或区域来划分二维空间。每个子节点或叶节点存储空间信息。四叉树是用于划分三维空间的八叉树的二维模拟。

geohashing.webp

四叉树的类型

四叉树可以根据它们表示的数据类型进行分类,包括区域、点、线和曲线。以下是常见的四叉树类型:

  • 点四叉树
  • 点区域(PR)四叉树
  • 多边形映射(PM)四叉树
  • 压缩四叉树
  • 边四叉树

为什么我们需要四叉树?

纬度和经度不够吗?为什么我们需要四叉树?虽然在理论上使用纬度和经度,我们可以使用欧几里得距离确定点之间的距离,但在实际使用情况下,由于其 CPU 密集型的特点和大数据集,它没有办法进行扩展。

quadtree.webp

四叉树使我们能够高效地搜索二维范围内的点,其中这些点定义为纬度/经度坐标或笛卡尔(x,y)坐标。此外,我们可以通过仅在某个阈值之后细分节点来节省进一步的计算。通过应用希尔伯特曲线等映射算法,我们可以轻松提高范围查询性能。

使用场景

以下是四叉树的一些常见使用场景:

  • 图像表示、处理和压缩。
  • 空间索引和范围查询。
  • 基于位置的服务,如谷歌地图、Uber等。
  • 网格生成和计算机图形。
  • 稀疏数据存储。