A Especificação Geral sobre Feeds de Transporte Público (GTFS) utiliza dois arquivos diferentes para modelar tarifas:
fare_attributes.txt
: esse arquivo contém um FareAttribute que define uma classe de tarifa. O FareAttribute tem um preço, uma moeda e uma configuração que determina se a tarifa precisa ser comprada a bordo ou antes do embarque. Ele também define o número de baldeações que podem ser feitas com essa tarifa, além do período de validade dela.fare_rules.txt
: esse arquivo contém uma descrição de como os bilhetes são aplicados no sistema de transporte público.
Neste artigo, descrevemos como os dois arquivos funcionam juntos para criar um feed de dados preciso para suas tarifas.
Atributos de tarifa
O arquivo fare_attributes.txt
define alguns aspectos de uma tarifa (como ID, tipo de pagamento etc.). Ele tem a seguinte estrutura:
Este exemplo mostra uma arquivo fare_attributes.txt
simples:
fare_id |
preço |
currency_type |
payment_method |
transfers |
transfer_duration |
---|---|---|---|---|---|
1 | 0,00 | R$ | 0 | 0 | 0 |
2 | 0,50 | R$ | 0 | 0 | 0 |
3 | 1,00 | R$ | 0 | 0 | 0 |
4 | 1,50 | R$ | 0 | 0 | 0 |
5 | 2,00 | R$ | 0 | 0 | 0 |
No arquivo fare_attributes.txt
de cada tarifa, defina atributos como price
, currency_type
e payment_method
. Para permitir ou impedir baldeações com o campo transfers
, escolha os valores: "0" não permite nenhuma baldeação, "1" permite uma, "2" permite duas e assim por diante. Para permitir baldeações ilimitadas, deixe o campo em branco. Defina o período de expiração (em segundos) de uma baldeação no campo transfer_duration
. O sistema calcula a transfer_duration
contando a partir da partida da primeira viagem até a chegada da última viagem (veja o exemplo abaixo).
Importante:
- Para indicar o tempo de validade de uma passagem que vale uma tarifa sem baldeações, defina o parâmetros
transfers
como 0 e determine o tempo de validade (em segundos) com o campotransfer_duration
. - Se você não usar o parâmetro
transfer_duration
para indicar a validade da passagem, recomendamos omitir ou deixar esse campo em branco com o parâmetrotransfers
definido como 0.
Regras de tarifa
O arquivo fare_rules.txt
descreve como as passagens são aplicadas no sistema de transporte público. Ele tem a seguinte estrutura:
O exemplo a seguir mostra um arquivo fare_rules.txt
simples:
fare_id |
route_id |
origin_id |
destination_id |
contains_id |
---|---|---|---|---|
a | TSW | 1 | 1 | |
a | TSE | 1 | 1 | |
a | GRT | 1 | 1 | |
a | GRJ | 1 | 1 | |
b | GRT | 3 | 3 | |
c | GRT | 6 |
O arquivo fare_rules.txt
é compatível com as estruturas tarifárias a seguir.
- A tarifa depende do trajeto usado no itinerário.
- Para associar uma tarifa a um trajeto específico, defina o campo
route_id
. - Se uma tarifa for válida em vários trajetos, especifique uma entrada para cada trajeto no arquivo
fare_rules
.
- Para associar uma tarifa a um trajeto específico, defina o campo
- A tarifa depende das estações ou zonas de origem e destino.
- Para definir regras de tarifa com base na estação ou zona de origem ou destino, use os campos
origin_id
edestination_id
. - Os campos
origin_id
edestination_id
fazem referência às zonas em que as estações de origem e destino estão localizadas. Para fornecer essas informações no arquivostops.txt
, adicione o campozone_id
. - Para definir somente regras com base na estação, defina uma zona para cada estação no arquivo
stops.txt
.
- Para definir regras de tarifa com base na estação ou zona de origem ou destino, use os campos
- A tarifa depende das zonas por onde passa o itinerário.
- Para definir regras de tarifa com base nas zonas onde o itinerário passa, use o campo
contains_id
para definir a zona onde cada tarifa é válida. - O valor
contains_id
se refere a um parâmetrozone_id
definido no arquivostops.txt
.
- Para definir regras de tarifa com base nas zonas onde o itinerário passa, use o campo
A maioria dos sistemas usa uma dessas estruturas tarifárias ou uma combinação delas. As tarifas definidas sem regras são válidas para todos os itinerários que atendem às limitações das baldeações.
Quando várias tarifas são válidas para um itinerário específico, o sistema exibe a opção mais barata para os usuários.
Tarifas para várias agências
Se o feed contém várias agências de transporte público, adicione o campo agency_id
ao arquivo fare_attributes.txt
para cada tarifa. Uma tarifa pode pertencer a apenas uma agência. Se uma tarifa pertence a várias agências, você precisa duplicá-la.
Categorias de tarifas especiais
O Google Maps não exibe categorias de tarifas diferentes (como para adultos, idosos, crianças etc.). Apenas uma tarifa é exibida nos resultados de trajetos. Use a categoria de tarifa padrão.
Exemplos de cenários e como estruturar tarifas
Nas seções a seguir, mostramos exemplos de cenários e como estruturar as tarifas.
Exemplo 1: todas as viagens têm a mesma tarifa com um número ilimitado de baldeações
Digamos que a empresa de transporte público do nosso exemplo tenha a seguinte estrutura tarifária:
- Os passageiros pagam R$ 1,00 no embarque (
price
='1,00',currency
='R$',payment_method
='0'). - A passagem é válida para todos os veículos e não expira (
transfers
=''). - Os passageiros podem fazer viagens com a duração que eles quiserem, porque o valor de
transfer_duration
é omitido.
Como todas as viagens têm a mesma tarifa, a empresa de transporte público do exemplo pode omitir o arquivo fare_rules.txt
.
Arquivo fare_attributes.txt
fare_id |
preço |
currency_type |
payment_method |
transfers |
---|---|---|---|---|
only_fare |
1,00 |
R$ |
0 |
Como calcular uma tarifa para adultos
O planejador de viagem calcula uma tarifa de R$ 1,00 para cada trecho do itinerário que inclui uma mudança de veículo. No entanto, como é permitido um número ilimitado de baldeações, o planejador de viagem exibe somente o menor custo, ou seja, a tarifa inteira de R$ 1,00.
Exemplo 2: todas as viagens têm a mesma tarifa sem baldeações
Digamos que a empresa de transporte público do nosso exemplo tenha a seguinte estrutura tarifária:
- Os passageiros pagam R$ 1,00 no embarque (
price
='1,00',currency
='R$',payment_method
='0'). - Os passageiros podem fazer viagens com a duração que eles quiserem, porque o valor de
transfer_duration
é omitido. - Para fazer qualquer mudança de veículo, é necessário pagar uma nova tarifa (
transfers
='0')
Como todas as viagens têm a mesma tarifa, a empresa de transporte público do exemplo pode omitir o arquivo fare_rules.txt
.
Arquivo fare_attributes.txt
fare_id |
preço |
currency_type |
payment_method |
transfers |
---|---|---|---|---|
only_fare |
1,00 |
R$ |
0 |
0 |
Como calcular uma tarifa para adultos
O planejador de viagem calcula uma tarifa de R$ 1,00 para cada trecho do itinerário que inclui uma mudança de veículo. Assim, um itinerário com uma mudança de ônibus custaria R$ 2,00.
Exemplo 3: todas as viagens têm a mesma tarifa com baldeações permitidas
Digamos que a empresa de transporte público do nosso exemplo tenha a seguinte estrutura tarifária:
- Os passageiros pagam R$ 1,00 no embarque (
price
='1,00',currency
='R$',payment_method
='0'). - São permitidas baldeações ilimitadas em um período de 90 minutos (
transfers
='',transfer_duration
='5.400').
Como todas as viagens têm a mesma tarifa, a empresa de transporte público do exemplo pode omitir o arquivo fare_rules.txt
.
Arquivo fare_attributes.txt
fare_id |
preço |
currency_type |
payment_method |
transfers |
transfer_duration |
---|---|---|---|---|---|
only_fare |
1,00 |
R$ |
0 |
5.400 |
Como calcular uma tarifa para adultos
O planejador de viagem calcula uma tarifa de R$ 1,00 para cada trecho do itinerário que inclui uma mudança de veículo. Em seguida, ele calcula o tempo do itinerário. Se o período do itinerário for inferior a 90 minutos, a tarifa vai custar R$ 1,00.
Exemplo 4: preços diferentes para trajetos locais e expressos
Digamos que a empresa de transporte público do nosso exemplo tenha a seguinte estrutura tarifária:
- Os passageiros pagam R$ 1,75 no embarque dos ônibus locais (trajeto 1).
- Os passageiros pagam R$ 5,00 no embarque dos ônibus expressos (trajetos 2 e 3).
- As baldeações não estão incluídas.
Como algumas viagens custam mais do que outras, a empresa de transporte público do exemplo precisa incluir um arquivo fare_rules.txt
em que todo trajeto deve necessariamente ter uma entrada que o associe a uma tarifa.
Arquivo fare_attributes.txt
fare_id |
preço |
currency_type |
payment_method |
transfers |
---|---|---|---|---|
local_fare |
1,75 |
R$ |
0 |
0 |
express_fare |
5,00 |
R$ |
0 |
0 |
Arquivo fare_rules.txt
fare_id |
route_id |
---|---|
local_fare |
Route_1 |
express_fare |
Route_2 |
express_fare |
Route_3 |
Como calcular uma tarifa para adultos
A tarifa de US$ 5,00 será aplicável somente se você percorrer os trajetos 2 ou 3. A tarifa de US$ 1,75 aplica-se somente ao trajeto 1. Se um itinerário incluir os trajetos 1 e 2, a tarifa será de R$ 6,75.
Exemplo 5: a compra de uma baldeação aumenta a tarifa
Digamos que a empresa de transporte público do nosso exemplo tenha a seguinte estrutura tarifária:
- Os passageiros pagam R$ 1,75 no embarque dos ônibus locais.
- Eles podem pagar R$ 0,25 a mais no embarque para comprar uma baldeação.
- As baldeações compradas são válidas por 90 minutos.
Como essas regras se aplicam a todas as viagens, a empresa de transporte público do exemplo pode omitir o arquivo fare_rules.txt
.
Arquivo fare_attributes.txt
fare_id |
preço |
currency_type |
payment_method |
transfers |
transfer_duration |
---|---|---|---|---|---|
simple_fare |
1,75 |
R$ |
0 |
0 |
|
plustransfer_fare |
2,00 |
R$ |
0 |
5.400 |
Como calcular uma tarifa para adultos
Tecnicamente, as duas tarifas se aplicam a itinerários sem baldeação. No entanto, o planejador de viagem sempre escolhe a tarifa mais barata aplicável:
- Para um itinerário com uma baldeação, o valor
simple_fare
é de US$ 3,50 em comparação com o valor de US$ 2,00 cobrado quando uma baldeação é comprada. Assim, o planejador de viagem informa uma tarifa de R$ 2,00 para todos os itinerários que incluem uma mudança de veículo. - Para um itinerário sem baldeações, a tarifa de R$ 1,75 é inferior ao valor
plustransfer_fare
de R$ 2,00. Dessa maneira, se um itinerário não inclui uma mudança de veículo, a tarifa é de R$ 1,75.
Exemplo 6: a tarifa depende do pareamento das estações, não importando o modo como você chega nelas
Neste exemplo, é importante ter apenas os pontos de entrada e saída do sistema. Para definir a estrutura tarifária do feed, cada estação precisa ter o próprio ID de zona exclusivo definido no arquivo stops.txt
. Cada estação é considerada uma única zona.
- Os arquivos
fare_attributes.txt
efare_rules.txt
definem uma linha para cada par de estações. - No arquivo
fare_attributes.txt
, os camposorigin_id
edestination_id
identificam os pares de estação por código de zona.
Arquivo fare_attributes.txt
fare_id |
preço |
currency_type |
payment_method |
transfers |
---|---|---|---|---|
!S1_to_S2 |
1,75 |
R$ |
0 |
|
!S1_to_S3 |
3,25 |
R$ |
0 |
|
!S1_to_S4 |
4,55 |
R$ |
0 |
|
… |
||||
!S10_to_S1 |
5,65 |
R$ |
0 |
Arquivo fare_rules.txt
fare_id |
origin_id |
destination_id |
---|---|---|
!S1_to_S2 |
S1 |
S2 |
!S1_to_S3 |
S1 |
S3 |
!S1_to_S4 |
S1 |
S4 |
… |
||
!S10_to_S1 |
S10 |
S1 |
Como calcular uma tarifa para adultos
O planejador de viagem calcula um itinerário e percorre as regras de tarifas até encontrar um par de estações com origem/destino correspondentes. O feed do transporte público BART, da região de Bay Area, em São Francisco, ilustra esse tipo de estrutura tarifária no mundo real.
Exemplo 7: a tarifa depende das zonas
Digamos que a empresa de transporte público tenha um sistema com três zonas concêntricas em que as tarifas dependam das zonas percorridas por um passageiro durante um itinerário. Para definir essa estrutura tarifária para o feed, os arquivos fare_attributes.txt
e fare_rules.txt
precisam incluir uma linha para cada combinação de zonas possível. Para estruturas tarifárias muito complexas que percorrem várias zonas, talvez seja mais simples receber a saída do arquivo fare_rules.txt
programaticamente, usando a origem e o destino para definir as tarifas.
Arquivo fare_attributes.txt
fare_id |
preço |
currency_type |
payment_method |
transfers |
---|---|---|---|---|
F1 |
4,15 |
R$ |
0 |
|
F2 |
2,20 |
R$ |
0 |
|
F3 |
2,20 |
R$ |
0 |
|
F4 |
2,95 |
R$ |
0 |
|
F5 |
1,25 |
R$ |
0 |
|
F6 |
1,95 |
R$ |
0 |
|
F7 |
1,95 |
R$ |
0 |
Arquivo fare_rules.txt
fare_id |
contains_id |
---|---|
F1 |
1 |
F1 |
2 |
F1 |
3 |
F2 |
1 |
F2 |
2 |
F3 |
1 |
F3 |
3 |
F4 |
2 |
F4 |
3 |
F5 |
1 |
F6 |
2 |
F7 |
3 |
Como calcular uma tarifa para adultos
Vamos analisar as definições do arquivo fare_rules.txt
com mais detalhes.
- F1 aplica-se às viagens que percorrem as zonas (1,2,3).
- F2 aplica-se às viagens que percorrem as zonas (1,2).
- F3 aplica-se às viagens que percorrem as zonas (1,3).
- F4 aplica-se às viagens que percorrem as zonas (2,3).
- F5 aplica-se às viagens que percorrem somente a zona 1.
- F6 aplica-se às viagens que percorrem somente a zona 2.
- F7 aplica-se às viagens que percorrem somente a zona 3.
O planejador de viagem calcula um itinerário e percorre as regras de tarifas para determinar as tarifas que se aplicam com base nas zonas. Como F1 também inclui uma viagem na zona 1, somente F4 (US$ 2,95) aplica-se a uma viagem da zona 2 à 3. A regra da tarifa aplica-se somente quando o conjunto de zonas percorridas em um itinerário coincide exatamente com o conjunto especificado pela regra da tarifa. Para uma viagem entre as zonas 2 e 3, o planejador de viagem informa R$ 2,95 como a tarifa inteira.
Exemplo 8: influência das baldeações e do valor de transfer_duration
Veja a seguir um exemplo de baldeação:
- A viagem 1 sai às 10h e chega às 11h.
- A viagem 2 sai às 11h15 e chega às 12h.
- Para que a tarifa seja válida em todo o percurso, ela precisa ter pelo menos uma baldeação e uma transfer_duration de no mínimo 2 horas (das 10h às 12h).
Exemplo 9: tarifas e baldeações em bloco
Uma baldeação em bloco combina duas viagens que pertencem a trajetos diferentes e permite que os passageiros permaneçam no mesmo veículo ao passar de um trajeto para outro. Em uma viagem com baldeação em bloco, o sistema seleciona uma tarifa incluindo todos os trajetos envolvidos. As baldeações em bloco não são contabilizadas como baldeações para a estimativa de tarifas.
Veja um exemplo de modelo de uma tarifa de baldeação em bloco:
- Digamos que existam dois trajetos, A e B.
- Qualquer viagem no trajeto A ou B custa US$ 1,00 e qualquer viagem que inclua A e B custa US$ 2,00.
Os valores dos arquivos fare_attributes.txt
e fare_rules.txt
devem ter a seguinte aparência:
Arquivo fare_attributes.txt
fare_id |
preço |
currency_type |
payment_method |
transfers |
transfer_duration |
---|---|---|---|---|---|
fare_A |
1,00 |
R$ |
0 |
0 |
|
fare_B |
1,00 |
R$ |
0 |
0 |
|
fare_AB |
2,00 |
R$ |
0 |
0 |
Arquivo fare_rules.txt
fare_id |
route_id |
origin_id |
destination_id |
contains_id |
|
---|---|---|---|---|---|
fare_A |
route_A |
||||
fare_B |
route_B |
||||
fare_AB |
route_A |
||||
fare_AB |
route_B |