Создайте псевдонабор данных GTFS из данных AVL (GPS) в формате .CSV.

У меня есть набор данных автоматического определения местоположения транспортного средства (AVL) в формате .csv системы общественного транспорта города. Я хочу использовать этот набор данных AVL для создания набора данных GTFS для проведения анализа доступности. .

Я видел решение о том, как создать набор данных GTFS на основе данных GPS, хранящихся в SQL database (здесь) , но я не нашел решения, когда данные GPS хранятся в формате .csv, как здесь. Я был бы рад получить любую помощь в этом, но я был бы рад, если бы решение пришло либо в R, либо в Python.

У меня уже есть файл stops.txt GTFS, но, думаю, мне нужно будет создать файлы shapes.txt, tips.txt, routes.txt и stop_times.txt.

Вот как выглядит мой набор данных GPS.csv:

             timestamp  order  line      lat      long      speed route_name
1: 2016-02-24 00:04:56 B27084   905    -22.9     -43.3      32.00   12860326
2: 2016-02-24 00:05:07 B41878  2302    -22.9     -43.2       0.19   12860386
3: 2016-02-24 00:04:37 B75563   928    -22.9     -43.2       0.00   12867184
4: 2016-02-24 00:05:17 D86084   852    -23.0     -43.6      24.26   12860043
5: 2016-02-24 00:04:58 C41420          -22.9     -43.2       0.00         NA
6: 2016-02-24 00:04:47 C30084          -23.0     -43.3       0.00         NA

person rafa.pereira    schedule 22.04.2016    source источник
comment
Для этого вам придется написать собственный код. Вы хотите, чтобы псевдо-GTFS представляла обобщенное путешествие (например, в среднем за месяц) или вы хотите, чтобы она представляла, скажем, одну неделю наблюдений? Первое намного сложнее, чем второе.   -  person alphabetasoup    schedule 25.04.2016
comment
Спасибо @RichardLaw, я считаю, что последний вариант был бы более интересным.   -  person rafa.pereira    schedule 25.04.2016


Ответы (1)


Есть пять обязательных файлов: agency.txt, routes.txt, trips.txt, stop_times.txt и stops.txt. Для псевдо-GTFS, которая предназначена только для целей вычислительной доступности, многие необязательные поля в обязательных файлах могут быть опущены, как и все необязательные файлы. Однако вы можете скопировать настоящие или создать их, так как они могут быть полезны для этой цели (например, люди будут учитывать стоимость проезда при выборе способа передвижения, поэтому вы можете использовать fares.txt).

Внимательно прочитайте спецификацию.

агентство

Если допустимо представить, что все маршруты обслуживаются одним и тем же агентством, ваш вариант может быть таким:

agency_id,agency_name,agency_url,agency_timezone,agency_lang,agency_phone
XXX,My Awesome Agency,http://example.com,,,

то есть вам нужны только первые три поля.

agency.txt предназначен для отображения:

Одно или несколько транспортных агентств, предоставляющих данные в этом фиде.

маршруты

Тебе нужно:

  • route_id (первичный ключ)
  • route_short_name
  • route_long_name
  • route_type (должен быть в диапазоне 0–7; указывает режим)

Пример:

route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color
12860326,XXX,12860326,12860326,,3,,
12860386,XXX,12860386,12860386,,3,,
12867184,XXX,12867184,12867184,,3,,

Я не знаю, что делать с маршрутами, которым не назначен маршрут в данных вашего примера. Я также не знаю, что означает order. Возможно, order - это название маршрута? Пока вы можете придумать что-то похожее на идентификатор «маршрута», вы можете его использовать. Для справки, «маршрут» определяется как:

Маршрут — это группа поездок, которые отображаются для пассажиров как единый сервис.

поездки

Поездка – это последовательность из двух или более остановок в определенное время.

Тебе нужно:

  • trip_id (первичный ключ)
  • route_id (внешний ключ)
  • service_id (внешний ключ)

Пример:

route_id,service_id,trip_id,trip_headsign,direction_id,block_id,shape_id
12860326,1,1,,1,,12860326
12860326,1,2,,1,,12860326
12860386,1,1,,1,,12860386
12860386,1,2,,2,,12860386

direction_id, хотя и является необязательным, имеет тенденцию быть довольно полезным, и у меня было несколько приложений, использующих GTFS, требующих его, несмотря на его необязательный статус.

service_id сложно и работает в сочетании с календарными датами. Это позволяет GTFS легко отображать, скажем, «нормальное» обслуживание в будние дни и обслуживание в праздничные дни, когда праздники выпадают на будние дни. Для ваших целей вы, вероятно, можете просто использовать 1 для всего, но это зависит от вашего приложения и когда ваши данные AVL были собраны. Когда я работал над подобным приложением, я поддерживал в своей базе данных справочную таблицу, которая сообщала мне, является ли конкретная дата государственным праздником, и/или школьным праздником, и/или во время университетских семестров, потому что автобусные маршруты менялись в соответствии со студентами. .

shape_id является необязательным, но будет иметь решающее значение, если вы хотите нарисовать свои маршруты на картах или использовать такие инструменты, как OpenTripPlanner.

стоп_время

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

Тебе понадобится:

  • stop_id (первичный ключ)
  • trip_id (внешний ключ)
  • arrival_time
  • departure_time
  • stop_sequence

