OpenStreetMap logo 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.

See full entry

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”.

See full entry

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

See full entry

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