首页 新闻 会员 周边 捐助

请问 遇到这样的频繁计算 问题时,你们是怎么解决的呢?

0
悬赏园豆:20 [已解决问题] 解决于 2015-06-16 20:09

最近有个需求,根据客户所在的位置信息,获取周边X公里以内的商家..

有个商家的地址表,每个商家的经纬度用一条记录来存放.

系统是针对全国使用的,所以商家未来可能很多...

 

在根据客户的位置信息,找出周边X公里以内的商家时,不能直接用客户经纬度的X和Y坐标与商家表里的X,Y坐标做简单的比较...

 

而是要经过一系列相对复杂的函数的计算出每个商家离客户的距离...

这样就带来一个查询数据时比较慢的问题,我目前想到的缓解办法就是在商家位置表里加几个字段,表示是哪个省,哪个市 的,然后根据客户的IP信息查出对应的城市,再用城市字段来筛选出一定的记录来计算...

 

可是这样貌似不太好,请问有什么办法可以解决这个问题呢?主要是计算过程太复杂了,而且对每条记录都要计算一次....请问你们是怎么做的,谢谢了!

hexllo的主页 hexllo | 菜鸟二级 | 园豆:318
提问于:2015-06-15 12:47
< >
分享
最佳答案
0

我有个想法,就是划区,数据存的时候在数据表附加一个区的字段,这样一来,获取客户的经纬度,得到客户所在的区,然后得到得到周围的区,这样周围的商家的信息都得到了,在密集的地方可以划分窄一些,在人烟稀少的地方可以划分少点。。。完全是想法。

收获园豆:10
zeroonec | 初学一级 |园豆:59 | 2015-06-15 16:40

嗯,谢谢,我也这么想的.

hexllo | 园豆:318 (菜鸟二级) | 2015-06-16 20:07

@hexllo: 划区会有边缘问题的.而且无法决定搜索范围

吴瑞祥 | 园豆:29449 (高人七级) | 2015-06-17 09:19

@吴瑞祥: 边缘问题..我打算在新增一个商家时,将默认2公里内的商家末级区码找出来去重后写入一个字段里,逗号分开,当用户找A商家时,也会将存入字段中的附近的商家区域也纳入搜索范围.

 

您说的无法决定搜索范围..具体是指什么情况呢?可以简单举个例子吗?

hexllo | 园豆:318 (菜鸟二级) | 2015-06-17 21:48

@hexllo: 比如有个需求是:用户可以选择查询他附近多少距离内的商家.划区的会很麻烦.

象下面说的用支持空间信息的数据库提供的API我觉得更好

吴瑞祥 | 园豆:29449 (高人七级) | 2015-06-17 21:52

@吴瑞祥: 好的,谢谢指导.

hexllo | 园豆:318 (菜鸟二级) | 2015-06-21 14:59

@hexllo: 后来我才发现这个东西 如果数据量大 

1. 使用聚类算法划出各个区域  视数据量和数据库查询时间等级情况而定

2.使用KMeans找到中心点 区域点数 并编码为geohash 存到数据库新表中

3.查询时使用新表数据 即可快速确定区域和满足条件的商家 

zeroonec | 园豆:59 (初学一级) | 2017-08-08 11:36
其他回答(4)
0

别担心了。没法子的,就是直接算的。

收获园豆:2
吴瑞祥 | 园豆:29449 (高人七级) | 2015-06-15 13:11
0

可以试试缓存。

angelshelter | 园豆:9907 (大侠五级) | 2015-06-15 21:53
0

个人觉得可以试试MongoDB存储,而且MongoDB自带距离api。

收获园豆:3
幻天芒 | 园豆:37205 (高人七级) | 2015-06-15 22:10

这个东西我还没研究..谢谢提供方向.

支持(0) 反对(0) hexllo | 园豆:318 (菜鸟二级) | 2015-06-16 20:08

@hexllo: :)

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2015-06-17 09:48
0

没做过类似的东西。想了想, 跟Nice_cj_com的想法差不多。

1、商户的信息做缓存。存为类似map<坐标点,List<商户信息>>。

将地图等块切分,块的中心点坐标极为map的坐标点key。对应的value是这区域的商家list。

2、根据用户坐标点和要搜索区域的距离。取到缓存map的几个list (最多4个)。

3、然后循环这些list过滤。

===

这样最起码,你循环的东西至少少了一个级数。

根据情况,取一个合适的计量分块 应该也能让循环次数更少。

收获园豆:5
司幸 | 园豆:319 (菜鸟二级) | 2015-06-15 23:13

谢谢耐心回答.

支持(0) 反对(0) hexllo | 园豆:318 (菜鸟二级) | 2015-06-16 20:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册