2

我只是遇到一个问题。我使用 redis 来存储地理信息。例如:

hset 10001 la 41.000333
hset 10001 lo 121.999999

或者

zadd la 41.xxxxx pk-value
zadd lo 121.xxxxx pk-value

大约 40000 个键值,该键用于终端 ID,并设置值,存储终端 gps 信息。我需要计算周围的终端。例如,我的位置是 41.000123、121.999988,我想以最快的速度计算我所在位置周围的终端,我知道如何计算这两个位置的距离。我想要的只是想一种快速迭代所有数据的方法。在 Redis 2.6 中有 lua 支持。它可以帮助解决我的问题吗?

4

2 回答 2

2

您可能想要使用 geohashes,然后您将能够以您想要的任何精度存储(和搜索)经度/纬度,而且获取给定边界框中的点也相对容易。

要使用 redis 实现,请查看geodis

于 2012-05-24T14:08:42.167 回答
1

据我了解您的问题,您想找到接近某个坐标的所有值吗?一种方法是使用 Lua 脚本,另一种方法是为每个近似的纬度/经度存储一个排序集(如果您事先知道所需的粒度)。例子:

zadd la.41 41.000333 pk-value
zadd lo.121 121.999999 pk-value

然后,当您需要找到接近某些坐标的东西(比如说(42.01, 122.03))时,您会执行以下操作:

lat = 42.01
lon = 122.03
lat_min, lat_mid, lat_max = round(lat - 1), round(lat), round(lat + 1)
lon_min, lon_mid, lon_max = round(lon - 1), round(lon), round(lon + 1)

因此,您将查看已排序的集合la.41, la.42, la.43, lo.121, lo.122, lo.123:

zinterstore close.${lat},${lon} 6 la.${lat_min}, la.${lat_mid}, la.${lat_max}, lo.${lon_min}, lo.${lon_mid}, lo.${lon_max}

现在,close.${lat},${lon}应该包含靠近所提供坐标的每个终端的 ID。

显然,您可以以更大的粒度存储每个坐标,例如la.41.0lo.121.0并仅查找关闭的终端。或者,您可以在客户端代码中进一步过滤结果。

于 2012-05-24T11:01:12.863 回答