从openstreetmap中提取gtfs提要的简单工具。

o2g的Python项目详细描述


O2G

构建状态pypi

从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

您可以在resources/out/benchmark.txt中找到结果。 这些结果是在一台ArchLinux计算机上产生的,该计算机采用Intel(R)Core(TM)i5-3210M CPU,CPU为2.50GHz,内存为16GB。

虚拟馈送信息

不是所有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 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:关系的nameref标记的值
  • 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>

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

推荐PyPI第三方库


热门话题
javajaxb在嵌套节点中生成xmlns:xsi声明   java重定向到youtube以上传jsp上可用的视频   java提高了JVM和ANT的性能   java如何将返回的JSON数据放在HTML表单中   java如何发送XWWWFORMURLENCODE在重新授权   java为什么jvm XX:+EliminateAllocations失败   堆移除和重建方法?(爪哇)   Stanford NPL in Spark(Scala)应用程序运行到Java堆空间(Java.lang.OutOfMemoryError)   调试java中打开/关闭println的任何方式(详细模式)   java IntelliJ在鼠标悬停时显示JavaDocs工具提示   Olingo Odata Java中的自动扩展选项   json将postgres文本arry转换为java列表?   oop需要帮助推断Java代码   复选框的java添加操作侦听器AbstractTableModel   java如何从公共静态void main(String[]args)传递值   java从数据库中获取大值   java Processing 2.0电影从jar运行时无法打开电影文件   java如何在不使用应用程序的情况下刷新活动?   尝试将JSON解析为ListView时的Android:JSON parse:null对象引用