3

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

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

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

4

1 回答 1

1

如果您的半径与地球的大小相比较小,那么您可能可以使用简单的 2D 毕达哥拉斯而不是昂贵的 3D 球面几何。越靠近两极,这可能就越不真实,所以我希望你不是在绘制企鹅或北极熊的地图!

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

如果您首先进行该搜索并提出可能匹配的列表,那么您只需从结果数据集中过滤掉搜索框的角落。如果您返回匹配点的纬度/经度,您可以在 PHP 中计算距离,而不必为表中的所有点计算距离。这有意义吗?

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

于 2010-02-02T17:42:06.023 回答