我有一张包含float latitude
和float longitude
的表格(如47.960237,13.796564
)。
现在我想选择大约在特定点附近约2公里的点。
如何快速完成并减少CPU使用量?
更新
也许我错了表达了我的问题。是否有直接方法使用BETWEEN和直接坐标,如x在47.95和47.94之间,y在13.78和13.76之间(根据我的例子点)
答案 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的查询(根据其他答案)来查找韧带点。