Pt:Tutorial:Restrições de Conversão

From OpenStreetMap Wiki
Jump to navigation Jump to search
It has been suggested that this page be translated into English as well as other pages in Category:Translate from Portuguese.

Este é um tutorial longo e não muito simples. Discuta-o (tirando dúvidas e dando sugestões) neste tópico no fórum.

Restrições de conversão são um tipo de relação com efeito no roteamento. Sem elas, um motorista poderia converter de qualquer rua para qualquer outra rua em todos os cruzamentos (exceto se impedido pelo sentido da via ou pelas regras de permissão de acesso).

Ferramentas para edição

A melhor ferramenta para trabalhar com um grade número de restrições é o JOSM com a extensão turnrestrictions. É uma boa ideia aprender a usar os atalhos, que permitem mapear de forma bem mais ágil.

Você pode usar o JOSM em inglês, ou se preferir, a tradução para o português de Portugal está muito bem feita. Para mudar o idioma, vá no menu Edit (Editar) > Preferences (Preferências) > aba Look and Feel (Aparência) > Language (Idioma) e ali troque por português (que é o de Portugal, português (Brasil) ainda precisa de aprimoramentos).

Antes de começar, instale a extensão indo nas preferências do JOSM (menu Editar > Preferências) no 4º ícone da barra vertical à esquerda (com o desenho de uma tomada elétrica e que diz Configurar módulos disponíveis ao passar o mouse) para abrir o painel Módulos. Se for a sua primeira vez passando por essa janela, clique em Descarregar lista. Quando a lista estiver preenchida, marque turnrestrictions, clique em OK e aguarde a instalação. Ao final, o JOSM vai lhe oferecer a opção de reiniciar o programa; aceite para que a extensão seja efetivamente carregada.

Por padrão o JOSM usa as placas de sinalização alemãs. Para não lhe confundir, habilite o estilo visual com placas britânicas (iguais às brasileiras). Para isso, vá nas preferências do JOSM (menu Editar > Preferências), clique no 3º ícone da barra de ferramentas vertical à esquerda (que diz Definições da projeção do mapa e interpretação de dados ao passar o cursor) para abrir o painel Definições de Mapas, e entaõ clique na aba Estilos de Visualização do Mapa. Se a lista Estilos disponíveis estiver vazia, clique no ícone no seu canto inferior esquerdo para preenchê-la, e então escolha British map overlay, clique no botão da seta no meio das duas listas para passar o item selecionado para a lista Estilos ativos, e clique em OK.

Outra possibilidade é mapear restrições com o editor iD. Este editor é mais fácil de entender e roda num navegador em qualquer lugar, sem exigir instalação. Por isso, ele é prático e útil para consertar problemas rapidamente. Mas ele não oferece recursos tão ágeis quanto o JOSM, especialmente para tratar dos casos mais complicados.

IMPORTANTE! EVITE USAR O POTLATCH para essa tarefa, e mesmo para outras. Seu trabalho criando uma relação pode ser parcial ou totalmente desfeito por outro usuário desse editor, sem que ele mesmo saiba que desfez algo.

Fundamentos

Cruzamentos

Você já deve saber fazer algumas coisas básicas no JOSM, como baixar um pedaço do mapa, criar um ponto e uma linha no modo de edição, conectar linhas, e aplicar modelos de etiquetas. Mas mesmo um usuário experiente pode não ter percebido a situação a seguir.

Duas vias estão conectadas no OSM quando têm um ponto compartilhado entre elas. Diferente dos pontos comuns, o JOSM representa esses pontos como um quadrado ligeiramente maior.

Uma situação que pode causar confusão é quando há dois pontos sobrepostos ao invés de um ponto compartilhado. Veja as situações nesta figura:

Tutorial-restricoes-02-cruzamentos.png

Elas representam, da esquerda para a direita:

  1. Duas vias que passam uma pela outra em níveis diferentes (sem ponto na interseção)
  2. Duas vias que se cruzam no mesmo nível (o ponto na interseção é compartilhado pelas duas vias)
  3. Duas vias que não se cruzam, mas têm um ponto sobreposto exatamente na interseção
  4. Algo que você pode fazer para ver se os pontos são compartilhados ou apenas sobrepostos: tentar mover um deles e ver se muda a geometria só de uma linha ou se muda de ambas

Dica: se você achar que há pouca distinção visual, você pode aumentar o tamanho do ponto compartilhado. Para isso, vá nas preferências (menu Editar > Preferências), habilite o modo avançado na base da janela, clique no último botão da barra de ferramentas à esquerda (o de um papel com uma ferramenta e que diz Configurar as preferências no modo avançado ao passar o mouse sobre ele), pesquise pela chave mappaint.node.connection-size e mude o seu valor padrão (5) para um valor maior, tal como 7 ou 9.

