例如,我的数据库中有汽车事故。这些事件都有纬度和经度。在使用GPS的手机上,我通过用户的坐标获得他的位置。如果周围有事故,用户可以选择他想知道的半径。比方说,他想知道他周围2英里的事件。
因此,我从手机向Web服务发送用户的纬度、经度和他选择的半径。我需要执行一个SQL查询来获取用户周围2英里处的事件。
你知道怎么做吗?
kupeojn61#
正如其他人所说,计算距离是相当昂贵的。返回庞大的数据集也不是一个非常好的主意--特别是考虑到PHP的性能并不是很好。
我会使用启发式方法,比如用简单的加法和减法来近似距离。
1分钟=1.86公里=1.15英里
只需搜索事件在该范围内的数据库(实际上是一个正方形,而不是一个圆圈),然后您就可以使用PHP处理这些事件。
以英里为单位的近似距离:
sqrt(x * x + y * y) where x = 69.1 * (lat2 - lat1) and y = 53.0 * (lon2 - lon1)
您可以通过添加余弦数学函数来提高此近似距离计算的精度:
改进了以英里为单位的近似距离:
sqrt(x * x + y * y) where x = 69.1 * (lat2 - lat1) and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)
来源:http://www.meridianworlddata.com/Distance-Calculation.asp
编辑2*:我使用随机生成的数据集运行了一系列测试。
3种算法的精度差异很小,特别是在短距离
最慢的算法(具有全部TRIG函数的算法)比其他两个算法慢4倍。
绝对不值得这么做。只需要一个近似值。
代码在此:http://pastebin.org/424186
1条答案
按热度按时间kupeojn61#
正如其他人所说,计算距离是相当昂贵的。返回庞大的数据集也不是一个非常好的主意--特别是考虑到PHP的性能并不是很好。
我会使用启发式方法,比如用简单的加法和减法来近似距离。
1分钟=1.86公里=1.15英里
只需搜索事件在该范围内的数据库(实际上是一个正方形,而不是一个圆圈),然后您就可以使用PHP处理这些事件。
以英里为单位的近似距离:
您可以通过添加余弦数学函数来提高此近似距离计算的精度:
改进了以英里为单位的近似距离:
来源:http://www.meridianworlddata.com/Distance-Calculation.asp
编辑2*:我使用随机生成的数据集运行了一系列测试。
3种算法的精度差异很小,特别是在短距离
最慢的算法(具有全部TRIG函数的算法)比其他两个算法慢4倍。
绝对不值得这么做。只需要一个近似值。
代码在此:http://pastebin.org/424186