如何计算和使用Morton(z-index)值来用PHP / MySQL索引地理数据?

时间:2010-01-31 19:17:27

标签: php mysql indexing geolocation z-order-curve

我有一个MySQL记录表,每个记录都有一个lat / lng坐标。基于中心点和半径对该数据进行搜索(返回半径内的任何记录)。我正在使用球面的余弦定律来计算查询中的距离。我的问题是索引地理数据的效率非常低(lat / lng值存储为浮点数)。使用MySQL的空间扩展不是一种选择。对于大小约为100k的数据集,查询会花费不合理的时间来执行。

我做了一些研究,似乎使用了z-index,即莫顿数可能有所帮助。我可以计算插入时每条记录的莫顿数,然后根据地球的半径/中心点/给定的搜索半径计算边界框的高/低莫顿值。

我对这些东西只有足够的了解来构建我的应用程序所以我不完全确定这是否可行,而且我也不知道如何在PHP中计算Morton数。这会是一个按位操作吗?

1 个答案:

答案 0 :(得分:1)

如果您的半径与地球的大小相比较小,那么您可以使用简单的2D Pythagorus而不是昂贵的3D球形几何体。你越接近两极,这可能不那么真实,所以我希望你不要映射企鹅或北极熊!

接下来,考虑一下您问题的边界框。您知道它们必须位于搜索点的+/- $半径范围内。将搜索半径转换为度数,并查找lat / lon在搜索中心+/- $ radiusindegrees定义的框内的所有记录。

如果您首先进行搜索并找到可能的匹配列表,那么您只需从结果数据集中过滤出搜索框的角落。如果你找回匹配点的纬度/经度,你可以用PHP计算距离,避免为表中的所有点计算距离。这有意义吗?

使用数据库查找适合方形边界框的所有内容,然后使用PHP过滤那些超出所需半径的点。