[Talk-de] JOSM: Relationen - Element-Reihenfolge bearbeiten - Codefragment

marcus.wolschon at googlemail.com marcus.wolschon at googlemail.com
Fr Mai 8 06:13:51 UTC 2009


On Fri, 08 May 2009 07:40:32 +0200, Jan Tappenbeck <osm at tappenbeck.net>
wrote:
> Moin !
> 
> seit der Umstellung auf die neue API werden die Ways einer Relation auch 
> in ihrer Reihenfolge bewertet und in JOSM gibt es im 
> Relationsbearbeitungsdialog zwei Schaltflächen für das Verschieben der 
> Elemente in der Reihenfolge.
> 
> Wenn man die Nummern der Ways kennt und weiß welche ID nach / vor 
> welcher kommt ist das ja schön - aber gibt es noch ein weiteres 
> Hilfsmittel darüberhinaus welches mir noch nicht bekannt ist.
> 
> Ansonsten wäre vielleicht über folgenden Vorschlag nachzudenken - eine 
> Funktion analysiert in welcher Reihenfolge die Elemente angeordnet 
> werden müßten um einen fortlaufenden Weg  ergeben zu können. Der User 
> kann dann das Ergebnis bewerten und ggf. übernehmen.

Sehr gute Idee.
Vorschlag für eine Umsetzung, die auch mit dual-carriageways funktioniert:

/**
 * Combine ways sharing the same endpoints
 * to find an ordering for relation-members
 * that share the same role.
 * @param input all ways of a relation
 * @return minimal list of ways
 */
public Set<List<Way>> combineWays(final Set<Way> input) {

  Set<List<Way>> output = new Hashset<List<Way>>();
  for(Way in : input) {
     List<Way> temp = new LinkedList<Way>();
     temp.add(in);
     output.add(temp);
  }

  // go on as long as we can combine 2 of the lists
  // in "output"
  boolean combined = true;
  while (combined) {
     combined = false;
     for(List<Way> first : output ) {
        for(List<Way> second: output ) {
            if (first == second) {
                break;
            }
            Way firstWay = first.get(first.size() - 1);
            Way secondWay = second.get(0);
            if (firstWay.getWayNodes(firstWay.getWayNodes().size() -
1).getNodeID()
               == secondWay .getWayNodes(0).getNodeID) {
                 first.appendAll(second);
                 combined = true;
                break;
            }
        }
        if (combined) {
           break; // avoid ConcurrentModificationException
        }
     }
  }
}




Mehr Informationen über die Mailingliste Talk-de