加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

使用Redis和Python构建一个共享单车的应用程序

发布时间:2018-11-26 13:15:14 所属栏目:MySql教程 来源:Tague Griffith
导读:副标题#e# 学习如何使用 Redis 和 Python 构建一个位置感知的应用程序。 我经常出差。但不是一个汽车狂热分子,所以当我有空闲时,我更喜欢在城市中散步或者骑单车。我参观过的许多城市都有共享单车系统,你可以租个单车用几个小时。大多数系统都有一个应用
副标题[/!--empirenews.page--]

/uploads/allimg/c181115/1542221004K10-131F.jpg

学习如何使用 Redis 和 Python 构建一个位置感知的应用程序。

我经常出差。但不是一个汽车狂热分子,所以当我有空闲时,我更喜欢在城市中散步或者骑单车。我参观过的许多城市都有共享单车系统,你可以租个单车用几个小时。大多数系统都有一个应用程序来帮助用户定位和租用他们的单车,但对于像我这样的用户来说,在一个地方可以获得可租赁的城市中所有单车的信息会更有帮助。

为了解决这个问题并且展示开源的强大还有为 Web 应用程序添加位置感知的功能,我组合了可用的公开的共享单车数据、Python 编程语言以及开源的 Redis 内存数据结构服务,用来索引和查询地理空间数据。

由此诞生的共享单车应用程序包含来自很多不同的共享系统的数据,包括纽约市的 Citi Bike 共享单车系统(LCTT 译注:Citi Bike 是纽约市的一个私营公共单车系统。在 2013 年 5 月 27 日正式营运,是美国最大的公共单车系统。Citi Bike 的名称有两层意思。Citi 是计划赞助商花旗银行(CitiBank)的名字。同时,Citi 和英文中“城市(city)”一词的读音相同)。它利用了花旗单车系统提供的 通用共享单车数据流General Bikeshare Feed,并利用其数据演示了一些使用 Redis 地理空间数据索引的功能。 花旗单车数据可按照 花旗单车数据许可协议 提供。

通用共享单车数据流规范

通用共享单车数据流规范General Bikeshare Feed Specification(GBFS)是由 北美共享单车协会 开发的 开放数据规范,旨在使地图程序和运输程序更容易的将共享单车系统添加到对应平台中。 目前世界上有 60 多个不同的共享系统使用该规范。

Feed 流由几个简单的 JSON 数据文件组成,其中包含系统状态的信息。 Feed 流以一个顶级 JSON 文件开头,其引用了子数据流的 URL:

  1. {
  2. "data": {
  3. "en": {
  4. "feeds": [
  5. {
  6. "name": "system_information",
  7. "url": "https://gbfs.citibikenyc.com/gbfs/en/system_information.json"
  8. },
  9. {
  10. "name": "station_information",
  11. "url": "https://gbfs.citibikenyc.com/gbfs/en/station_information.json"
  12. },
  13. . . .
  14. ]
  15. }
  16. },
  17. "last_updated": 1506370010,
  18. "ttl": 10
  19. }

第一步是使用 system_informationstation_information 的数据将共享单车站的信息加载到 Redis 中。

system_information 提供系统 ID,系统 ID 是一个简短编码,可用于为 Redis 键名创建命名空间。 GBFS 规范没有指定系统 ID 的格式,但确保它是全局唯一的。许多共享单车数据流使用诸如“coastbikeshare”,“boisegreenbike” 或者 “topekametro_bikes” 这样的短名称作为系统 ID。其他的使用常见的有地理缩写,例如 NYC 或者 BA,并且使用通用唯一标识符(UUID)。 这个共享单车应用程序使用该标识符作为前缀来为指定系统构造唯一键。

station_information 数据流提供组成整个系统的共享单车站的静态信息。车站由具有多个字段的 JSON 对象表示。车站对象中有几个必填字段,用于提供物理单车站的 ID、名称和位置。还有几个可选字段提供有用的信息,例如最近的十字路口、可接受的付款方式。这是共享单车应用程序这一部分的主要信息来源。

建立数据库

我编写了一个示例应用程序 loadstationdata.py,它模仿后端进程中从外部源加载数据时会发生什么。

查找共享单车站

从 GitHub 上 GBFS 仓库中的 systems.csv 文件开始加载共享单车数据。

仓库中的 systems.csv 文件提供已注册的共享单车系统及可用的 GBFS 数据流的发现 URLdiscovery URL。 这个发现 URL 是处理共享单车信息的起点。

load_station_data 程序获取系统文件中找到的每个发现 URL,并使用它来查找两个子数据流的 URL:系统信息和车站信息。 系统信息提供提供了一条关键信息:系统的唯一 ID。 (注意:系统 ID 也在 systems.csv 文件中提供,但文件中的某些标识符与数据流中的标识符不匹配,因此我总是从数据流中获取标识符。)系统上的详细信息,比如共享单车 URL、电话号码和电子邮件, 可以在程序的后续版本中添加,因此使用 ${system_id}:system_info 这个键名将数据存储在 Redis 中。

载入车站数据

车站信息提供系统中每个车站的数据,包括该系统的位置。load_station_data 程序遍历车站数据流中的每个车站,并使用 ${system_id}:station:${station_id} 形式的键名将每个车站的数据存储到 Redis 中。 使用 GEOADD 命令将每个车站的位置添加到共享单车的地理空间索引中。

更新数据

在后续运行中,我不希望代码从 Redis 中删除所有 Feed 数据并将其重新加载到空的 Redis 数据库中,因此我仔细考虑了如何处理数据的原地更新。

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读