最近有个需求,根据客户所在的位置信息,获取周边X公里以内的商家..
有个商家的地址表,每个商家的经纬度用一条记录来存放.
系统是针对全国使用的,所以商家未来可能很多...
在根据客户的位置信息,找出周边X公里以内的商家时,不能直接用客户经纬度的X和Y坐标与商家表里的X,Y坐标做简单的比较...
而是要经过一系列相对复杂的函数的计算出每个商家离客户的距离...
这样就带来一个查询数据时比较慢的问题,我目前想到的缓解办法就是在商家位置表里加几个字段,表示是哪个省,哪个市 的,然后根据客户的IP信息查出对应的城市,再用城市字段来筛选出一定的记录来计算...
可是这样貌似不太好,请问有什么办法可以解决这个问题呢?主要是计算过程太复杂了,而且对每条记录都要计算一次....请问你们是怎么做的,谢谢了!
我有个想法,就是划区,数据存的时候在数据表附加一个区的字段,这样一来,获取客户的经纬度,得到客户所在的区,然后得到得到周围的区,这样周围的商家的信息都得到了,在密集的地方可以划分窄一些,在人烟稀少的地方可以划分少点。。。完全是想法。
嗯,谢谢,我也这么想的.
@hexllo: 划区会有边缘问题的.而且无法决定搜索范围
@吴瑞祥: 边缘问题..我打算在新增一个商家时,将默认2公里内的商家末级区码找出来去重后写入一个字段里,逗号分开,当用户找A商家时,也会将存入字段中的附近的商家区域也纳入搜索范围.
您说的无法决定搜索范围..具体是指什么情况呢?可以简单举个例子吗?
@hexllo: 比如有个需求是:用户可以选择查询他附近多少距离内的商家.划区的会很麻烦.
象下面说的用支持空间信息的数据库提供的API我觉得更好
@吴瑞祥: 好的,谢谢指导.
@hexllo: 后来我才发现这个东西 如果数据量大
1. 使用聚类算法划出各个区域 视数据量和数据库查询时间等级情况而定
2.使用KMeans找到中心点 区域点数 并编码为geohash 存到数据库新表中
3.查询时使用新表数据 即可快速确定区域和满足条件的商家
别担心了。没法子的,就是直接算的。
可以试试缓存。
个人觉得可以试试MongoDB存储,而且MongoDB自带距离api。
这个东西我还没研究..谢谢提供方向.
@hexllo: :)
没做过类似的东西。想了想, 跟Nice_cj_com的想法差不多。
1、商户的信息做缓存。存为类似map<坐标点,List<商户信息>>。
将地图等块切分,块的中心点坐标极为map的坐标点key。对应的value是这区域的商家list。
2、根据用户坐标点和要搜索区域的距离。取到缓存map的几个list (最多4个)。
3、然后循环这些list过滤。
===
这样最起码,你循环的东西至少少了一个级数。
根据情况,取一个合适的计量分块 应该也能让循环次数更少。
谢谢耐心回答.