Sim*_*ian 22 geospatial geo redis geohashing
我想实现一项服务,根据用户的地理坐标,可以检测两个用户是否实时位于同一位置.
为了实时和扩展,我似乎应该使用像Redis这样的分布式内存数据存储.我已经研究过使用geohashing,但问题是彼此接近的点可能并不总是共享相同的哈希前缀.因为我有兴趣找到两个用户是否足够接近他们彼此相邻的位置,所以geohashing可能有点过分.
当然,简单的解决方案就是测试地理坐标对是否落在彼此的小距离内.但AFAIK,Redis和其他内存数据采集器没有地理空间索引来支持这种查找.
实现这个的最佳方法是什么?
Arj*_*hta 17
此功能已融入Redis 3.2+.
但对于旧版本,问题仍然存在.我接受了Yin Qiwen的回答并为Node创建了一个模块,你可以通过检查代码来看看它是如何使用Redis的.他的指示是完美的,我能够跟随他们取得好成绩. https://github.com/arjunmehta/node-georedis
相同的算法本质上是用于本机命令的算法.
它非常快,并且避免任何类型的交叉/半字形操作.关于Yin Qiwen的方法最酷的事情(我认为)是算法中计算量最大的部分可以分发给客户端(而不是发生在DB或服务器上).
它并非100%精确,并且使用预先配置的距离步长,但对于大多数应用,您不需要我想象的精确度.
我还在GIS堆栈交换中解释了尹启文的文章.
对不起所有的链接.:P
yin*_*wen 15
通常,这可以通过GeoHash和Redis的排序集来完成.在讨论如何在redis上实现空间索引服务之前,我写了一个设计.
https://github.com/yinqiwen/ardb/wiki/Spatial-Index
我意识到这不能回答你的问题...但我认为这不是正确的工具.
PostgreSQL + PostGIS可以表现得非常好.您可以将PostgreSQL配置为运行尽可能多的数据库,因为它可以适合内存.
PostGIS使用(我认为)rtree索引,因此执行您感兴趣的查找速度非常快.
使用触发websocket请求的后端将允许您执行非常实时的操作.您的后端随时收到GPS坐标; 执行空间查找; 并通过websockets通知适用的客户.