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