0

有谁知道如何进行查询,允许用户指定他们的 lat / lng 和半径,然后搜索可能是非常大量的位置,这些位置也有 lat lng + 半径,看看是否有重叠,然后允许按距离排序?

我们被要求允许公司在他们经营的郊区地图上放置标记,并能够绘制半径,但我在谷歌上找不到任何这样做的查询。

我目前正在使用以下查询来完成这项工作,

(SELECT ( 6371.01 * acos( cos( radians( $lat ) ) * cos( radians( location.lat ) ) 
 cos( radians( location.lng ) - radians( $lng ) )
 sin( radians( $lat ) ) * sin( radians( location.lat ) ) ) ) AS distance
FROM location 
HAVING distance <= $radius 
ORDER BY distance ASC) as distance

但显然这不允许位置有半径。

这个问题的第二部分,这个搜索查询已经是一个非常大的查询的一部分。有没有关于优化这个的建议?每次我在谷歌上搜索上述查询的示例时,总会有人警告说这个查询有多昂贵。目前我能想到的唯一解决方案是拥有一个单独的搜索服务器。

4

1 回答 1

1

非常简单的答案:使用 mySQL 中的空间几何函数(http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html

这些已经存在了一段时间,但在 5.6 中得到了很好的升级,这将使您更容易进行选择。http://www.percona.com/blog/2013/10/21/using-the-new-spatial-functions-in-mysql-5-6-for-geo-enabled-applications/有一些细节。

如果您没有 5.6,请使用“网格”系统。基本上,当您存储点 (x,y) 时,您还存储了一个覆盖更大正方形的网格标识符 (X,Y)。当搜索附近的其他点时,您知道它在网格内(X-1 到 X+1)和(Y-1 到 Y+1);这减少了您需要搜索的点数。然后检查 x 和 y 的实际差异都在 mySQL 中的一个正方形内,然后,一旦你大量减少它,然后做你的 cos/sin 数学。

于 2014-09-12T07:23:04.487 回答