OpenStreetMap

Foi solicitado à EPTC, por meio do e-mail eptc@eptc.prefpoa.com.br, uma lista com os números dos prefixos lotados em cada um dos pontos fixos de táxis da cidade de Porto Alegre/RS. Em resposta ao e-mail, a EPTC forneceu um arquivo no formato PDF contendo duas colunas. A primeira delas, contem o nome do ponto fixo, a segunda, informa o prefixo do táxi lotado no ponto.

Solicitei à EPTC um arquivo num formato livre, estruturado e legível por máquina. Curiosamente, e em desconformidade com a lei de acesso a informação, respondeu que o formato disponível é em pdf. Diante disso, vou explicar como manipulei esse arquivo em PDF para deixar estruturado da maneira mais conveniente para mim.

Quero um arquivo em formato texto onde cada linha contem informações sobre um ponto fixo da seguinte forma:

nome-do-ponto:quantidade-de-prefixos-no-ponto:prefixo1;prefixo2;prefixo3

Onde o delimitador é :, o primeiro campo é o nome do ponto fixo, o segundo é a quantidade de prefixos no ponto e o terceiro campo são os prefixos lotados no ponto separados pelo delimitador ;. Reparem que a quantidade de prefixos em cada ponto não consta no arquivo original, e será obtida contando, com o awk, os prefixos em cada ponto.

O primeiro passo é converter o arquivo do formato PDF para txt. Utilizei a ferramenta pdftotext disponível no pacote poppler, em um sistema baseado em Arch (uso Parabola GNU Linux-libre) ou no pacote poppler-utils, em um sistema baseado em Debian:

pdftotext PrefixosPorPontos.pdf PrefixosPorPontos.pdf.txt

O resultado é um arquivo com as colunas do arquivo original intercaladas, ora os nomes dos pontos, ora os prefixos. Por isso usamos o sed para separa-las.

Como os prefixos são números de 4 dígitos usamos a expressão regular ^[0-9]\{4\}$ para selecionar as linhas que começam e terminam com numeros de 4 dígitos e o > para grava-las no arquivo PrefixosPorPontos.pdf.txt.prefixos:

sed '/^[0-9]\{4\}$/!d;/^$/d' < PrefixosPorPontos.pdf.txt > PrefixosPorPontos.pdf.txt.prefixos

Como curiosidade, podemos saber quantos prefixos existem em Porto Alegre/RS, usando o wc -l:

wc -l < PrefixosPorPontos.pdf.txt.prefixos

São 2685 táxis lotados em pontos fixos.

Para gerar um arquivo com os nomes dos pontos fixos selecionamos as linhas que NÃO começam e terminam com números de 4 dígitos e removemos as linhas em branco e que começam e terminam com as strings “Prefixo”, “Ponto” e “LISTAGEM DE PONTOS FIXOS E PREFIXOS DE TÁXI”. Salvamos o resultado no arquivo PrefixosPorPontos.pdf.txt.pontos:

sed '/^[0-9]\{4\}$/d;/^$/d;/^Ponto$/d;/^Prefixo$/d;/^LISTAGEM DE PONTOS FIXOS E PREFIXOS DE TÁXI$/d' < PrefixosPorPontos.pdf.txt > PrefixosPorPontos.pdf.txt.pontos

Como curiosidade, podemos saber quantos pontos fixos de táxi existem em Porto Alegre/RS, usando o wc -l combinado com o uniq:

uniq < PrefixosPorPontos.pdf.txt.pontos | wc -l

São 156 pontos fixos.

Com esses dois arquivos usamos o paste para gerar um arquivo de duas colunas delimitadas por ::

paste -d':' PrefixosPorPontos.pdf.txt.pontos PrefixosPorPontos.pdf.txt.prefixos | sort > PrefixosPorPontos.txt

Reparem que foi usado o sort para ordenar o arquivo PrefixosPorPontos.txt, que possui duas colunas, onde cada linha é da seguinte forma:

nome-do-ponto:prefixo

Assim, calculamos, usando o awk, quantos prefixos possuem cada ponto:

awk -F":" '{ a[$1]++; } END { for (i in a) print i, a[i]; }' OFS=: PrefixosPorPontos.txt | sort > PrefixosPorPontos.txt.quantidade

O arquivo PrefixosPorPontos.txt.quantidade possui duas colunas, separadas pelo delimitador :, onde cada linha é da seguinte forma:

nome-do-ponto:quantidade-de-prefixos-no-ponto

Podemos confirmar se o camando anterior contou corretamente, somando todos os valores da segunda coluna do arquivo PrefixosPorPontos.txt.quantidade, usando:

awk -F":" '{ x+=$2 } END { print x }' PrefixosPorPontos.txt.quantidade

ou, usando

cut -d':' -f2 PrefixosPorPontos.txt.quantidade | paste -sd'+' - | bc

O que resulta em 2685.

Agora concatenamos os prefixos de táxi do arquivo PrefixosPorPontos.txt:

awk -F":" '{ a[$1]=a[$1]?a[$1]";"$2:$2; } END { for (i in a) print i, a[i]; }' OFS=: PrefixosPorPontos.txt | sort > PrefixosPorPontos.txt.concatenado

Obtendo o arquivo PrefixosPorPontos.txt.concatenado onde cada linha terá a seguinte estrutura:

nome-do-ponto:prefixo1;prefixo2;prefixo3

Agora usamos o cut para gerarmos uma lista dos prefixos de táxi concatenados:

cut -d":" -f2 PrefixosPorPontos.txt.concatenado > PrefixosPorPontos.txt.concatenado.sem.ponto

Por fim, usamos novamente o paste para gerar um arquivo texto PrefixosPorPontos.txt.quantidade.concatenado estruturado da forma pretendida:

paste -d":" PrefixosPorPontos.txt.quantidade PrefixosPorPontos.txt.concatenado.sem.ponto > PrefixosPorPontos.txt.quantidade.concatenado

Então, temos um arquivo texto com três colunas, separadas por :, onde a primeira contem o nome do ponto fixo de táxis, a segunda tem a quantidade de táxis lotados no ponto, e a terceira, os prefixos dos táxis lotados no ponto separados por ;.

O próximo passo é adicionar a quantidade e os prefixos lotados em cada ponto fixo de táxis da cidade de Porto Alegre/RS usando:

capacity=*

taxi:prefix=*

taxi:colour=red or white

description:payment=A tarifa é calculada assim: tarifa = 5,18 + (2,59 na bandeira I ou 3,36 na bandeira II) x distancia percorrida (km) + 18,31 x tempo parado (h).

Location: Centro Histórico, Porto Alegre, Região Geográfica Imediata de Porto Alegre, Região Metropolitana de Porto Alegre, Região Geográfica Intermediária de Porto Alegre, Rio Grande do Sul, Região Sul, Brasil

Discussion

Log in to leave a comment