问下研究过 [附近的人] 功能的朋友,你的解决是什么?

两三年前做过类似于微信『附近的人』功能,就是基于地理位置信息算出离你最近的人。当时使用的是 MongoDB 的 $near 方案,在已经存入用户坐标后,使用类似以下代码算出来:

'$near' => [
    '$geometry' => ['type' => 'Point', 'coordinates' => $mylocation],
    '$maxDistance' => 50 * 1000, // unit is meter, 50 公里内
]

当时选择这个方案有几个考虑点:

  1. 速度可接受,100w 数据内少于 0.3 秒;
  2. 实现起来比较简单,只需要加个 MongoDB 然后存储地理位置信息即可查询;
  3. 架构相对简单,只多了个 MongoDB;
  4. 应用使用量不是很大。

对于研究过这个话题的同学,想听听看你们最终使用的方案是什么?为什么选择这个方案?方案的亮点在哪里?

摈弃世俗浮躁,追求技术精湛
本帖已被设为精华帖!
本帖由系统于 6年前 自动加精
Summer
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 12
liyu001989

今天早上还在讨论这个,也准备用mongodb了。

原来看到了 http://www.cocoachina.com/ios/20141118/102... 又看到了 https://github.com/mjaschen/phpgeo

6年前 评论

mysql 就能搞定,
算法的问题用勾股定理
假设中心点的坐标为 (a, b)

select sqrt (ABS((x - a)*(y - b))) as distance
where distance <= 50
order by distance
6年前 评论
lijinma

Summer,我听说过几种方案,但也是只用过 MongoDB

ElasticSearch 多边形搜索,先根据人的坐标确定多边形。
https://www.elastic.co/guide/en/elasticsea...

PostgreSQL+PostGIS 这是一个做 Rails 的人分享的。

百度 api,先把用户的数据信息插入进去,之后使用百度的 api 来查询,这个没用过,也是道听途书。

6年前 评论

没有做过。我所知道的:
MongoDB 2.4 后就加入了 Geo 特性
Redis 3.2 加入了 Geo 特性

6年前 评论
leo

用过ES,专业做搜索,还能配合其他的查询、排序、聚合功能。

6年前 评论

我同学补充的:ElasticSearch 和 PostgreSQL 也支持 Geo 特性

6年前 评论

以前使用的redis的geo,还挺方便的

6年前 评论

使用Redis GEO

6年前 评论
liyu001989

今天早上还在讨论这个,也准备用mongodb了。

原来看到了 http://www.cocoachina.com/ios/20141118/102... 又看到了 https://github.com/mjaschen/phpgeo

6年前 评论

mysql 就能搞定,
算法的问题用勾股定理
假设中心点的坐标为 (a, b)

select sqrt (ABS((x - a)*(y - b))) as distance
where distance <= 50
order by distance
6年前 评论

前几天同事做的【附近的人】也是用的MongoDB
redis里也有geo,但是没用过

6年前 评论

@lijinma PostgreSQL+PostGIS 这种之前也有听到过。

5年前 评论

1、数据库中存 “根据纬经度hash计算值” 的字段 H,并加索引提高查询速度;
2、计算当前用户A “经纬度hash值” H1,根据其值H1 模糊查询 字段H,可得到附近人列表。并根据经纬度计算其距离;
3、将附近人列表加入redis sort set, sort为距离,值为用户id (或者可用array_multisort 来排序);
4、返回list

5年前 评论

印象中几年前国家电网的内网 GIS 系统是用 PostgreSQL 实现。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!