Criar um ponto central em cada geometria pode ser útil quando quiser separar poi ou endereço de edificações
Como funciona?
Selecione um ou mais polígonos
Será criado um ponto no centro de cada geometria
Demonstração
Imagem.gif, clique para visualizar.
Código
fromorg.openstreetmap.josm.guiimportMainApplication,Notificationfromorg.openstreetmap.josm.data.osmimportNode,Wayfromorg.openstreetmap.josm.data.coorimportLatLon,EastNorthfromorg.openstreetmap.josm.data.projectionimportProjectionRegistryfromorg.openstreetmap.josm.commandimportAddCommand,SequenceCommandfromorg.openstreetmap.josm.data.UndoRedoHandlerimportgetInstancefromjavax.swingimportUIManagerdefcentroide_area(way,proj):coords=[proj.latlon2eastNorth(n.getCoor())forninway.getNodes()]ifcoords[0]!=coords[-1]:coords.append(coords[0])sum_east=sum(coord.east()forcoordincoords[:-1])sum_north=sum(coord.north()forcoordincoords[:-1])avg_east=sum_east/len(coords[:-1])avg_north=sum_north/len(coords[:-1])returnproj.eastNorth2latlon(EastNorth(avg_east,avg_north))defmain():dataset=MainApplication.getLayerManager().getEditDataSet()ifnotdataset:Notification(u"Nenhuma camada de edição ativa!")\
.setIcon(UIManager.getIcon("OptionPane.errorIcon"))\
.show()returnways=list(dataset.getSelectedWays())ifnotways:Notification(u"Selecione pelo menos um polígono fechado.")\
.setIcon(UIManager.getIcon("OptionPane.warningIcon"))\
.show()returnproj=ProjectionRegistry.getProjection()comandos=[]forwayinways:nodes=way.getNodes()iflen(nodes)<3ornodes[0]!=nodes[-1]:continuecentro=centroide_area(way,proj)novo_node=Node(centro)# Copiar tags do polígono para o pontoforkeyinway.getKeys().keySet():novo_node.put(key,way.get(key))comandos.append(AddCommand(dataset,novo_node))ifcomandos:getInstance().add(SequenceCommand("Criar centroides com tags",comandos))Notification("Centroides foram criados com sucesso.")\
.setIcon(UIManager.getIcon("OptionPane.informationIcon"))\
.show()else:Notification(u"Nenhum polígono válido selecionado.")\
.setIcon(UIManager.getIcon("OptionPane.warningIcon"))\
.show()main()