osmtogtfs是一个从openstreetmap中提取公共交通信息的工具

osmtogtfs的Python项目详细描述


osmtogtfs

Build statuspypi

从OSM数据中提取部分GTF源。

OpenStreeMaps数据包含有关公共汽车、电车、火车和其他公共交通工具的信息。 这些信息不足以提供完整的路由服务,最重要的是因为 它缺乏时间数据。但是,它仍然包含路线、停车位置和一些其他有用的数据。

此工具接受一个osm文件或uri,并感谢osmium库将其转换为部分 gtfs订阅源。gtfs是事实上的标准 共享公共交通信息的工具很多。结果的提要将 如果您检查它,则不验证,因为它当然是部分的。然而,它对我们仍然是有价值的。

安装

这个工具使用osmium,这是一个使用boost构建的c++库,所以应该首先安装它。 最好的方法是使用操作系统的包管理器并安装pyosmium。

然后从pypi安装脚本:

$ pip install osmtogtfs

或者从源代码安装(使用flit):

$ git clone https://github.com/hiposfer/osmtogtfs && cd osmtogtfs
$ flit install

这将在您的系统上安装osmtogtfs包及其cli工具o2g

确保使用Python3运行这些命令。

用法

在OSM数据源(或OSMIum接受的任何数据源)上运行该工具:

$ o2g --help
usage: o2g [-h] [--outdir OUTDIR] [--zipfile] [--dummy] [--loglevel LOGLEVEL]
           [--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
  --outdir OUTDIR      output directory (default: .)
  --zipfile            save to zipfile (default: False)
  --dummy              fill the missing parts with dummy data (default: False)
  --loglevel LOGLEVEL  set the logging level (default: WARNING)
  --version            Show the version and exit

--outdir默认为工作目录,如果提供了--zipfile,则feed将压缩并存储在 具有给定名称的outdir,否则feed将以纯文本形式存储在多个文件中。

网络演示

web文件夹中有一个小的web应用程序。它接受一个osmium支持文件的url。然后它会转换成 到压缩的gtfs提要。

$ cd web
$ pip install bottle osmtogtfs
$ 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/osmtogtfs

然后浏览到http://localhost:3000" rel="nofollow">http://localhost:3000

测试

我们使用pytest包进行测试:

$ pip install pytest (or by running `flit install`)
$ pytest -s

-s禁用捕获并向我们显示更多输出(例如打印语句和日志消息)。

分析

为了分析代码,我们使用cprofile

$ pip install osmtogtfs
0

您将在output/benchmark.txt中找到结果。 这些结果是令人鼓舞的在带有Intel(R)Core(TM)i5-3210M CPU、2.50GHz CPU和16GB RAM的ArchLinux计算机上使用。

虚拟馈送信息

不是所有gtfs必需的数据都可以在osm文件中使用。以便用 一些伪数据使用--dummycli选项。这将生成trips.txtstop_times.txt日历frequencies.txt提要。当然,这些文件将包含虚拟数据。

实施说明

在本节中,我们将介绍实现的重要方面,以帮助理解程序的工作原理。

字段映射

gtfs提要最多可以包含13个扩展名为.txt的不同csv文件。这些文件中有六个是有效的 feed,包括agency.txtstops.txtroutes.txttrips.txtstop\u times.txtcalendar.txt。 每个文件都包含一组通信。有些列是必需的,有些列是可选的。 最重要的是,并不是构建gtfs提要所需的所有字段都在osm数据中可用。 因此,我们必须自己生成一些文件或将其留空。 下面我们将介绍如何生成当前生成的每个文件列的值。

代理.txt

我们使用标记为relation=route的osm关系上的运算符标记来提取代理信息。 但是,有些线路没有操作员标签。在这种情况下,我们使用虚拟代理:

$ pip install osmtogtfs
1
  • 代理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:关系的nameref标记的值
  • route_long_name:关系上的from标记的组合,否则为空
  • 路由类型:我们将OSM路由类型映射到GTF
  • route_url:链接到openstreetmaps.org上的关系
  • route_color:如果存在颜色标记,则该标记的值为空
  • 代理ID:代理的ID,否则为-1

OSM到GTFS路由类型映射

下面是我们使用的映射,左栏是osm值,右栏是 来自gtfs规范的相应值(确保查看代码以了解任何更改):

$ pip install osmtogtfs
2

namedtuples作为首选数据结构

为了减少必要的内存,我们主要使用namedtuples(基本上是元组)来存储数据。

许可证

麻省理工学院< /P>

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java允许具有不同父类的类扩展类,而无需多重继承   java如何创建动态化的JScrollPane w/JPanel作为客户端?   java如何组织和命名包   在Java中读取属性文件   java无法解释的Android意图行为   在Java中动态执行多个BPEL文件的部署   ssl Java 6 SNI(服务器名称指示)?   java我们可以使用Robot框架自动化web和移动应用程序来执行并行执行   java for star pettern的循环   java为什么BinaryReader在线程中,从netty读取错误的数据包?   在java中将华氏度转换为摄氏度   使用Spark和java处理空值和引号编写CSV文件   Java中已排序日期到块的列表   visual studio代码VSCode Java不是linting或自动完成局部变量,而是自动完成Java快捷方式,如“sysout”