Nota: cruzamento é um nome genérico usado quando uma via atravessa outra e continua do outro lado, geralmente formando um desenho em forma de cruz. Interseção (que pode ser um cruzamento, e pode não ser) também inclui os casos em que a via apenas termina em outra via transversal ou oblíqua (exemplo: interseções em T ou em Y). Como veremos, restrições de conversão são aplicáveis a qualquer interseção.

Relações e o seu editor genérico

Vamos revisar alguns conceitos fundamentais.

No OSM, existem pontos e linhas (chamadas primitivas geométricas) e esses objetos podem receber etiquetas para lhes dar significado, nome, e outros atributos.

Algumas (mas não todas) etiquetas, quando colocadas numa linha fechada (onde seus extremos, o primeiro e o último ponto, são o mesmo), podem lhe dar o significado de uma área (um polígono preenchido). Por exemplo, se você colocar natural=water numa linha fechada, estará dizendo que o interior da linha fechada é uma área coberta com água, mas se colocar highway=cycleway, dirá que a linha é o percurso de uma ciclovia (que por acaso forma um ciclo). Você pode aplicar highway=cycleway a uma linha aberta (=não-fechada), mas natural=water não faria sentido.

Uma relação é uma primitiva não geométrica. Isso quer dizer que, sozinha, ela não tem posição, nem forma. Mas ela também tem etiquetas, e o que a faz existir é uma lista de membros, que simplesmente referenciam outros objetos (entre eles pontos, linhas e outras relações). Assim, uma relação é uma espécie de agrupador com significado. São os objetos que têm geometria, e as partes agrupadas pela relação formam juntas uma geometria maior.

Por exemplo, um tipo de relação muito comum é a relação de multipolígono (multi=múltiplas partes), usada para representar polígonos com buracos e polígonos grandes (como o contorno de um país) cuja borda foi quebrada em várias linhas menores e independentes, ao invés de usar uma linha só. A figura a seguir exemplifica um multipolígono simples, ao lado do editor de relações genérico. Para chegar até aqui, desenhe o retângulo, depois o triângulo, selecione-os e vá no menu Modelos de Etiquetas > Relações > Multipolígono.

Tutorial-restricoes-01-relacao-multipoligono.png

Os destaques em verde na janela à direita indicam o seguinte:

  1. O botão para excluir a relação (talvez você precise dele para desfazer algo que não ficou bem feito)
  2. O editor das etiquetas da relação (que expressam o que ela representa)
  3. O conjunto de etiquetas numa tabela editável
  4. O editor da lista de membros (que compõem a relação)
  5. O papel (função) dos membros na relação, que você precisa informar manualmente editando a tabela (na figura já foi preenchido)
  6. O membro que está selecionado no editor

O destaque 7 na esquerda mostra o realce (vermelho e espesso) dado ao membro selecionado, que no caso é um membro com o papel inner. A palavra inner (que você deve preencher no editor) significa que esse membro é o lado interno do multipolígono, ou seja, o lado do buraco. Repare na janela que o outro membro (o retângulo, não-selecionado) tem o papel outer, ou seja, o lado externo.

Multipolígonos podem ter vários membros inner e outer, podem ter vários buracos, e podem agrupar várias porções separadas entre si. Em alguns tipos de relação, a ordem dos membros não importa (como nas restrições), em outros sim (como nas relações de rota). Em alguns tipos, um membro só pode aparecer uma vez, em outros pode aparecer várias vezes. Essas características dependem da definição de cada tipo de relação. Você pode aprender mais sobre os diversos tipos de relação a partir desta página. O restante deste artigo é somente sobre relações de restrição.

Nota: frequentemente usamos os termos e via no OSM como sinônimos de ponto e linha. Nó é algo que faz parte de um grafo de roteamento usado para calcular uma rota. Uma conexão entre dois nós é chamada de arco ou aresta, e um arco é uma via porque representa um caminho transitável. Essa informação (nós e vias) é extraída a partir da geometria (pontos e linhas), mas não são a mesma coisa se estiver seguindo a definição a rigor (não seguimos).

Relações de restrição

Uma relação passa a representar uma restrição quando recebe a etiqueta type=restriction. O tipo de relação então deve ser especificado colocando-se uma etiqueta restriction=*, cujos valores possíveis podem ser divididos em 2 grupos:

  • restrição proibitiva: proíbe somente 1 saída
  • restrição exclusiva: permite somente 1 saída, proibindo todas as outras
    • restriction=only_left_turn: vire à esquerda (e nada mais)
    • restriction=only_right_turn: vire à direita (e nada mais)
    • restriction=only_straight_on: siga em frente (e nada mais)

Ou seja, cada restrição proibitiva expressa que não pode converter (uma restrição para cada saída proibida), e cada exclusiva expressa que só pode continuar por uma via específica. Se você tiver uma restrição exclusiva, não faz sentido ter outras restrições envolvendo a mesma entrada.

