使用 redis-py 储存地理位置数据

Redis 3.2 版本的其中一个重要更新就是提供了对地理位置(GEO)数据的支持 ,这一特性允许用户将地理位置信息储存到 Redis 数据库中 ,并对它们执行距离计算、范围查找等操作 。
尽管 Redis 3.2 正式释出已经有一段时间了 ,但是 Redis 最常用的 Python 库 redis-py 却一直没有添加对 GEO 特性的支持 ,这给使用 Python 操作 Redis 的用户们带来了不少麻烦 。
可喜的是 ,今天笔者在逛 github 的时候 ,发现 redis-py 的最新版本已经添加了对 GEO 特性的支持 ,所以今天就让我们一起来看看如何在 redis-py 中处理地理位置数据 。
下载并安装新版 redis-py因为支持 GEO 命令的最新版 redis-py 仍处于开发阶段 ,所以它无法通过 pypi 取得 。为此 ,我们需要从 redis-py 的 github 页面手动克隆最新版本的 redis-py :
$ git clone git@github.com:andymccurdy/redis-py.git在克隆操作执行完毕之后 ,我们进入到 redis-py 文件夹中 ,然后将这个新版本安装到系统中:
$cd redis-py$sudo setup.py install如果你的系统已经安装了其他版本的 redis-py,那么记得在安装新版之前 ,先将旧版本卸载掉 。
在安装操作执行完毕之后 ,我们在解释器中载入 redis-py 库:
>>> from redis import Redis>>> r = Redis()通过对 Redis() 对象的属性进行访问 ,我们可以确认各个 GEO 命令在 redis-py 中都有了相应的方法:
>>> for i in dir(r):...if i.startswith("geo"):...print(i)...geoaddgeodistgeohashgeoposgeoradiusgeoradiusbymember接下来 ,就让我们逐个试试这些方法 。
添加地理位置首先要测试的是 geoadd() 方法 ,这个方法调用的是 Redis 的 GEOADD 命令 ,它的文档如下:
geoadd(self, name, *values) method of redis.client.Redis instanceAdd the specified geospatial items to the specified key identifiedby the ``name`` argument. The Geospatial items are given as orderedmembers of the ``values`` argument, each item or place is formed bthe triad latitude, longitude and name.作为例子 ,以下代码展示了如何使用 geoadd() 方法 ,将清远、广州和佛山这三个城市的坐标添加到 "Guangdong" 这个键里面:
>>> r.geoadd("Guangdong", "113.2099647", "23.593675", "Qingyuan", 113.2278442, 23.1255978, "Guangzhou", 113.106308, 23.0088312, "Foshan")3获取地理位置在将地理位置储存到键里面之后 ,我们就可以使用 GEOPOS 命令去获取已储存的地理位置信息 。在 redis-py 里面 ,GEOPOS 命令可以通过执行 geopos() 方法来调用 ,以下是这一方法的文档:
geopos(self, name, *values) method of redis.client.Redis instanceReturn the postitions of each item of ``values`` as members ofthe specified key identified by the ``name``argument. Each positionis represented by the pairs lat and lon.比如说 ,以下代码就展示了如何使用 geopos() 方法去从 "Guangdong" 键中获取清远和广州的地理位置:
>>> r.geopos("Guangdong", "Qingyuan", "Guangzhou")[(113.20996731519699, 23.593675019671288), (113.22784155607224, 23.125598202060807)]计算两地间的距离对于被储存的两个地理位置 ,我们可以使用 GEODIST 命令去计算它们之间的距离 ,而这个命令在 redis-py 中可以通过同名的 geodist() 方法去调用 ,以下是该方法的文档说明:
geodist(self, name, place1, place2, unit=None) method of redis.client.Redis instanceReturn the distance between ``place1`` and ``place2`` members of the``name`` key.The units must be one o fthe following : m, km mi, ft. By defaultmeters are used.