Ignore:
Timestamp:
2020-01-19T18:57:26+01:00 (4 years ago)
Author:
simon04
Message:

see #18503 - Relation editor: compute wayConnection for type=superroute

This basic implementation only considers route segments without a role
(as specified for public_transport:version=2; no forward/backward)
and does not take roundabouts into account.

File:
1 edited

Legend:

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

    r15700 r15732  
    88import java.util.ArrayList;
    99import java.util.List;
     10import java.util.stream.Collectors;
    1011
    1112import org.openstreetmap.josm.data.osm.Node;
     
    1415import org.openstreetmap.josm.data.osm.Way;
    1516import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType.Direction;
     17import org.openstreetmap.josm.tools.StreamUtils;
    1618import org.openstreetmap.josm.tools.bugreport.BugReport;
    1719
     
    4345    public List<WayConnectionType> updateLinks(Relation r, List<RelationMember> members) {
    4446        this.members = members;
    45         final List<WayConnectionType> con = new ArrayList<>();
    46 
    47         for (int i = 0; i < members.size(); ++i) {
    48             con.add(null);
    49         }
     47        final List<WayConnectionType> con = members.stream()
     48                .map(ignore -> (WayConnectionType) null)
     49                .collect(Collectors.toList());
    5050
    5151        firstGroupIdx = 0;
     
    6565            }
    6666        }
    67         makeLoopIfNeeded(con, members.size()-1);
     67        if (!isSuperRoute(r)) {
     68            makeLoopIfNeeded(con, members.size() - 1);
     69        }
    6870
    6971        return con;
     
    7274    private WayConnectionType updateLinksFor(Relation r, List<WayConnectionType> con, WayConnectionType lastWct, int i) {
    7375        final RelationMember m = members.get(i);
    74         if (isNoHandleableWay(m)) {
     76        if (isSuperRoute(r)) {
     77            final WayConnectionType wct;
     78            if (!members.get(i).isRelation()) {
     79                return new WayConnectionType(true);
     80            } else if (i == 0) {
     81                return new WayConnectionType(false);
     82            } else {
     83                final List<RelationMember> previousMembers = members.get(i - 1).getRelation().getMembers();
     84                final Way previousLastWay = StreamUtils.reversedStream(previousMembers)
     85                        .filter(x -> x.isWay() && !x.hasRole())
     86                        .map(RelationMember::getWay)
     87                        .findFirst().orElse(null);
     88                final Way currentFirstWay = m.getRelation().getMembers().stream()
     89                        .filter(x -> x.isWay() && !x.hasRole())
     90                        .map(RelationMember::getWay)
     91                        .findFirst().orElse(null);
     92                final boolean isConnected = isConnected(previousLastWay, currentFirstWay);
     93                wct = new WayConnectionType(false);
     94                lastWct.linkNext = wct.linkPrev = isConnected;
     95            }
     96            con.set(i, wct);
     97            return wct;
     98        } else if (isNoHandleableWay(m)) {
    7599            if (i > 0) {
    76100                makeLoopIfNeeded(con, i-1);
     
    139163        con.set(i, wct);
    140164        return wct;
     165    }
     166
     167    private boolean isSuperRoute(Relation r) {
     168        return r != null && r.hasTag("type", "superroute");
    141169    }
    142170
     
    372400        members = null;
    373401    }
     402
     403    private boolean isConnected(Way way1, Way way2) {
     404        return way1 != null && way2 != null && way1.isUsable() && way2.isUsable()
     405                && (way1.isFirstLastNode(way2.firstNode()) || way1.isFirstLastNode(way2.lastNode()));
     406    }
    374407}
Note: See TracChangeset for help on using the changeset viewer.