OpenStreetMap

oesleiribas's Diary

Recent diary entries

No mkgmap existem duas funções que podem ser usadas para deletar elementos ou atributos. Quando isso é necessário? Bom, imagine que você está compilando um mapa rodoviário e então percebe que as linhas de energia estão aparecendo no mapa e deixando você confuso, já que elas podem ser confundidas com vias, nesse caso o que você pode fazer é deletar esses elementos evitando que elas apareçam no mapa gerado. Outra situação, você percebeu que no mapa existem muitos POIs sem nome, se você quiser você pode deletar esses elementos também. Outro caso você pode deletar apenas uma tag, por exemplo a tag “postal_code” (CEP), você pode decidir que ela não é útil para você, então pode deletar esse atributo.

Além dos elementos ou atributos não “aparecerem” no mapa gerado evitando possíveis confusões, você tem a vantagem que o mapa gerado será menor. Para fazer isso basta você usar o mkgmap usando um “Style File” e colocar nesses arquivos os comandos de deleção.

Abaixo um exemplo de como deletar todas as linhas de energia do mapa do OSM

power=line {deletealltags}

power=tower {deletealltags}

No caso dos mapas do OSM para uso rodoviário eu recomendo que sejam deletadas essas linhas de energia. O motivo é que essas linhas após a geração do mapa ficam muito parecidas com as vias, o que acaba deixando os motoristas confusos ao navegar no mapa. Outra opção seria formatar essas linhas com uma cor ou forma que não causasse confusão, porém como não vejo muita utilidades delas nos mapas rodoviários eu prefiro deletá-las.

Outro possibilidade que o o mkgmap permite é a deleção de apenas um atributo. Por exemplo, caso você deseje apenas deletar o atributo postal_code (CEP) das vias você poderia usar o comando abaixo

highway=* & postal_code=* {delete postal_code}

Referências: Manual Style

Nesse post vamos falar sobre como adicionar label2 e pesquisa por CEP nos mapas gerados pelo mkgmap. Primeiramente o que é label? O label é o nome do objeto (Via, POI, etc), no OSM existe a tag “name” que dá nome aos objetos, por padrão do mkgmap o conteúdo dessa tag é usado para nomear os objetos, sendo que o label1 será preenchido com o valor dessa tag.

Com o mkgmap cada objeto (nome de uma rua, um estabelecimento comercial, etc) pode possuir até 4 nomes, ou seja, cada objeto pode possuir 4 labels. Mas quando isso (mais de um nome para um objeto) é necessário? Imagine que uma rua tenha o nome oficial de “Rua Mario Zanin”, porém seja popularmente conhecida como “Rua das Torres”. Nesse caso você pode atribuir cada um desses nomes ao mesmo objeto, ou seja, a mesma rua pode ter mais de um nome e assim ser encontrada por suas diferentes representações.

Outro exemplo: a rua chama-se “Rua XV de Novembro”, porém o usuário procura no GPS por “Rua 15 de novembro”. Nesse exemplo o GPS não vai encontrar a rua pois ele não sabe que semanticamente os dois nomes referem-se ao mesmo local. Para resolver esse problema pode-se atribuir as duas formas a mesma via, nesse caso podemos até mesmo atribuir três formas. Ficaria algo como:

Label1: Rua XV de Novembro

Label2: Rua 15 de Novembro

Label3: Rua Quinze de Novembro

Legal, mas como eu disse com o mkgmap posso colocar até 4 labels, então o que eu posso fazer com o último label? Uma ideia é adicionar o CEP como conteúdo do último label. Assim eu posso encontrar a via pelo nome e suas variações e também pelo CEP dela! Isso já funciona em alguns mapas comerciais.

Imgur

Imgur

Para fazer isso basta usar o mkgmap e alguns “Style File”. Não recomendo que você fazer um “Style File” do zero se você nunca fez isso, eu recomendo que você pegue um já pronto e apenas modifique com o que você necessita. Aqui tem um exemplo de “Style File” padrão que pode usar usado. Salve todos os arquivos em um diretório da sua máquina. Em seguida abra o arquivo “lines” e adicione no topo do arquivo as seguintes linhas:

highway=* {set mkgmap:label:2=’${alt_name}’}

