问题描述
业务要求:根据APP当前位置,取得距离最近的10条记录,再次刷新时,取得后10条最近的数据。。。我考虑的思路:■思路1:查询出数据库中所有的数据,根据两点的经度和纬度计算得到距离。再按照距离排序。缺点是,如果数据库有100万条数据,每次取出来,效率会很慢。■思路2:SQL查询语句中,取得两点间,经度和纬度差值的绝对值,以从小到大排序,取得前10条即可。这样查出来的数据量就比较小了。正确的思路到底是什么呢,不知道别人的APP距离排序怎么个算法。★Java算法是什么呢??★APP客户端传递的参数1:当前位置所在地址2:当前位置的经度3:当前位置的纬度★数据库中表字段。1:城市名2:地址3:经度4:纬度
解决方案
1. 一看你的描述就知道是暴力的做法, 没有任何搜索方面的经验吧.2. 想要快速, 预先存数据的时候, 就做好预处理, 之后取数据的能过滤掉无关的数据.例如你查询杭州市滨江区星光大道附近的临近的位置, 有必要将北京地区的数据也取出来计算么?目前地理位置搜索, 已经有现成的标准的做法了. 我就不用具体说明了, 你自己google一下.给你提供一个博客的参考: http://blog.csdn.net/a221133/article/details/14525197
解决方案二:
不知道你用的什么数据库,如果数据库支持geometry类型字段(比如SqlServer),那么它会自带一系列的相关空间索引的建立,以及空间运算函数的支持。虽然不能直接解决你的问题,但是可以用如下思路进行:1,根据APP所在点的坐标,计算以它为中心的一个类似圆形的多边形(边的个数根据你的精确度要求改变,最简单是正方形),认为这个多边形范围内的数据是我们需要查询的对象。2,使用geometry的空间函数,查询时候作为where条件代入。具体说的话,就是对象形状的空间坐标落在你计算出的多边形范围内即可。这属于点和面的空间计算,一般的空间函数都是支持的。范围内的数据应该很少了,然后自己计算距离取前10件即可。如果数据库不支持,那么就要你自己动动脑子建立相关的索引用来减少计算次数了。一个思路是,自己定义一套匹配规则,根据已知的坐标信息,可以把所有数据2分一下。然后再次二分。。。。直到分配到一个自己可以接受的数据量范围再行遍历。具体说的话,你可以给每条数据做一个列用来存储这个索引信息。比如你把整体地图先切分成若干个格子(比如1000个),每个格子对应相应的经纬度范围,数据插入的时候可以更新这列的信息。那么将来检索的时候,根据这列就可以过滤出来相当小量的数据,那么再遍历就没有那么慢了。可以把这个思路多层次展开,过滤多次,每次限定更小的范围。。。就看速度要求了。