Além dessas 2 etiquetas, uma relação de restrição de conversão deve ser composta pelos seguintes membros e papéis:

  • uma e somente uma via de entrada, à qual se atribui o papel from
  • uma e somente uma via de saída, à qual se atribui o papel to
  • uma passagem intermediária, que pode ser:
    • o ponto de interseção das duas vias anteriores, ao qual se atribui o papel via
    • uma ou mais vias, também com o papel via

E além disso, tanto a via de entrada quanto a de saída devem terminar no ponto de passagem. Para isso, você precisa quebrá-las antes de criar a relação.

Erros comuns:

  • esquecer uma das etiquetas
  • adicionar mais de um membro from ou to
  • incluir membros que não se conectam

Curiosidade: desde que você escolha corretamente entre proibitiva e exclusiva, o tipo exato (se é para a esquerda, para a direita ou para trás) não faz diferença pro roteamento. Você pode colocar no_right_turn para proibir uma conversão à esquerda, desde que os membros from e to correspondam corretamente à entrada e à saída. A opção exata só faz diferença para a renderização (o que não é muito comum). É discutível se uma proibição de retorno é algo muito diferente de proibir virar a esquerda ou à direita; afinal de contas, a única diferença prática é o ângulo da curva.

Edição

Uma sugestão para a leitura a seguir é ir repetindo os passos no JOSM para ver se está entendendo bem cada detalhe.

Criação

Para a explicação a seguir, imagine duas vias, X e Y com um ponto compartilhado representando uma interseção em nível. Sem restrições, é possível ir de X para Y livremente, em qualquer sentido.

Precisamos quebrar as vias em torno da interseção antes de adicionar uma restrição. A figura 1 na esquerda mostra X e Y selecionadas (dois pedaços inteiros) e a figura 2 na direita mostra os novos 4 pedaços, X1, X2, Y1 e Y2, com apenas X1 e Y1 selecionados:

Tutorial-restricoes-03-criacao-01-selecao-quebra.png

Para quebrar X e Y:

  • selecione a linha X e o ponto da interseção, depois vá no menu Ferramentas > Dividir Linha, ou simplesmente pressione P
  • repita para Y: selecione-a junto com o ponto da interseção e pressione P

Agora vamos adicionar a restrição. Antes de tudo, selecione a via de entrada (Y1), a via de saída (X1), e o ponto de interseção, nessa ordem. Você pode selecionar múltiplos objetos no JOSM segurando o Shift enquanto vai clicando em cada um deles.

Quando tiver feito isso, repare que os objetos aparecem no painel Seleção (destaque 1) à direita do mapa. Se este painel não estiver visível, habilite-o no menu Painéis. Aproveite para ver se o painel Restrições de Viragem (da extensão turnrestrictions que você instalou no começo) está habilitado também, como mostra o destaque 2 da figura:

Tutorial-restricoes-03-criacao-02-paineis-botoes.png

Clique no botão do destaque 3 para criar uma restrição. Aparecerá esta janela:

Tutorial-restricoes-03-criacao-03-editor-extensao.png

Agora, basta você escolher o tipo de restrição na caixa em destaque na figura anterior. Os demais campos De e Para já estão preenchidos corretamente porque você selecionou as vias na ordem correta antes.

Resumindo a operação:

  1. Quebre as duas linhas no ponto da interseção
  2. Selecione a entrada, a saída, e o ponto de interseção, nessa ordem
  3. Clique no botão de criação no painel Restrições de Viragem
  4. Escolha o tipo de restrição

Dica: sempre que um painel citado aqui estiver faltando no seu JOSM, habilite-o no menu Painéis. Se você acabar com muitos painéis abertos, você pode fechar cada painel que não lhe interessa clicando no pequeno x no canto superior direito do painel.

Dica: na verdade, você não precisa selecionar entrada, interseção e saída, nessa ordem exata. O que importa é que você selecione a entrada antes da saída, o ponto de interseção pode ser selecionado a qualquer momento. A ordem da entrada e da saída só é importante porque é nessa ordem que a extensão preenche os campos De e Para. Se você selecionar em outra ordem, você ainda pode mudar esses campos dentro do próprio editor, mas dá mais trabalho. Se você estivesse criando uma relação qualquer, a ordem com que você seleciona é a ordem que os membros assumem na relação, mas você pode mudar essa ordem depois no editor genérico se preferir. No caso de uma restrição de conversão, a ordem dos membros não importa, importa apenas que cada membro tenha o papel certo.

Visualização e alteração

Agora que a relação foi criada, uma série de coisas acontece nos painéis à direita. Experimente selecionar a via de entrada, Y1:

Tutorial-restricoes-04-visualizacao-paineis.png

