【发布时间】:2012-03-22 15:33:14
【问题描述】:
在一个小型 Web 应用程序上工作,我有一个用户表,其中存储了用户详细信息以及他们当前位置的纬度和经度。
一个新用户注册,他会看到所有用户与他当前所在位置的距离。
我正在使用半正弦公式。
我的问题是如何继续执行此操作? 我怎么能在飞行中做到这一点?还是需要在用户注册的时候计算所有的用户距离并保存?
应该满足排序:即最短距离优先。
【问题讨论】:
标签: java mysql google-maps sorting
在一个小型 Web 应用程序上工作,我有一个用户表,其中存储了用户详细信息以及他们当前位置的纬度和经度。
一个新用户注册,他会看到所有用户与他当前所在位置的距离。
我正在使用半正弦公式。
我的问题是如何继续执行此操作? 我怎么能在飞行中做到这一点?还是需要在用户注册的时候计算所有的用户距离并保存?
应该满足排序:即最短距离优先。
【问题讨论】:
标签: java mysql google-maps sorting
如果用户数量非常大(或无限),那么您可能会遇到麻烦。
预先计算可能需要相当多的存储空间。但是按需计算可能需要大量的服务器 CPU 时间。
一些注意事项:
使用 MySQL 进行地理排序。 http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
考虑仅为一小部分其他用户计算距离。
考虑使用 javascript 在客户端计算机上动态计算距离的好处。
【讨论】:
如果您在注册时存储所有用户之间的所有距离,您会发现自己很快就会存储大量数据 - 对于 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(如果有人在旧智能手机上查看您的网站怎么办?)。在进程运行时,您最终可能会冻结他们的浏览器几秒钟。
【讨论】:
就像其他答案所说,您应该使用地理数据库。
如果你想自己实现,这些数据库内部是这样的:
将地图分成大的矩形网格(例如,10 公里 x 10 公里的网格)。为每个用户添加一列,说明他在哪个网格中。您可以搜索该特定网格及其相邻的 8 个网格,而不是搜索所有用户。
【讨论】: