Changeset 8517 in josm


Ignore:
Timestamp:
2015-06-21T14:16:04+02:00 (6 years ago)
Author:
simon04
Message:

see #10973 - Relation public_transport/route sorting: sort platform directly after corresponding stop member

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java

    r8512 r8517  
    66import java.util.Collections;
    77import java.util.Comparator;
     8import java.util.HashMap;
    89import java.util.LinkedHashMap;
    910import java.util.LinkedList;
     
    1213import java.util.Map.Entry;
    1314
     15import org.openstreetmap.josm.data.osm.OsmPrimitive;
     16import org.openstreetmap.josm.data.osm.Relation;
    1417import org.openstreetmap.josm.data.osm.RelationMember;
    1518import org.openstreetmap.josm.gui.DefaultNameFormatter;
    1619import org.openstreetmap.josm.tools.AlphanumComparator;
     20import org.openstreetmap.josm.tools.Utils;
    1721
    1822public class RelationSorter {
     
    9195        }
    9296
     97        private static String getStopName(OsmPrimitive p) {
     98            for (Relation ref : Utils.filteredCollection(p.getReferrers(), Relation.class)) {
     99                if (ref.hasTag("type", "public_transport") && ref.hasTag("public_transport", "stop_area") && ref.getName() != null) {
     100                    return ref.getName();
     101                }
     102            }
     103            return p.getName();
     104        }
     105
    93106        @Override
    94107        public List<RelationMember> sortMembers(List<RelationMember> list) {
    95             // Retain order from original relation
    96             return list;
     108            final Map<String, RelationMember> platformByName = new HashMap<>();
     109            for (RelationMember i : list) {
     110                if ("platform".equals(i.getRole())) {
     111                    final RelationMember old = platformByName.put(getStopName(i.getMember()), i);
     112                    if (old != null) {
     113                        // Platform with same name present. Stop to avoid damaging complicated relations.
     114                        // This case can happily be handled differently.
     115                        return list;
     116                    }
     117                }
     118            }
     119            final List<RelationMember> sorted = new ArrayList<>(list.size());
     120            for (RelationMember i : list) {
     121                if ("stop".equals(i.getRole())) {
     122                    sorted.add(i);
     123                    final RelationMember platform = platformByName.remove(getStopName(i.getMember()));
     124                    if (platform != null) {
     125                        sorted.add(platform);
     126                    }
     127                }
     128            }
     129            sorted.addAll(platformByName.values());
     130            return sorted;
    97131        }
    98132    }
Note: See TracChangeset for help on using the changeset viewer.