### highway=* {set mkgmap:label:3=’${loc_name}’ | ‘${official_name}’ | ‘${nat_name}’ | ‘${reg_name}’ | ‘${int_name}’ | ‘${old_name}’ | ‘${short_name}’} ### highway=* {set mkgmap:label:4=’${postal_code}’}

Nesse caso o label2 será setado com o conteúdo da tag “alt_name”. O label3 será setado com o conteúdo de algumas das tags da lista que segue após o sinal de igual. Sendo que as tags que vem antes tem prioridade. Você pode mudar essa ordem. Por último temos o label4 que vai receber o conteúdo de postal_code (CEP). Nesse exemplo apenas as vias (highway) irão receber esses labels. Você pode mudar isso e adicional label2, label3 e label4 para outros objetos também, para isso basta criar outras regras colocando uma regra diferente de “highway=*” no inicio do comando.

Por fim basta compilar usando o mkgmap, o comando ficaria parecido com o que consta abaixo, sem que “/dir/style_file” seria a pasta na qual encontra-se os “Style File” que você baixou:

java -Xmx1500m -jar mkgmap.jar –style-file=/dir/style_file –gmapsupp -c template.args

Algo que eu notei nos testes que eu realizei é que no caso de vias segmentadas (cortadas) todos os atributos de cada segmento deve possuir o mesmo valor para a pesquisa pelo label funcionar corretamente, caso os valores sejam diferentes a pesquisa não funciona. Exemplo, imagine que a “Rua Marcos Pien” está dividida em duas partes, parte1 e parte2. Sendo que a parte1 possui os atributos: name=”Rua Marcos Pien”, alt_name=”Rua do Marcos”, loc_name=”Rua da Igreja”, postal_code=”81955-400”. Já a parte2 possui os atributos: name=”Rua Marcos Pien”, alt_name=”Rua do Marcos”, postal_code=”81955-440”. Imagine que geramos um mapa usando as configurações de label2, 3 e 4 descritos nesse artigo.

Em nosso exemplo se pesquisar por “Rua Marcos Pien” e por ”Rua do Marcos” o GPS encontrara a via, agora se pesquisar por ”Rua da Igreja” o GPS não vai encontrar pois esse nome consta apenas no primeiro segmento e não consta no segundo. O mesmo acontece se pesquisarmos pelo CEP 81955-400, o GPS também não vai encontrar uma vez que esse valor consta apenas no primeiro segmento, no segundo segmento o valor é diferente.

Referências: Style File | Manual Style

No mkgmap existe uma opção que pode ser passada na linha de comando chamada “name-tag-list”. No manual do mkgmap consta:

–name-tag-list

Get the tag that will be used to supply the name. Useful for language variations. You can supply a list and the first one will be used. eg. –name-tag-list=name:en,int_name,name

Isso significa que essa opção deve ser usada para substituir o conteúdo da tag name, a qual é responsável por nomear os objetos (Vias, POIs, etc) do OSM. Assim no exemplo do manual (–name-tag-list=name:en,int_name,name) teríamos que o conteúdo do nome seria preenchido seguindo a ordem: primeiramente com o conteúdo da tag “name:en”, caso essa tag não exista, então seria preenchido com o conteúdo da tag “int_name”, caso essa tag também não exista então seria usado o conteúdo da tag “name”. Caso o tag “name” não exista o objeto ficaria sem nome. Você pode escolher a ordem de prioridade que desejar.

Quando usar essa opção? Imagine a situação: você fala inglês, não fala francês e deseja viajar de carro pela França. Nesse caso você poderia pegar o mapa do OSM da França e compilar usando essa opção, colocando como prioridade o conteúdo da tag “name:en” sobre o conteúdo da tag “name”. Assim os nomes dos lugares e vias ficariam em inglês e não francês ficando mais fácil de localizar os lugares.

A tag int_name quando ela é usada? Segundo o wiki do OSM ela deve ser usada para descrever o nome que um objeto é conhecido internacional, no wiki consta também a observação que internacional não significa necessariamente ser em inglês. Por exemplo o que nós brasileiros conhecemos como “Cataratas do Iguaçu” é conhecido internacionalmente como “Iguazu Falls”.

Iguazu Falls: exemplo de como um local é conhecido internacionalmente

