Redis 中的 Geohash 与 php

Posted

技术标签:

【中文标题】Redis 中的 Geohash 与 php【英文标题】:Geohash in redis with php 【发布时间】:2012-08-14 10:02:32 【问题描述】:

我正在将 Redis 与 php 及其库 phpredis 一起使用。

我有以下结构:

city:1 
 lat->14.02,
 lon->10.00,
 hash->sp2f1h60w5j


city:2 
 lat->14.03,
 lon->10.1,
 hash->sp2f1h60w5m

但我还没有找到一种通过哈希进行搜索的方法。我想搜索例如完全相同的哈希或大致相同的哈希。 我应该改变我的结构吗?

谢谢。

【问题讨论】:

【参考方案1】:

您可以按照 Josiah Carlson 的建议 from this thread,将哈希转换为数字,并将其用作排序集中的分数。像这样的:

city:1 
 lat->14.02,
 lon->10.00,
 hash->sp2f1h60w5j


city:2 
 lat->14.03,
 lon->10.1,
 hash->sp2f1h60w5m

要将 geohashes 用作数字,您需要使用特定的字符映射从 base 32 解码它们——请参阅Geohash on Wikipedia。我将在下面使用示例数字。

cities  (1, 4711), (2, 4712) 

现在您可以使用zrangebyscore 查找某个区域内的城市:

zrangebyscore cities 4000 5000

【讨论】:

你也可以看看github.com/doat/geodis包是怎么做的。【参考方案2】:

为什么不使用redis中的key来获取元素。

喜欢:

城市-sp2f1h60w5j = 1

城市-sp2f1h60w5m = 2

如果你想要壁橱: 通过“钥匙”获得: 城市-sp2f1h60w* 如果将返回键的“数组”......或城市ID。不记得确切的返回数据。

干杯

【讨论】:

【参考方案3】:

您想查找特定点附近的所有项目吗?由于您正在寻找完全匹配或近似匹配,我认为是这样。 Redis 昨天刚刚发布了全新的地理功能 (http://redis.io/commands#geo)。

GeoRadius 和 GeoRadiusByMember 是您正在寻找的。​​p>

【讨论】:

以上是关于Redis 中的 Geohash 与 php的主要内容,如果未能解决你的问题,请参考以下文章

检查一个 geohash 是不是与另一个 geohash 相交

Redis新特性GEOHASH

10.Redis系列Redis的高级应用-GeoHash

Redis——GeoHash查找附近的人

Elasticsearch:理解 Elastic Maps 中的 geohash 及其聚合

Elasticsearch:理解 Elastic Maps 中的 geohash 及其聚合