User:DressyPear4/Centroide

From OpenStreetMap Wiki
Jump to navigation Jump to search

Criar centroide

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

from org.openstreetmap.josm.gui import MainApplication, Notification
from org.openstreetmap.josm.data.osm import Node, Way
from org.openstreetmap.josm.data.coor import LatLon, EastNorth
from org.openstreetmap.josm.data.projection import ProjectionRegistry
from org.openstreetmap.josm.command import AddCommand, SequenceCommand
from org.openstreetmap.josm.data.UndoRedoHandler import getInstance
from javax.swing import UIManager

def centroide_area(way, proj):
    coords = [proj.latlon2eastNorth(n.getCoor()) for n in way.getNodes()]
    if coords[0] != coords[-1]:
        coords.append(coords[0])

    sum_east = sum(coord.east() for coord in coords[:-1])
    sum_north = sum(coord.north() for coord in coords[:-1])

    avg_east = sum_east / len(coords[:-1])
    avg_north = sum_north / len(coords[:-1])

    return proj.eastNorth2latlon(EastNorth(avg_east, avg_north))

def main():
    dataset = MainApplication.getLayerManager().getEditDataSet()
    if not dataset:
        Notification(u"Nenhuma camada de edição ativa!")\
            .setIcon(UIManager.getIcon("OptionPane.errorIcon"))\
            .show()
        return

    ways = list(dataset.getSelectedWays())
    if not ways:
        Notification(u"Selecione pelo menos um polígono fechado.")\
            .setIcon(UIManager.getIcon("OptionPane.warningIcon"))\
            .show()
        return

    proj = ProjectionRegistry.getProjection()
    comandos = []

    for way in ways:
        nodes = way.getNodes()
        if len(nodes) < 3 or nodes[0] != nodes[-1]:
            continue 

        centro = centroide_area(way, proj)
        novo_node = Node(centro)

        # Copiar tags do polígono para o ponto
        for key in way.getKeys().keySet():
            novo_node.put(key, way.get(key))

        comandos.append(AddCommand(dataset, novo_node))

    if comandos:
        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()