Vi que alguns colaboradores do OSM estão “internacionalizando” o nome de algumas vias. Apenas como exemplo temos essa via (https://www.openstreetmap.org/way/117755023) que tem a tag name com o valor de “Rua Clemente Pereira” e a tag int_name com o valor de “Clemente Pereira Street”. Independente se essa “internacionalização” está correta ou não (na minha opinião é que não está) é algo que acontece e pode ser observado.

Pois bem, agora que sabemos para que serve a opção name-tag-list podemos pensar o seguinte: você é brasileiro quer compilar o mapa do OSM do Brasil, o qual é feito, em sua maioria, por brasileiros. Nesse caso é necessário usar essa opção sobrepondo o conteúdo que já consta na tag name? Minha opinião é que não, pois você deve estar acostumado aos nomes em português os quais já estão por “padrão” dentro da tag “name”. Usar essa opção vai fazer com que esses nomes sejam substituídos por outros nomes, por exemplo você não vai encontrar mais as Cataratas do Iguaçu apenas “Iguazu Falls”, você não irá encontrar a rua “Rua Clemente Pereira” apenas “Clemente Pereira Street”. Assim quando você for procurar um objeto no mapa terá que pensar será que o nome pode estar sua forma internacional. Não acho que isso ajuda, pelo contrário, acho que vai te atrapalhar.

Assim, se você é brasileiro e deseja compilar o mapa do OSM do Brasil não recomendo que use essa opção.

Referências: Tag Name | Opções do mkgmap

Quem já compilou mapas com o mkgmap já deve ter percebido um problema comum: ao pesquisar por nome de vias (Ruas) a pesquisa somente encontra resultado quando você digita o nome completo da via. Imagine que a via se chame “Travessa Antônio Maurizi”, caso você pesquise por “Maurizi” ou “Antônio Maurizi” nada é encontrado. O problema disso é que você é obrigado a saber o Tipo do logradouro (Rua, Travessa, Avenida, etc) para pode fazer a busca. Se você não souber vai ter que ficar na tentativa e erro.

Para resolver isso algumas pessoas criavam regras no “Style File” jogando o primeiro nome da via para a última posição. Assim, “Travessa Antônio Maurizi” ficaria “Antônio Maurizi Travessa”. Isso permite que a pesquisa por “Antônio Maurizi” retorne o nome da via, nesse caso eu não preciso digitar o nome completo e nem saber o tipo de logradouro. Porém a pesquisa por “Maurizi” continua a não trazer resultados.

Abaixo exemplo de alguns comandos no “Style File” que permitem fazer esse tipo de pesquisa:

highway=* & name ~ ‘(?i)travessa\s+.*’ { add streettype:movedend=’${name|subst:(?i)travessa\s+~>}, Travessa’}

highway=* & name ~ ‘(?i)rua\s+.*’ { add streettype:movedend=’${name|subst:(?i)rua\s+~>}, Rua’}

highway=* & name ~ ‘(?i)avenida\s+.*’ { add streettype:movedend=’${name|subst:(?i)avenida\s+~>}, Avenida’}

A desvantagem dessa solução é que a pesquisa pela terceira palavra do nome continua não trazendo resultados. Além disso, o IMG gerado pelo mkgmap fica maior, não muito maior, mas maior do que um mapa que não é compilado com essa solução.

Para resolver o problema em definitivo as versões recentes do mkgmap (lançadas pós 2015) trazem uma opção chamada “–x-split-name-index”. Essa opção não é habilitada por padrão assim para usá-la é necessário fazer a chamada dela explicitamente. Sua linha de comando ficaria parecida com esta:

java -jar mkgmap.jar –x-split-name-index –housenumbers –route –index –gmapsupp brazil.osm.pbf

Essa opção nova no mkgmap ainda está em testes. Caso encontre erros avise o time de desenvolvimento do mkgmap. Na lista do mkgmap esse problema foi referenciado como problema do “multi-word street search”.

Referências: Wiki OSM | Documentação mkgmap | Lista de e-mail do mkgmap | Kit cocar de compilação

Eu vou usar este espaço para distribuir informações sobre o OSM, mkgmap e assuntos relacionados.

Location: Condomínio Residencial Spazio Cruzeiro do Sul, 622, Boneca do Iguaçu, São José dos Pinhais, Região Geográfica Imediata de Curitiba, Região Metropolitana de Curitiba, Região Geográfica Intermediária de Curitiba, Paraná, Região Sul, 83040-030, Brasil