为了计算由纬度/经度表示的最近位置,我正在考虑将地图划分为小网格,大约 100x100 米网格。基本上每个点都将分配给一个网格。
我知道我也可以将空间索引与 MySQL 等一起使用,但我计划使用像 Cassandra 这样的非关系数据库,在这种数据库中很难对空间对象进行索引,因此某种网格近似技术可能很简洁。
创建这样一个网格系统并将二维空间位置映射到它的最佳方法是什么?
编辑1:如果网格不是完全均匀的,可能没关系,在两极周围更是如此。
为了计算由纬度/经度表示的最近位置,我正在考虑将地图划分为小网格,大约 100x100 米网格。基本上每个点都将分配给一个网格。
我知道我也可以将空间索引与 MySQL 等一起使用,但我计划使用像 Cassandra 这样的非关系数据库,在这种数据库中很难对空间对象进行索引,因此某种网格近似技术可能很简洁。
创建这样一个网格系统并将二维空间位置映射到它的最佳方法是什么?
编辑1:如果网格不是完全均匀的,可能没关系,在两极周围更是如此。
从二维空间坐标映射到您的空间索引/geohash 是一个有趣的问题。你可以看看这篇关于四叉树、geohashes 和 Hilbert 曲线的文章。希尔伯特曲线是提供局部性的空间填充曲线;出于您的目的,这意味着一维空间索引中的附近项目将在二维空间中附近。
目标(如其他响应者所述)是在不从服务器请求大量不必要数据的情况下,最大限度地减少覆盖相关空间所需的查询数量。如何进行从二维空间到一维索引的映射将影响该目标。
在不知道您的确切应用程序要求的情况下, Geohashing 可能是一种合适的技术:http ://en.wikipedia.org/wiki/Geohash
“它是一种分层空间数据结构,将空间细分为网格形状的桶。Geohashes 提供了任意精度等属性,以及逐渐从代码末尾删除字符以减小其大小(并逐渐失去精度)的可能性。”
矩形网格可能是一个合理的估计,但仅限于不太靠近两极的相对较小的区域。全面的解决方案需要不同的方法。
您无法创建统一映射地球的矩形网格。如果网格必须是统一的,则必须改用三角形。但总的来说,我怀疑这会解决你的问题。您需要的是某种 2D八叉树(这是一个 Google 搜索链接;检查图像以了解其工作原理):您必须将坐标划分为层次结构(例如原点的北/南/东/西第一级,然后在 90 度之间,等等)。
然后你可以做几个选择,这将很快产生包含现有坐标的最小矩形。现在,您可以检查矩形的大小。如果它 < 100m,那么您已经找到了解决方案。否则,您将只需要检查几个位置(通常是一个)。
谷歌“八叉树 sql 数据库”的实现。