Palavras podem ser ajustadas no código, Dr.=Doutor, Prof.=Professor, etc...
Criado para uso especifico no Brasil, para outro país o código deve ser adaptado
Como funciona?
Selecione elementos do mapa
Execute o código
Confira as correções na lista
Demonstração
Imagem.gif, clique para visualizar.
Código
fromorg.openstreetmap.josm.data.osmimportOsmPrimitivefromorg.openstreetmap.josm.guiimportMainApplication,Notificationfromorg.openstreetmap.josm.commandimportChangePropertyCommand,SequenceCommandfromorg.openstreetmap.josm.data.UndoRedoHandlerimportgetInstancefromjavax.swingimportUIManager,JOptionPaneimportredeftitle_case(text):ignore_words={"da","das","de","do","dos"}siglas_conhecidas={"br","sp","rj","mg","rs","es","df","go","sc","pr","to","pi","pa","ce","pe","ap","am","ro","rr","ac","ma","pb","rn","ba","se","al","mt","ms","to","onu","ibge","dnit","der","lt","ld"}correcoes_conhecidas={"av.":"Avenida","r.":"Rua","tv.":"Travessa","rod.":"Rodovia","est.":"Estrada","prof.":"Professor","dr.":"Doutor"}# Expansão de abreviações com números/letras depois do pontodefexpandir_abreviacoes(txt):forabrev,expandidoincorrecoes_conhecidas.items():padrao=r"\b"+re.escape(abrev)+r"\s*([a-z0-9]+)"txt=re.sub(padrao,expandido+r" \1",txt,flags=re.IGNORECASE)returntxttext=expandir_abreviacoes(text)defis_sigla(word):limpo=word.lower().replace("-","").replace("_","")returnlimpoinsiglas_conhecidasorre.match(r"^[a-z]{2,}[-\d]+$",limpo)words=text.split()deftratar(word,is_first):original=word.strip()lower=original.lower()# Sigla conhecida ou padrão tipo BR-101 → manter em caixa altaifis_sigla(original):returnoriginal.upper()# Corrigir palavra individual isolada (sem número/letra depois)iflowerincorrecoes_conhecidas:returncorrecoes_conhecidas[lower]# Palavra ignorada (de, da, etc.) minúscula, exceto se for a primeiraiflowerinignore_wordsandnotis_first:returnlower# Palavras com hífen (ex: joao-pedro)if"-"inoriginal:return"-".join(tratar(p,False)forpinoriginal.split("-"))# Capitalizar normalmentereturnlower.capitalize()return" ".join(tratar(w,i==0)fori,winenumerate(words))defadjust_name_tags():layer=MainApplication.getLayerManager().getEditLayer()iflayerisNoneornothasattr(layer,"data"):Notification(u"Nenhuma camada de edição ativa encontrada.")\
.setIcon(UIManager.getIcon("OptionPane.errorIcon"))\
.show()returndataset=layer.dataselection=list(dataset.getSelectedNodes())+ \
list(dataset.getSelectedWays())+ \
list(dataset.getSelectedRelations())ifnotselection:Notification("Nenhum objeto com nome selecionado.")\
.setIcon(UIManager.getIcon("OptionPane.warningIcon"))\
.show()returntags_alvo={"name","alt_name","old_name","official_name","loc_name","reg_name"}commands=[]alteracoes_texto=[]forobjinselection:keys=obj.getKeys()forkey,valueinkeys.items():if(keyintags_alvoorkey.startswith("name:"))andvalue:ajustado=title_case(value)ifajustado!=value:alteracoes_texto.append(u"%s → %s"%(value,ajustado))commands.append(ChangePropertyCommand(obj,key,ajustado))ifcommands:getInstance().add(SequenceCommand("Ajustar nomes em formato titulo",commands))resumo="\n".join(alteracoes_texto)iflen(resumo)>250:resumo=resumo[:250]+"\n...\n(mais alterações ocultadas)"JOptionPane.showMessageDialog(None,u"Alterações realizadas:\n\n"+resumo,u"Nomes ajustados com sucesso",JOptionPane.PLAIN_MESSAGE)else:Notification(u"Nenhuma mudança necessária.")\
.setIcon(UIManager.getIcon("OptionPane.informationIcon"))\
.show()# Executaradjust_name_tags()