从openstreetmap中提取gtfs提要的简单工具。
o2g的Python项目详细描述
O2G
从openstreetmap中提取gtfs提要的简单工具。
OpenStreeMaps数据包含有关公共汽车、电车、火车和其他公共交通工具的信息。 这些信息不足以提供完整的路由服务,最重要的是因为 它缺乏时间数据。但是,它仍然包含路线、停车位置和一些其他有用的数据。
此工具接受一个osm文件或uri,并感谢osmium库将其转换为部分 gtfs订阅源。gtfs是事实上的标准 共享公共交通信息的工具很多。结果的提要将 如果您检查它,则不验证,因为它当然是部分的。然而,它对我们仍然是有价值的。
安装
这个工具使用osmium,这是一个使用boost构建的c++库,所以应该首先安装它。 最好的方法是使用操作系统的包管理器并安装pyosmium。
然后从pypi安装脚本:
$ pip install o2g
或者从源代码安装(使用flit):
$ git clone https://github.com/hiposfer/o2g && cd o2g
$ flit install
这将在您的系统上安装o2g
包及其cli工具o2g
。
确保使用Python3运行这些命令。
用法
在OSM数据源(或OSMIum接受的任何数据源)上运行该工具:
$ o2g --help
usage: o2g [-h] [--area AREA] [--bbox BBOX] [--outdir OUTDIR]
[--zipfile ZIPFILE] [--dummy]
[--loglevel {DEBUG,INFO,WARNING,ERROR,CRITICAL}] [--version]
[OSMFILE]
Export GTFS feed from OpenStreetMap data.
positional arguments:
OSMFILE an OSM data file supported by osmium
optional arguments:
-h, --help show this help message and exit
--area AREA an OSM area name, e.g. Freiburg (default: None)
--bbox BBOX a boundary box, e.g. 47.9485,7.7066,48.1161,8.0049
(default: None)
--outdir OUTDIR output directory (default: .)
--zipfile ZIPFILE save to zipfile (default: None)
--dummy fill the missing parts with dummy data (default:
False)
--loglevel {DEBUG,INFO,WARNING,ERROR,CRITICAL}
the logging level (default: WARNING)
--version show the version and exit
--outdir
默认为工作目录,如果提供了--zipfile
,则feed将压缩并存储在
具有给定名称的outdir,否则feed将以纯文本形式存储在多个文件中。
区域和边界框
用户可以将区域名或bbox传递给o2g
并下载必要的数据
从立交桥API开始。区域应该是OSM区域名,并且
BBOX应为OSM边界框,包括南、西、北、东和
逗号。例子:
$ o2g --area Freiburg
$ o2g --bbox 47.9485,7.7066,48.1161,8.0049
$ o2g --area Freiburg --bbox 47.9485,7.7066,48.1161,8.0049
网络演示
在web
文件夹中有一个小的web应用程序。它接受一个osmium支持文件的url。然后它会转换成
到压缩的gtfs提要。
$ cd web
$ pip install bottle o2g
$ python app.py
之后浏览到http://localhost:3000http://localhost:3000。 或者运行flit install--extras web将安装web依赖项。
此Web应用程序也运行在http://o2g.hiposfer.comhttp://o2g.hiposfer.com。也可以直接下载给定osm url的压缩gtfs提要:
$ wget 'http://o2g.hiposfer.com/o2g?url=http://download.geofabrik.de/europe/liechtenstein-latest.osm.bz2' -O gtfs.zip
带立交桥查询的Web API
也可以从overpass-api.de下载必要的OSM数据。向Web API传递区域名或BBox将触发此功能:
$ wget 'http://o2g.hiposfer.com/o2g?area=Freiburg&bbox=47.9485,7.7066,48.1161,8.0049' -O gtfs.zip
与以前一样,通过传递伪标志可以获得修补的有效gtfs提要:
$ wget 'http://o2g.hiposfer.com/o2g?area=Freiburg&dummy=True -O gtfs.zip
带Docker
如果您的包管理器中没有锇,手动安装可能会很麻烦。所以这里 是可以直接使用的Docker图像:
$ docker run -it -p 3000:3000 hiposfer/o2g
然后浏览到http://localhost:3000" rel="nofollow">http://localhost:3000
测试
我们使用pytest
包进行测试:
$ pip install o2g
0
-s
禁用捕获并向我们显示更多输出(例如打印语句和日志消息)。
分析
为了分析代码,我们使用cprofile
:
$ pip install o2g
1
虚拟馈送信息
不是所有gtfs必需的数据都可以在osm文件中使用。以便用
一些伪数据使用--dummy
cli选项。这将生成trips.txt
,stop_times.txt
,日历
和frequencies.txt
提要。当然,这些文件将包含虚拟数据。
实施说明
在本节中,我们将介绍实现的重要方面,以帮助理解程序的工作原理。
字段映射
gtfs提要最多可以包含13个扩展名为.txt
的不同csv文件。这些文件中有六个是有效的
feed,包括agency.txt,stops.txt,routes.txt,trips.txt,stop\u times.txt和calendar.txt。
每个文件都包含一组通信。有些列是必需的,有些列是可选的。
最重要的是,并不是构建gtfs提要所需的所有字段都在osm数据中可用。
因此,我们必须自己生成一些文件或将其留空。
下面我们将介绍如何生成当前生成的每个文件列的值。
代理.txt
我们使用标记为relation=route
的osm关系上的运算符标记来提取代理信息。
但是,有些线路没有操作员标签。在这种情况下,我们使用虚拟代理:
$ pip install o2g
2
- 代理ID:我们使用运算符值生成代理ID:
代理ID=int(hashlib.sha256(op_name.encode('utf-8')).hexdigest(),16)%10**8
- 机构名称:运算符的值标记
- 代理时区:我们根据关系中元素的坐标进行猜测
停止.txt
- stop_id:osm中节点id的值
- stop_name:name的值标记或未知的值
- 停止时间:节点的长度
- 停止位置:节点的相对位置
routes.txt
- route_id:osm relation元素的id
- route_short_name:关系的name或ref标记的值
- route_long_name:关系上的from和到标记的组合,否则为空
- 路由类型:我们将OSM路由类型映射到GTF
- route_url:链接到openstreetmaps.org上的关系
- route_color:如果存在颜色标记,则该标记的值为空
- 代理ID:代理的ID,否则为-1
OSM到GTFS路由类型映射
下面是我们使用的映射,左栏是osm值,右栏是 来自gtfs规范的相应值(确保查看代码以了解任何更改):
$ pip install o2g
3
namedtuples作为首选数据结构
为了减少必要的内存,我们主要使用namedtuples(基本上是元组)来存储数据。
许可证
麻省理工学院< /P>