Как я могу составить список непосредственно подключенных к остановке соседей с помощью GTFS?

Предположим, что эти 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 B и stop C.

Возможны ли эти SQL-запросы с данными GTFS?


person Slevin    schedule 16.07.2014    source источник


Ответы (1)


Да, хотя в зависимости от вашего приложения производительность может быть не такой, как вы ожидаете.

Следуя вашему примеру, назовем остановку A исходной остановкой, а остановки B и C — соединенными остановками. Затем, чтобы построить множество связанных остановок, мы хотим найти все остановки, которые

  • Поделитесь поездкой с исходной остановкой и

  • В этой совместной поездке их посещают либо непосредственно до, либо сразу после исходной остановки.

Мы можем использовать поле 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 для более красивого вида; если все, что заботит ваше приложение, - это идентификаторы подключенных остановок, вы можете удалить это соединение и изменить первую строку на просто "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);

Но если вы разрабатываете онлайн-приложение, это, вероятно, не лучший вариант. Вам лучше предварительно рассчитать соединения между остановками, используя графическое представление транзитной сети в памяти, а затем запросить это во время выполнения.

person Community    schedule 16.07.2014
comment
Большое спасибо, работает как шарм! stop_sequence сделал свое дело :) Я просто играю и создаю некоторые доказательства концепций, так что это не будет использоваться в реальном онлайн-приложении. - person Slevin; 16.07.2014