从MySQL获取最近的GPS点数

时间:2012-02-01 14:51:46

标签: mysql geolocation

我有一张包含float latitudefloat longitude的表格(如47.960237,13.796564)。

现在我想选择大约在特定点附近约2公里的点。

如何快速完成并减少CPU使用量?

更新

也许我错了表达了我的问题。是否有直接方法使用BETWEEN和直接坐标,如x在47.95和47.94之间,y在13.78和13.76之间(根据我的例子点)

3 个答案:

答案 0 :(得分:2)

您应该更改表格以使用积分

http://dev.mysql.com/doc/refman/5.1/de/point-property-functions.html

借助这些,您可以使用此查询

SELECT *,3956 * 2 * ASIN(SQRT( POWER(SIN((@orig_lat -abs( dest.lat)) * pi()/180 / 2),2) + COS(@orig_lat * pi()/180 ) * COS( abs (dest.lat) *  pi()/180) * POWER(SIN((@orig_lon – dest.lon) *  pi()/180 / 2), 2) )) as distanceFROM TABLE desthaving distance < @distORDER BY distance limit 10

答案 1 :(得分:1)

尝试此查询

SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + COS($lat * PI() / 180)
* COS(lat * PI() / 180) * COS(($lon – lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS `distance` 
FROM `members` 
HAVING `distance`<=’10′ ORDER BY `distance` ASC

答案 2 :(得分:0)

MySQL似乎有spatial extensions,我从未使用过MySql,但如果它们类似于空间扩展SqlServer,那么它们将具备您需要的功能,包括使用快速空间索引。

基于对MySQL文档的快速阅读,将数据存储为points,然后使用MBRContains(g1,g2)函数,添加SPATIAL indexes但我认为只有MyISAM支持空间索引。

Hopefull有一个MySQL函数可以找到最近的pointk,如果没有将所有关闭点都提供给第二个使用trig的查询(根据其他答案)来查找韧带点。