Vamos ver uma coisa de cada vez:

  1. Painel das etiquetas de Y1: aqui aparecem as etiquetas de Y1 e as relações compostas por Y1.
  2. Conjunto de etiquetas de Y1 (parte do painel de etiquetas): uma tabela editável. Não contei antes, mas essas linhas amarelas são vias terciárias (highway=tertiary) nesse exemplo. Se quiser saber mais sobre como as estamos usando no Brasil, leia isto mais tarde.
  3. Relações em que Y1 participa (parte do painel de etiquetas): esta parte do painel costuma passar despercebida, mas é extremamente útil para saber se o que você está alterando tem impactos em relações (invisíveis).
  4. Botão para editar a relação selecionada no painel anterior. Daqui você vai direto para o editor de relações genérico apresentado no começo desse tutorial.
  5. Painel da seleção: o mesmo que apareceu na figura anterior a esta. Agora só Y1 está selecionado, então só esse objeto aparece.
  6. Painel de relações (lembre que pode ativá-lo no menu Painéis): aqui aparecem todas as relações presentes no seu mapa atual. Diferente do destaque 2 que são só as relações em que Y1 participa, aqui são todas, mesmo as que não envolvem Y1. Nesse momento, só temos 1 relação, então as duas listas (2 e 6) por coincidência são iguais.
  7. Painel de restrições de conversão (da extensão turnrestrictions): o mesmo de antes. Note que agora aparece a sua restrição de uma forma mais legível do que nos destaques 2 e 6. Outras relações não aparecem aqui, apenas as de restrição.

Clique no botão do destaque 4 para abrir o editor genérico, vamos ver como a extensão criou a essa relação de restrição.

Tutorial-restricoes-05-editor-generico.png

