[关闭]
@TedZhou 2024-10-31T06:12:59.000000Z 字数 1212 阅读 27

在地图上展示用户头像,用户太多如何选取?

地图 头像 经纬度坐标


需求

某社交平台要求,把共享了位置的用户头像按经纬度坐标展示到地图上。

  1. 地图可以缩放、平移,用户的可视区也会跟着变化,其内显示的头像及数量都会变化。
  2. 地图放大到最小比例时(比如细到小区、楼栋),要显示所在区域的所有用户。
  3. 显示范围大的时候(比如全国范围),可显示的头像数量会很多,需要有选择的显示且尽可能分布开来。

分析

根据可视区域查询所在区域的用户,这是最基本的处理,满足需求1和2都不是问题。关键要考虑如何处理需求3。

主要思路是:把用户坐标按适当的精度分组,每组选取1个用户代表,即减少了数量,又保证了分散,且不会遗漏有用户的分区。

算法

假设数据库存储了用户的位置坐标P(x,y),地图可视区为V(x1, y1, x2, y2)。

设选取的用户数量限30人左右(20~40)。

  1. 计算可视区大小d := Distance(P(x1,y1),P(x2,y2)); 设精度系数 c := 1000/a;
  2. 设CTE:with u as (select max(id) as id, count(id) as all from user where P in V group by ROUND(p*c))
  3. 查询用户数量:select count(id) as cnt, sum(all) as all from u;
  4. 如果all<=40,则返回全部:select * from user where P in V;
  5. 如果cnt在20~40之间,则返回:select * from user where id in (select id from u);
  6. 调整精度系数 c *= cnt<30 ? 30/(cnt+30) : Math.sqrt(30/(cnt+30)); 回到第2步

优化

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注