Это потребует наибольшей работы при написании сценариев. Он будет на несколько порядков больше, чем все остальные файлы вместе взятые.

stop_id и trip_id счастливо относятся к уже определенным остановкам и поездкам. departure_time и arrival_time будут находиться в двух строках данных AVL, и во многих случаях фактическое определение момента прибытия службы на остановку является наиболее сложным аспектом этой задачи. Это проще с доступом к данным смарт-карт пассажиров, и когда услуга фактически останавливается, вы, вероятно, найдете пространственные кластеры записей AVL, поскольку транспортное средство не перемещалось в течение определенного периода времени. Однако, если остановка пуста и никто не хочет выходить, будет трудно определить, когда служба действительно «прибыла» на остановку, особенно потому, что поведение водителя иногда может измениться, если он не намерен делать это. остановка, когда она запланирована (например, ехать быстрее или сокращать путь, если они не видят, что кто-то ждет). В вашем случае значение speed, вероятно, будет полезным, но будьте осторожны, чтобы не спутать остановку для пассажиров с перекрестком.

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

Пример:

trip_id,arrival_time,departure_time,stop_id,stop_sequence,stop_headsign,pickup_type,drop_off_type,shape_dist_traveled
1,00:05:07,00:05:54,22018,1,,1,1,0
1,00:07:16,00:08:01,22557,2,,1,1,39
1,00:10:56,00:10:56,22559,3,,1,1,76

Указание времени пребывания является необязательным, поэтому, если это слишком сложно решить, arrival_time и departure_time действительно могут быть одним и тем же моментом.

На практике pickup_type и drop_off_type очень важны, но, как правило, их невозможно определить только по данным AVL, если только ваш сборщик AVL действительно не подумал о поддержке GTFS в своем архиве... что, к сожалению, очень маловероятно. Вероятно, вам просто нужно всегда разрешать и то, и другое, если у вас нет дополнительной информации, которую вы можете вставить (например, «все поездки по маршруту 1 после остановки 4 в будние дни выпускают только пассажиров по вечерам»).

остановки

  • stop_id (первичный ключ)
  • stop_name
  • stop_lon
  • stop_lat

Вы сказали, что у вас уже есть это, и это здорово. На самом деле проблема заключается в том, чтобы заставить это взаимодействовать с stop_times через внешний ключ stop_id. Данные AVL, с которыми я работал, к счастью, определили, когда услуги были остановлены и на какой остановке они были остановлены, используя тот же код, что и в представлении расписания GTFS.

календарь

Чтобы получить хорошие результаты с помощью таких инструментов, как OpenTripPlanner, вам, вероятно, потребуется включить файл calendar.txt. Это также помогает определить период действия вашей псевдо-GTFS, если вы используете подход моделирования определенного периода времени. Например:

service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date
1,1,1,1,1,1,0,0,20160224,20160226
2,0,0,0,0,0,1,1,20160224,20160226
3,0,0,0,0,0,1,0,20160224,20160226

Это указывает на то, что смоделированный период для этих услуг — с 24 июня 2016 г. по 26 июня 2016 г. Любой запрошенный маршрут за пределами этого диапазона имеет неопределенное время в пути. Я рекомендую вам выбрать период не более недели: больше, и приложения, потребляющие GTFS, начнут бороться с объемом данных. Реальные данные GTFS выигрывают от избыточности, которой не могут дать «псевдоданные».

формы

Не беспокойтесь о shape_dist_traveled, я просто использую для этого фиктивную информацию (монотически возрастающую): ее можно вывести из формы, если только форма не слишком обобщена.

Пример:

shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled
12860386,-22.9,-43.3,1,1
12860386,-22.0,-42.9,2,2

Примечание

Общая идея состоит в том, чтобы использовать имеющиеся данные AVL для выполнения минимальных требований к транзитному каналу, соответствующему спецификации. Вероятно, вам потребуется написать собственные сценарии для создания этих файлов, поскольку для данных AVL не существует стандарта. Вы можете создать некоторую информацию, и вам, вероятно, потребуется: большинство приложений будут вызывать исключения, когда вы попытаетесь использовать неполный канал. Действительно, по моему опыту, довольно много приложений будут иметь проблемы с фидами, которые соответствуют только минимальным требованиям, потому что программа плохая, а большинство реальных данных немного выходят за рамки минимального стандарта.

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

В данном случае я не понимаю различий между вашими полями order, line и route. Вам нужно будет определить, где они лучше всего подходят; Я проигнорировал их, потому что не понимаю, что они представляют. Вам необходимо привести схему AVL в соответствие с концепциями GTFS.

Транзитные системы, как правило, очень сложны с множеством небольших исключений. Вы можете в конечном итоге исключить некоторые особо аномальные случаи.

Ваши значения широты и долготы выглядят не очень точными: если это реальные данные, вы, вероятно, не сможете использовать shapes.txt. Попробуйте запросить более точную информацию о положении автомобиля.

person alphabetasoup    schedule 26.04.2016
comment
это очень подробная инструкция необходимых действий для выполнения задания. Благодарю вас! Данные lat long полны, я просто округлил числа, чтобы представить их здесь. Мне все еще нужно выяснить разницу между полями order, line и route, как вы сказали. Спасибо еще раз. - person rafa.pereira; 26.04.2016