Observe na figura que:

  1. O editor da extensão criou uma relação de restrição (etiqueta type=restriction) de proibição de conversão à esquerda (etiqueta restriction=no_left_turn. Você pode acrescentar outras etiquetas aqui, como note=* e fixme=*. Dica: se tiver curiosidade, a definição completa das relações de restrição inclui algumas outras etiquetas, mas raramente são necessárias.
  2. O editor da extensão preencheu o papel de cada membro da relação na ordem que os objetos foram selecionados.
  3. Um detalhe que costuma passar despercebido: essa coluna indica a conectividade dos membros da relação. Ela diz se o extremo de um membro se conecta ao extremo do membro seguinte. Aqui, Y1 está conectado a X1 pelo mesmo ponto, e por isso essa coluna representa a conexão como uma linha contínua passando por uma bolinha. Dica: experimente mover o membro via para cima usando os controles à esquerda dessa tabela e veja o que acontece com essa coluna. Essa coluna é uma curiosidade aqui, ela é realmente mais interessante em relações com uma longa lista de membros que precisam estar conectados em sequência, tal como relações de rota e relações de multipolígonos.
  4. Aquilo que está selecionado no mapa. Os botões nesta área ajudam você a inserir e remover membros da relação.

Você poderia ter feito tudo isso manualmente usando esse editor genérico. Poderia ter inserido as etiquetas uma por uma, adicionado os membros um por um, e preenchido os seus papéis exatamente desta forma. Mas a extensão fez o trabalho por você, poupando-lhe bastante tempo. Ainda assim, é importante saber como as coisas funcionam "por trás das cortinas" para poder resolver problemas quando eles aparecerem.

Painéis auxiliares

Lembra ainda do painel Relações? Tem umas funções muito úteis lá. Por exemplo, você pode selecionar a sua relação clicando com o botão direito sobre ela ou no botão que diz Selecionar a relação ao passar o mouse sobre ele (o da direita no destaque 2):

Tutorial-restricoes-06-paineis-01-selecao-exclusao.png

Repare que a relação, depois de selecionada, passou a aparecer no painel de seleção (destaque 1) e os seus 3 membros foram realçados em cor magenta. Quando você estiver procurando uma relação específica, você pode simplesmente selecioná-la assim para ver se está trabalhando com a relação certa.

O destaque 2 mostra ainda um botão (o da esquerda) para excluir a relação. Se você tem certeza que está com a relação certa, pode usar esse botão. Senão, pode abrir o editor de relações genérico e, quando tiver certeza (depois de conferir os membros e as etiquetas), pode então o usar o botão de exclusão dentro do próprio editor (apresentado antes).

Esses painéis podem parecer complicados à primeira vista, mas eles são uma grande ajuda em casos mais complicados. Digamos que o seu cruzamento tenha várias proibições, como neste exemplo:

Tutorial-restricoes-06-paineis-02-cenario-complexo.png

Reparou que aparecem só 5 ícones de restrições no mapa, mas que existem 7 relações ao total envolvendo o ponto da interseção (que está selecionado)? Olhe bem para cada linha do painel Restrições de Viragem. Dois ícones estão sobrepondo outros dois. Essa sobreposição exata acontece:

  • nas duas restrições onde X2 é uma entrada
  • nas duas restrições onde Y1 é uma entrada

O JOSM coloca o ícone da restrição do lado direito no final da via de entrada, logo antes da interseção. Nesses dois casos, como a entrada é a mesma, o ícone vai parar na mesma posição. É difícil descobrir essa situação sem usar este painel!

Você não precisa tentar adivinhar o problema a olho desta forma, basta clicar com o botão direito em cada um dos itens dessa lista e escolher a opção Selecionar na camada atual, deixando a relação em destaque como antes, facilitando a sua análise da situação.

Parabéns! Você agora conhece os melhores recursos técnicos para lidar com relações de restrição. Infelizmente, isso só raramente basta. Você ainda precisa decidir quais relações usar em cada caso. Vamos ver alguns casos comuns na próxima seção.

Situações comuns

Vamos usar os seguintes termos nesta seção:

  • Pista duplicada: cada mão da via é mapeada como linhas individuais. Fazemos assim no OSM quando há barreira física (canteiro central, defensa metálica, tachões suficientemente grandes para impedir a passagem de um carro, coisas do tipo) separando os sentidos.
  • Pista simples: não há separação das mãos. É o caso das as vias de mão dupla sem separação física e da maioria das vias de mão única.

Pista simples

Restrições implícitas

Lembra ainda do que diz lá no começo do artigo? Você não precisa inserir restrições quando a via é de mão única (oneway=yes/-1) ou cujo acesso é proibido (access=no/private). Ou seja, você não precisa adicionar restrições para cada placa de proibição que aparece na rua quando essas proibições forem fruto dessas características implícitas. Considere este exemplo:

Tutorial-restricoes-07-exemplo-01-restricoes-implicitas.png

Um motorista vindo por X1 não pode virar para P (inacessível a veículos por padrão), nem para Y2 (particular), nem para Y1 (contramão). A única saída possível e permitida é X2. A situação é análoga para um motorista vindo por Y1. Sem colocar qualquer relação de restrição (ou seja, uma restrição explícita), o roteamento deve acontecer corretamente aqui, desde que o aplicativo roteador respeite as definições do OSM.

Alternativas equivalentes

Você deve se lembrar que os tipos de restrições de conversão se dividem em dois grupos: as proibitivas (cujo valor da etiqueta restriction=* começa com no_ ) e as exclusivas (as que começam com only_ ). Com uma certa frequência, em situações onde há somente 1 saída possível, há 2 formas de mapear as restrições: usando apenas uma restrição exclusiva, ou usando 1 ou mais restrições proibitivas (uma para cada possibilidade proibida). Por exemplo, os casos 1 e 2 a seguir são equivalentes:

Tutorial-restricoes-07-exemplo-02-alternativas.png

Ambos proíbem que o motorista vá de X1 para Y2, permitindo apenas a saída por X2.

O caso 3 vai aparecer mais adiante neste tutorial. Note que há 4 formas equivalentes de mapear as restrições nessa situação, já que cada uma das 2 restrições que aparecem na figura pode ser mapeada de 2 formas diferentes.

  • Equivalentes:
    • Siga em frente de X1 para X2 (como na figura)
    • Proibido virar à esquerda de X1 para Y2 (só resta sair por X2)
  • Equivalentes:
    • Vire à direita de Y1 para X2 (como na figura)
    • Proibido virar à esquerda de Y1 para X1 + proibido seguir em frente de Y1 para Y2 (as possibilidades são proibidas uma por uma, exaustivamente)

Dica: se houver mais de 1 saída possível a partir de uma certa entrada, não tem como usar uma restrição exclusiva envolvendo essa entrada, você vai precisar usar uma ou mais proibitivas. Se só houver 1 saída possível para uma entrada, use sempre uma restrição exclusiva: isso lhe poupa trabalho e poupa esforço de quem está lendo o mapa porque elimina a necessidade de considerar várias combinações de entrada e saída.

Contradições

Certas combinações de restrições explícitas e implícitas não fazem sentido. Nesses casos, o resultado depende do funcionamento da aplicação: se ela somente exclui saídas possíveis ou também pode reincluir algumas saídas (ao processar retrições do tipo only_ ).

Por exemplo, a partir de uma mesma entrada, as seguintes combinações se contradizem e logicamente representam que nenhuma saída é possível:

  • restriction=only_straight_on + restriction=only_right_turn para saídas diferentes: ambas proíbem todas as demais saídas e uma proíbe a saída permitida pela outra, mas dependendo da aplicação pode ser que uma delas acabe permitida
  • restriction=only_right_turn + restriction=no_right_turn para a mesma saída: a segunda restrição proíbe a única saída permitida pela primeira, mas dependendo da aplicação pode ser que essa saída acabe permitida (mas as demais não)
  • restrições implícitas + restriction=no_right_turn na única saída possível

Lembre ainda que, na maioria das aplicações, todo o trecho sem saída possível e de mão única é excluído do roteamento.

Retornos esquecidos

Lembra que é permitido passar de uma via para outra quando não há restrições implícitas nem explícitas, como as que acabamos de criar? Muitos mapeadores esquecem de colocar uma restriction=no_u_turn de X1 para X3 nesse caso:

Tutorial-restricoes-07-exemplo-03-retorno-esquecido.png

Um navegador GPS conclui então que é possível sim fazer esse retorno, já que não há nada proibindo. Essa situação costuma deixar o usuário bastante perplexo, portanto, cuidado pra não esquecer desse caso.

No entanto, note que nem todos os retornos dessa forma são proibidos. Considere caso a caso com calma.

Pista duplicada

De longe, a restrição de conversão mais comum num encontro com uma via de pista duplicada é a restriction=no_left_turn. Essa restrição aparece com bastante frequência nas vias mais movimentadas. Eis um exemplo bastante comum:

Tutorial-restricoes-07-exemplo-04-maos-separadas.png

Repare que a via Y foi quebrada em 3 partes porque há 2 interseções onde foram colocadas restrições e que Y2 é o membro to das duas restrições.

Repare ainda que proibir a conversão de X1 para Y2 também proíbe o retorno de X1 para X4. Então, em vias de pista duplicada, proibir o retorno pode ser expresso combinando uma ligação entre as vias (representando o retorno) e uma proibição de conversão à esquerda.

Linha como intermediário

Imagine que, no exemplo anterior, fosse permitido fazer estes trajetos:

  • Y1 > Y2 > X4
  • X1 > Y2 > Y3

Mas que fosse proibido fazer o retorno, neste trajeto:

  • X1 > Y2 > X4

Usando apenas restrições com um ponto intermediário com o papel via, é impossível representar essa situação: você precisa permitir a combinação Y2 > X4 para ser possível ir de Y1 para X4, mas também precisa proibir a mesma combinação Y2 > X1 para impedir o retorno de X1 para X4.

A solução para isto é usar uma linha com o papel via. Infelizmente, essa situação é nova no OSM e a extensão de restrições de conversão não lhe ajuda, então você vai ter que usar o editor genérico. Não é difícil. Faça o seguinte:

  1. Selecione a entrada, a intermediária e a saída
  2. Vá no menu Modelos de Etiquetas > Relações > Restrição de viragem
  3. Em Restrição, escolha proibido inverter sentido de marcha (a forma portuguesa de dizer proibido fazer o retorno)
  4. Não precisa preencher um nome (ninguém preenche)
  5. Clique em Criar relação
  6. Preencha os papéis dos membros (destaque 1 na figura a seguir)

Tutorial-restricoes-07-exemplo-05-linha-como-intermediario.png

Repare que aqui aquele recurso de ver se os membros estão conectados (destaque 2) é bem mais útil porque todos são linhas consecutivas. O resultado final deve ser algo assim:

Tutorial-restricoes-07-exemplo-06-linha-como-intermediario2.png

Estranho esse ícone né? Parece que você é proibido de voltar para a mesma via. Lembre então: o JOSM coloca o ícone no lado direito, no final da via de entrada. Para descobrir o intermediário e saída da restrição, use plenamente os recursos dos painéis como mostrado antes.

Nota: nenhuma aplicação suporta ainda o caso em que se usam vias como passagem intermediária ao invés de um ponto. Ou seja, elas poderão mandar o usuário fazer o retorno mesmo que esta restrição esteja configurada corretamente. Há divergências na comunidade sobre como tratar disto. Para não prejudicar a difusão do OSM no Brasil, como são poucos os casos, eu acho aceitável um mapeamento temporário sem usar linhas como intermediário, e entre as opções, a comunidade prefere o uso de conexões inventadas (descritas a seguir), desde que se evite sobrepor linhas ou pontos e que a geometria (os ângulos das interseções) seja tão similar quanto possível à realidade. Por enquanto, o OSRM demonstrou interesse em fornecer suporte a essa modalidade da restrição de conversão, e mais recentemente o mkgmap começou a trabalhar no suporte a isso. Existem motivos técnicos para essa demora: isso exige mudanças significativas no algoritmo de roteamento, e por tabela exige que o novo algoritmo seja bem testado. Nada impede que alguém da própria comunidade brasileira se envolva com o desenvolvimento dessas aplicações e implemente essa funcionalidade. Basta que 1 aplicação tenha esse suporte para que a minha opinião coincida com a opinião mais rigorosa de algumas pessoas da comunidade. Você, mapeador novo, deve tomar uma decisão consciente sobre qual forma adotar, e de preferência deve se envolver nas discussões da comunidade para tirar dúvidas sobre esse assunto, verificar se o problema já foi sanado, e quem sabe deixar a sua própria opinião. Se você inventar conexões para resolver este problema, adicione a etiqueta fixme="Conexão inventada, mapear restrição usando linha como intermediário quando suportado em aplicações." (ou algo assim) para que alguém lembre de melhorar essa situação.

Conexões inventadas

Algumas pessoas tentam contornar o problema anterior de roteamento inventando conexões que não existem na realidade. Considere esses casos:

Tutorial-restricoes-07-exemplo-07-evitar-conexoes-inventadas.png

O primeiro resolve o problema anterior (permite X1 > Y3 e Y1 > X4 e proíbe X1 > X4). O segundo resolve a situação contrária: permite fazer o retorno X1 > X4 mas proíbe a esquerda X1 > Y2.

A questão aqui é sobre a existência da via de ligação L. Ela só pode ser mapeada se for uma via segregada das demais por uma barreira física (como um meio-fio ou uma defensa metálica). Se não houver uma separação dessas entre L e Y2, esse mapeamento infringe a semântica da separação das vias. Em algumas situações, isso pode confundir usuários do mapa, sobretudo pedestres (que esperariam encontrar uma separação) e pessoas que usam versões impressas do mapa ao invés de um navegador digital.

Se tal segregação existir, esses mapeamentos são permitidos e melhores do que não mapear a ligação separadamente.

Repare o uso de restrições de proibido fazer o retorno ao invés de proibido virar à esquerda. Como dito antes, para o roteamento só faz diferença escolher corretamente o tipo de restrição (proibitiva ou exclusiva); qualquer opção de mesmo tipo serve. Aqui a escolha exata foi feita considerando a clareza: ao visualizar o mapa (por exemplo no map.comlu), fica mais fácil entender que é o retorno que é proibido, e não a conversão à esquerda. E como fica mais fácil entender, é menor a chance de outro mapeador se confundir ao editar o mapa nesse local.

Existem outras formas de representar a situação da figura 1, mas a forma sugerida é a que torna mais fácil uma futura alteração do mapeamento para o uso de linhas como intermediário. Para adaptar, basta fazer o seguinte:

  1. Remover a proibição de retorno de L para X4
  2. Remover L
  3. Alterar a proibição de retorno de X1 para Y2 da seguinte forma:
    1. Substituir o membro via (que é um ponto) pela linha Y2
    2. Substituir o membro to (que é Y2) por X4

Ao criar conexões assim, lembre de colocar a etiqueta fixme=* como sugerido na seção anterior. Isso permite à comunidade localizar facilmente essas conexões buscando no JOSM pela expressão type:way fixme:Conexão, o que facilita uma futura adaptação.

Exemplos reais (baixe no seu editor e aproxime bastante para enxergar as conexões inventadas):

  • Em Belo Horizonte: 1 2
  • Em Porto Alegre: 1 2 3 4

Esquerda de Michigan

A esquerda de Michigan é um conjunto de 4 proibições de conversão à esquerda bastante frequente no encontro de vias de mãos separadas.

Tutorial-restricoes-07-exemplo-08-esquerda-michigan.png

Não há nada de especial na forma de mapeá-las, basta seguir o mesmo roteiro de antes. A extensão michiganleft pode gerá-las automaticamente, mas quase sempre é mais fácil usar mesmo o painel Restrições de Viragem, já que você só descobre que é uma esquerda de Michigan depois de avaliar cada uma das interseções.

Se vierem exatamente nesta formação, onde cada interseção tem só 2 saídas implicitamente possíveis e 1 é proibida explicitamente, você pode mapeá-las também usando restriction=only_straight_on como já foi discutido.

Curiosidade: este conjunto é famoso na engenharia de tráfego e no planejamento urbano porque aumenta a eficiência do tráfego ao permitir que os semáforos operem com apenas 2 fases ao invés de 3, com alguns benefícios adicionais para os pedestres também. Se você se interessar por esse assunto, há um link no final deste tutorial com uma análise técnica completa da esquerda de Michigan e suas variações, bem como de vários outros tipos de entroncamento em nível e alguns em desnível.

Conversão segregada

Neste exemplo mais complicado há pistas para converter à esquerda separadas por barreira física da via principal:

Tutorial-restricoes-07-exemplo-09-conversao-segregada.png

Algumas vias estão selecionadas para mostrar que o trecho inicial é uma linha inteira, não quebrada.

Lembre que cada uma dessas restrições pode ser mapeada de forma alternativa. Como já foi dito antes, a forma com restrições exclusivas é sempre mais clara para compreender um caso complicado como esse, e quase sempre dá menos trabalho para fazer. Mas você só pode usá-las quando cada interseção só tem 1 saída possível.

Estudo: trevo

Agora vamos para um caso mais desafiador: mapear um trevo (em inglês, cloverleaf). Há dois casos básicos possíveis: com pista simples, e com pista duplicada.

Tutorial-restricoes-08-trevo.png

Na figura 1, X3 foi selecionado para mostrar o trecho em que é uma linha inteira, sem quebras. Y3 é um viaduto (bridge=viaduct) e X3 passa por baixo dele (layer=-1).

Se você analisar cada uma das 8 interseções, verá que todas elas correspondem ao caso da figura 2, que já foi mencionado antes (na seção sobre "alternativas equivalentes"). Por exemplo, repare que:

  • {X2,X3,E4,E2} correspondem a {X1,X2,Y1,Y2} da figura 2, exatamente nessa ordem
  • {X4,X5,D3,D2} também correspondem a {X1,X2,Y1,Y2} da figura 2, na mesma ordem

Repare que os demais casos são só cópias giradas desses dois casos. Verifique isso com cuidado, considerando as entradas e saídas possíveis, e as restrições implícitas (as vias que são de mão única).

É natural imaginar que mapear vias separadas é sempre um trabalho a mais. Nesse caso, não é. Veja a figura 3: por causa das restrições implícitas, nenhuma restrição explícita precisa ser inserida. Verifique isso comparando as combinações de entrada e saída em cada interseção.

Nota: colocar layer=1 em Y3 ao invés de layer=-1 em X3 é matematicamente equivalente e não faz diferença na prática. Na dúvida, adote a opção que exigir o menor número total de etiquetas.

Na prática: trevos de Brasília

Brasília é um lugar excelente para praticar o último exemplo, com vários trevos no Plano Piloto. Os trevos lá são uma combinação do caso com pista simples e do caso com pista duplicada, e ocorrem aos pares. Por exemplo, veja como se pode mapear as restrições deste trevo, usando essencialmente a mesma ideia do exemplo anterior.

Tutorial-restricoes-09-trevo-brasilia.png

Recomendações

Verificando o trabalho

Testar as restrições é bastante recomendável porque é muito comum esquecer de considerar uma combinação de entrada+saída proibida (especialmente retornos).

Para testar, você pode usar o OSRM (atualiza entre 1 e 3 dias depois de editar o mapa). Você também pode visualizar as restrições usando o map.comlu.

As imagens a seguir, obtidas com o OSRM, mostram como as restrições mapeadas no exemplo anterior afetaram o cálculo de rotas no trevo. Algumas combinações de entrada (marcador verde) e saída (marcador vermelho) estavam corretas mesmo sem restrições, as imagens mostram apenas metade sul/oeste das combinações que davam errado (a metade norte/leste é idêntica mas espelhada).

Nota: na 2ª e na 6ª imagem, faltava definir a etiqueta oneway=* nos retornos. Apesar de não serem restrições explícitas, o teste também revela esse tipo de erro.

Tutorial-restricoes-10-trevo-brasilia-teste-roteamento-01.jpg

Os casos a seguir raramente seriam escolhidos em grandes rotas, mas seriam encontrados durante a navegação caso o motorista errasse uma entrada, o que o confundiria ainda mais.

Tutorial-restricoes-10-trevo-brasilia-teste-roteamento-02.jpg

Descobrindo todas as restrições num cruzamento

Todas as restrições têm como elemento fundamental o ponto de passagem. A primeira coisa a ser feita então é olhar para todas as vias que chegam, saem e passam por esse ponto e ter certeza de que estão com as etiquetas oneway=* e access=* definidas corretamente. Daí, para cada entrada possível (para cada via que chega no ponto):

  1. Verificar quais saídas são possíveis/permitidas e quais não são (sem esquecer das saídas que dão meia-volta)
  2. Se apenas uma saída for possível, representar isso com uma única restrição only
  3. Senão, representar cada proibição com uma ou mais restrições no

Alguns dias depois, você pode fazer esse mesmo teste usando uma aplicação de roteamento (que é matematicamente correta) para ter certeza de que não deixou nada escapar. O teste é bem rápido, mais rápido do que fazer o próprio mapeamento das restrições.

Consertando o roteamento numa cidade inteira rapidamente

Eu notei na cidade onde mapeio que:

  • a maioria das restrições em vias com mãos separadas são proibições de virar à esquerda, particularmente porque o padrão da esquerda de Michigan acontece várias vezes
  • vias com mãos separadas geralmente são grandes e importantes, e por isso tendem a ser usas em muitas rotas por muitas pessoas

Então, a primeira coisa a se fazer é verificar todos os cruzamentos das vias principais, especialmente aquelas que forem mapeadas com mãos separadas, procurando especialmente pelos casos em que é proibido converter à esquerda.

O segundo lugar mais comum para se encontrar restrições (especialmente restrições implícitas) é nas vias paralelas às principais e na primeira quadra das transversais saindo da principal.

Outras situações são bem menos comuns e quase nunca ocorrem dentro de áreas residenciais mais afastadas do centro urbano. Nesses casos, o melhor é consertar os problemas aos poucos, conforme vão sendo encontrados. Repare, contudo, que aplicações raramente enviam motoristas por dentro de bairros, quase sempre os mandam pelas avenidas principais mesmo, então esses erros raramente afetarão o usuário comum, em comparação com os erros nas avenidas principais.

Leitura avançada

  • Alternative Intersections/Interchanges (en), da agência americana FHWA (Federal Highway Administration), tratando dos prós e contras de vários tipos de entroncamentos, entre eles o famoso Michigan Left (um dos mais eficientes, seguros e de menor custo de construção)