2013-10-08 46 views
1

我想根据到对象的距离从数据库中排序结果。 我的对象和我的数据库项目都有latlng,我可以用haversine计算距离。如何按距离排序数据库结果?

问题是他们需要从数据库中选择距离。我无法拔出整个数据库,进行计算,然后取得我需要的结果,因为... 每当我做到这一点,小猫就会死亡

  • 有人建议把半胱氨酸配方放到order_by。如何 许多小猫会死?

  • 有人提出某种空间插件。他们在做什么?我应该使用哪一个?

  • 另一个看起来很丑陋的选择是,你手动采取一定的距离,并通过排除一切越来越大的东西来做出正方形,即latlng。如果没有足够的结果,或者结果太多,则可以更正距离并再次运行查询。

任何人都可以告诉我什么是最好的方式,我应该与亲的骗局。此外,我正在使用CakePHP的LAMP/MAMP。

+0

你可以发布你的表结构吗?一些样本数据可能? – Maximus2012

+0

提示:查看[geocoding-with-cakephp](http://www.dereuromark.de/2012/06/12/geocoding-with-cakephp/) – mark

回答

0

使用两种:

WHERE table.latitude BETWEEN $latmin AND $latmax 
    AND table.longitude BETWEEN $lonmin AND $lonmax 
ORDER BY haversine(....) 
HAVING haversine(...) < $your_desired_distance 

它仍然是一个重型订单的,但你必须消除任何“明显”超出范围的候选人非常简单/重量轻WHERE过滤器,因此您将在所有可能记录的小(er?)子集上进行实际距离计算。

0

您可以使用quadkey。这是一个使用空间填充曲线的空间索引。这不是一个确切的解决方案,但速度非常快,你可以自由使用半正规公式。你可以下载我的php类hilbert -curve @ phpclasses.org。它也使用墨卡托投影。