产品功能解读:「附近的人」是按什么规则计算的(2)
GeoHash算法将二维的经纬度(x,y)转换成一维信息(字符串),同时解决了隐私问题。 以下图为例,把某个区域划分为 9 个格子, 9 个给格子分别命名为WX4ER,WX4G2、WX4G3 等这样的字符串,每一个字符串是某个格子的代号,用这个代号来代表被划分的子区域。 也就是说,每个格子(子区域)内所有的点(经纬度坐标)都共享相同的GeoHash字符串,大家表示自己的所在位置时,只需要说出该字符代号(比如我们在做自我介绍时说我是广州天河人,“天河”就是广州被划分的其中一个格子),这样既可以保护隐私(只表示大概区域位置而不是具体的点),一维的信息也比较容易计算和做缓存,只要格子划分地越小,距离就越精确。 那GeoHash字符串如何表示自己的精确等级呢? GeoHash字符串越长,表示的范围越精确。如图所示, 5 位的编码能表示 10 平方千米范围的矩形区域,而 6 位编码能表示更精细的区域(约0. 34 平方千米) GeoHash字符串相似的表示距离相近,比如上图中的:
这样可以利用字符串的前缀匹配来查询附近的POI信息(POI信息表示一栋房子、一个商铺、一个邮筒、一个公交站等),在地图程序中找附近的医院、加油站等都有应用。 同样地,我们可以用此方法来圈到同一区域(格子)或者附近区域的人群,再计算大概的距离,而不用把与所有人的距离计算出来,再做排序。 再来回顾一下两种计算方法: (1)只保存了每个人的坐标,要找出某个用户附近的人
(2)保存了用户的坐标+GeoHash字符串,要找出附近的人
很明显, 2 方法要快一些。 GeoHash字符串在位置接近矩形边界时不太准确。 比如红色的点是A用户,绿色的两个点从上到下分别是B用户和C用户,但在圈定人群时会发现距离A较远的C用户的GeoHash编码与A一样(因为在同一个GeoHash区域块上),而较近的B用户的GeoHash编码与A不一样,算起来好像C与A较近。
(编辑:ASP站长网) |