2012-03-05 58 views
1

在一个小型Web应用程序上工作时,我有一个用户表,其中存储了用户详细信息以及当前位置的经度和纬度。计算距离 - 即时或一旦数据输入到数据库中?

新用户注册时,他显示了所有用户距他目前所在的距离。

我正在使用haversine公式。

我的问题是如何继续这样做呢? 我该如何在飞行中做到这一点?还是我需要计算用户注册并保存时的所有用户距离?

应该迎合排序:即最短的距离。

回答

1

如果用户数量非常大(或无限),那么您可能会遇到麻烦。

计算此前期可能需要相当多的存储空间。但按需计算可能需要大量的服务器CPU时间。

一些注意事项:

  1. 使用MySQL做地理排序。 http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

  2. 考虑只计算其他用户的一小部分子集的距离。

  3. 考虑使用javascript在客户机上动态计算距离的好处。

+0

你能指点我一些教程或我可以工作的东西。 – Parvesh 2012-03-05 05:36:37

+0

其他人可能不同意,但jQuery可能是使javascript变得轻松的事实标准。 http://docs.jquery.com/Tutorials。使用jQuery,让页面进行异步调用以检索其他用户的共同点,然后计算并显示结果的距离 - 所有在浏览器中完成的处理。 – Synesso 2012-03-05 06:21:30

0

像其他答案一样,你应该使用地理数据库。

如果你想自己实现它,这是这些数据库内部怎么做:

鸿沟地图成大期矩形网格(比如说,10公里X10公里网格)。对于每个用户,添加一个列,告诉他在哪个网格中。而不是搜索所有用户,只需搜索该特定网格和与其相邻的8个网格即可。

1

如果要存储所有用户之间的距离你的用户在注册时,你会发现自己非常快速地存储大量的数据 - 对于100个用户来说,大约有5,000个数据。对于1000个用户,大约500,000(每个用户需要进行相关计算) - 另外,如果用户更改其位置,该数据将立即变得多余,需要重新计算所有用户。再次,很多用户遇到了很大的时间问题。

你可能会更好做这在即时 - MySQL提供了空间扩展,你可以利用优化的基于位置的搜索使用这些扩展(见http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

一个很简单的例子可以被发现在http://maisonbisson.com/blog/post/12147/working-with-spatial-data-in-mysql/ - 更复杂的例子应该允许你返回半径r内的所有点。

其他人提到使用Javascript在客户端计算此值。当然有可能,但是再次考虑如果你有大量的用户,比如说10,000--你必须首先将所有数据传输到客户端(导致HTTP抓取延迟),然后假定它们具有相当强大的功能CPU运行计算(如果有人在旧智能手机上查看您的网站,该怎么办?)。流程运行时,您最终可能会冻结浏览器几秒钟。