计算距离 - 即时或数据输入数据库后?

时间:2012-03-05 05:18:18

标签: java mysql google-maps sorting

在一个小型Web应用程序上,我有一个用户表,其中存储了用户详细信息以及当前位置的纬度和经度。

新用户注册时,会显示所有用户与当前用户的距离。

我正在使用半正式公式。

我的问题是如何继续这样做? 我怎么能在飞行中做到这一点?或者,当用户注册并保存时,是否需要计算所有用户距离?

应该满足分类:即最短距离。

3 个答案:

答案 0 :(得分:1)

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

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

一些注意事项:

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

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

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

答案 1 :(得分: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来运行计算(如果有人在旧智能手机上查看您的网站会怎么样?)。在流程运行的过程中,您最终可能会冻结浏览器几秒钟。

答案 2 :(得分:0)

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

如果您想自己实现,这就是这些数据库在内部的实现方式:

将地图划分为大型矩形网格(例如,10km x 10km网格)。对于每个用户,添加一个列,告诉他所在的网格。您可以只搜索特定网格和与其相邻的8个网格,而不是搜索所有用户。