我刚遇到一个问题。我使用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,并设置值,存储termianl gps信息。 我需要计算周围的终端。 例如,我的位置是41.000123,121.999988,我想要的 最快的计算我的位置周围的终端,我知道如何 计算两个位置的距离。 我想要的只是想一种快速迭代所有数据的方法。在Redis 2.6中有lua支持。它有助于解决我的问题吗?
答案 0 :(得分:2)
你可能想要使用geohashes,那么你将能够以你想要的任何精度存储(和搜索)lon / lat,而且获得给定边界框中的点也相对容易。
要使用redis实现,请查看geodis。
答案 1 :(得分: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.0
,lo.121.0
,并且只查看关闭的终端。 (可选)您可以在客户端代码中进一步过滤结果。