0

假设这些 statemates 包含在 GTFS 数据中:

1. stop A is connected with stop B and stop C
2. stop B is connected with stop D and stop E
3. stop C is connected with Stop F and stop G

现在我想查询与停靠点 A 直接相连的所有停靠点。结果应该是stop Band stop C

GTFS 数据可以进行这些 SQL 查询吗?

4

1 回答 1

1

是的,尽管取决于您的应用程序,性能可能不是您所期望的。

按照您的示例,我们将 stop A 称为origin stop,将 stops B 和 C 称为连接的 stop 。然后建立一组连接的停靠点,我们想要找到所有停靠点

  • 与始发站共享行程,以及

  • 在该共享行程中,在始发站之前或之后立即访问。

我们可以使用表格的stop_sequence字段stop_times来测试第二个条件。试试这个 SQL:

SELECT DISTINCT stops.id, stops.code, stops.name
  FROM stop_times AS origin_stop
  INNER JOIN stop_times AS connected_stops
    ON connected_stops.trip_id = origin_stop.trip_id
      AND ABS(connected_stops.stop_sequence - origin_stop.stop_sequence) = 1
  INNER JOIN stops
    ON stops.id = connected_stops.stop_id
  WHERE origin_stop.stop_id = <origin stop ID>;

这加入了stops表格以获得更漂亮的视图;如果您的应用程序关心的是连接站点的 ID,您可以删除该连接并将第一行更改为简单的“ SELECT DISTINCT connected_stops.stop_id”。

为了使性能可以接受,您需要在stop_times.stop_id和上创建索引stop_times.trip_id

CREATE INDEX stop_times_stop_id_index ON stop_times(stop_id);

CREATE INDEX stop_times_trip_id_index ON stop_times(trip_id);

但是如果你正在开发一个在线应用程序,这可能不是要走的路。您最好使用内存中交通网络的图形表示预先计算停靠点之间的连接,然后在运行时查询它。

于 2014-07-16T15:04:23.200 回答