Ignore:
Timestamp:
2017-06-26T18:45:06+02:00 (7 years ago)
Author:
giackserva
Message:

[pt_assistant] #josm14933 - added version 1 route support

Location:
applications/editors/josm/plugins/pt_assistant
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/IncompleteMembersDownloadThread.java

    r33055 r33414  
    4141                for (Relation currentSelectedRelation : Main.getLayerManager().getEditDataSet()
    4242                        .getSelectedRelations()) {
    43                     if (RouteUtils.isTwoDirectionRoute(currentSelectedRelation)) {
     43                    if (RouteUtils.isVersionTwoPTRoute(currentSelectedRelation)) {
    4444                        list.add(currentSelectedRelation);
    4545                    }
     
    5151                    Collection<Relation> allRelations = Main.getLayerManager().getEditDataSet().getRelations();
    5252                    for (Relation currentRelation : allRelations) {
    53                         if (RouteUtils.isTwoDirectionRoute(currentRelation)) {
     53                        if (RouteUtils.isVersionTwoPTRoute(currentRelation)) {
    5454                            list.add(currentRelation);
    5555                        }
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/SplitRoundaboutAction.java

    r33413 r33414  
    113113    public void updateRelations(Map<Relation, List<Integer>> savedPositions,
    114114            List<Node> splitNodes, Collection<Way> splitWays) {
    115         Map<Relation, Integer> memberOffset = new HashMap<>();
     115        Map<Relation, Integer> memberOffset = new HashMap<>();
    116116        savedPositions.forEach((r, positions) ->
    117                 positions.forEach(i -> {
    118 
    119                     if(!memberOffset.containsKey(r))
    120                         memberOffset.put(r, 0);
    121                     int offset = memberOffset.get(r);
    122 
    123                     Pair<Way, Way> entryExitWays= getEntryExitWays(r, i + offset);
    124                     Way entryWay = entryExitWays.a;
    125                     Way exitWay = entryExitWays.b;
    126 
    127                     //get the entry and exit nodes, exit if not found
    128                     Node entryNode = getNodeInCommon(splitNodes, entryWay);
    129                     Node exitNode = getNodeInCommon(splitNodes, exitWay);
    130 
    131                     if(entryNode == null || exitNode == null)
    132                         return;
    133 
    134                     //starting from the entry node, add split ways until the
    135                     //exit node is reached
    136                     List<Way> parents = entryNode.getParentWays();
    137                     parents.removeIf(w -> !w.firstNode().equals(entryNode));
    138                     parents.removeIf(w -> w.equals(entryWay));
    139 
    140                     Way curr = parents.get(0);
    141 
    142                     while(!curr.lastNode().equals(exitNode)) {
    143                         r.addMember(i + offset++, new RelationMember(null, curr));
    144                         parents = curr.lastNode().getParentWays();
    145                         parents.remove(curr);
    146                         parents.removeIf(w -> !splitWays.contains(w));
    147                         curr = parents.get(0);
    148                     }
    149                     r.addMember(i + offset++, new RelationMember(null, curr));
    150                     memberOffset.put(r, offset);
    151                 }));
     117            positions.forEach(i -> {
     118
     119                if(!memberOffset.containsKey(r))
     120                    memberOffset.put(r, 0);
     121                int offset = memberOffset.get(r);
     122
     123                Pair<Way, Way> entryExitWays= getEntryExitWays(r, i + offset);
     124                Way entryWay = entryExitWays.a;
     125                Way exitWay = entryExitWays.b;
     126
     127                //get the entry and exit nodes, exit if not found
     128                Node entryNode = getNodeInCommon(splitNodes, entryWay);
     129                Node exitNode = getNodeInCommon(splitNodes, exitWay);
     130
     131                if(entryNode == null || exitNode == null)
     132                    return;
     133
     134                //starting from the entry node, add split ways until the
     135                //exit node is reached
     136                List<Way> parents = entryNode.getParentWays();
     137                parents.removeIf(w -> !w.firstNode().equals(entryNode));
     138                parents.removeIf(w -> w.equals(entryWay));
     139
     140                Way curr = parents.get(0);
     141
     142                while(!curr.lastNode().equals(exitNode)) {
     143                    r.addMember(i + offset++, new RelationMember(null, curr));
     144                    parents = curr.lastNode().getParentWays();
     145                    parents.remove(curr);
     146                    parents.removeIf(w -> !splitWays.contains(w));
     147                    curr = parents.get(0);
     148                }
     149                r.addMember(i + offset++, new RelationMember(null, curr));
     150                memberOffset.put(r, offset);
     151            }));
    152152    }
    153153
     
    165165    private Pair<Way, Way> getEntryExitWays(Relation r, Integer position) {
    166166
    167         //the ways returned are the one exactly before and after the roundabout
    168         Pair<Way, Way> ret = new Pair<>(null, null);
    169         ret.a = r.getMember(position-1).getWay();
    170         ret.b = r.getMember(position).getWay();
    171         return ret;
     167        //the ways returned are the one exactly before and after the roundabout
     168        Pair<Way, Way> ret = new Pair<>(null, null);
     169        ret.a = r.getMember(position-1).getWay();
     170        ret.b = r.getMember(position).getWay();
     171        return ret;
    172172    }
    173173
     
    186186                for(OsmPrimitive prim : parent.getReferrers()) {
    187187                    if(prim.getType() == OsmPrimitiveType.RELATION &&
    188                             RouteUtils.isTwoDirectionRoute((Relation) prim))
     188                            RouteUtils.isPTRoute((Relation) prim))
    189189                        return false;
    190190                }
     
    203203        List <OsmPrimitive> referrers = roundabout.getReferrers();
    204204        referrers.removeIf(r -> r.getType() != OsmPrimitiveType.RELATION
    205                 || !RouteUtils.isTwoDirectionRoute((Relation) r));
     205                || !RouteUtils.isPTRoute((Relation) r));
    206206
    207207        for(OsmPrimitive currPrim : referrers) {
     
    210210                if(curr.getMember(j).getUniqueId() == roundabout.getUniqueId()) {
    211211                    if(!savedPositions.containsKey(curr))
    212                         savedPositions.put(curr, new ArrayList<>());
    213                         List<Integer> positions = savedPositions.get(curr);
    214                         positions.add(j - positions.size());
     212                        savedPositions.put(curr, new ArrayList<>());
     213                    List<Integer> positions = savedPositions.get(curr);
     214                    positions.add(j - positions.size());
    215215                }
    216216            }
    217217
    218218            if(savedPositions.containsKey(curr))
    219                 curr.removeMembersFor(roundabout);
     219                curr.removeMembersFor(roundabout);
    220220        }
    221221
     
    232232        if(selected.getType() != OsmPrimitiveType.WAY)
    233233            return;
    234         if(((Way)selected).isClosed() && selected.hasTag("junction", "roundabout")) {
     234        if(((Way)selected).isClosed()
     235                && (selected.hasTag("junction", "roundabout")
     236                        || selected.hasTag("oneway", "yes"))) {
    235237            setEnabled(true);
    236238            return;
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/gui/PTAssistantLayer.java

    r33362 r33414  
    207207                Relation relation = editor.getRelation();
    208208
    209                 if (RouteUtils.isTwoDirectionRoute(relation)) {
     209                if (RouteUtils.isVersionTwoPTRoute(relation)) {
    210210                    this.repaint(relation);
    211211
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/gui/PTAssistantLayerManager.java

    r33408 r33414  
    3838        for (OsmPrimitive primitive : newSelection) {
    3939            if (primitive.getType().equals(OsmPrimitiveType.RELATION)
    40                         && RouteUtils.isTwoDirectionRoute((Relation) primitive)) {
    41                     routes.add(primitive);
     40                        && RouteUtils.isVersionTwoPTRoute((Relation) primitive)) {
     41                routes.add(primitive);
    4242            }
    4343        }
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/gui/PTAssistantPaintVisitor.java

    r33322 r33414  
    346346            if (parent.getType().equals(OsmPrimitiveType.RELATION)) {
    347347                Relation relation = (Relation) parent;
    348                 if (RouteUtils.isTwoDirectionRoute(relation) && relation.get("ref") != null
     348                if (RouteUtils.isVersionTwoPTRoute(relation) && relation.get("ref") != null
    349349                        && !relation.get("ref").equals("")) {
    350350
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/utils/RouteUtils.java

    r33406 r33414  
    1919public final class RouteUtils {
    2020
     21        private final static String ptVersionTag = "public_transport:version";
    2122    private RouteUtils() {
    2223        // private constructor for util classes
     
    3233     *         with the pt_assistant plugin, false otherwise.
    3334     */
    34     public static boolean isTwoDirectionRoute(Relation r) {
     35    public static boolean isVersionTwoPTRoute(Relation r) {
     36
     37        if(!isPTRoute(r)) {
     38            return false;
     39        }
     40
     41        if (!r.hasTag(ptVersionTag, "2")) {
     42            return false;
     43        }
     44
     45        return !r.hasTag("bus", "on_demand");
     46    }
     47
     48    public static boolean isVersionOnePTRoute(Relation r) {
     49
     50        if(!isPTRoute(r)) {
     51            return false;
     52        }
     53
     54        if(r.get(ptVersionTag) == null) {
     55            return true;
     56        }
     57
     58        return r.hasTag(ptVersionTag, "1");
     59    }
     60
     61    public static boolean isPTRoute(Relation r) {
    3562
    3663        if (r == null) {
     
    3865        }
    3966
    40         if (!r.hasKey("route") || !r.hasTag("public_transport:version", "2")) {
    41             return false;
    42         }
    43 
    4467        String [] acceptedRouteTags = new String[] {
    45                         "bus", "trolleybus", "share_taxi",
     68                "bus", "trolleybus", "share_taxi",
    4669                "tram", "light_rail", "subway", "train"};
    4770
    48         return r.hasTag("route", acceptedRouteTags)
    49              && !r.hasTag("bus", "on_demand");
     71        return r.hasTag("route", acceptedRouteTags);
    5072    }
    5173
     
    6688        return (rm.getType().equals(OsmPrimitiveType.WAY))
    6789            && (rm.getWay().hasTag("public_transport", "platform")
    68                         || rm.getWay().hasTag("highway", "platform")
     90                    || rm.getWay().hasTag("highway", "platform")
    6991                    || rm.getWay().hasTag("railway", "platform"));
    7092    }
     
    88110        if (rm.getType().equals(OsmPrimitiveType.WAY)) {
    89111            return !(rm.getWay().hasTag("public_transport", "platform")
    90                         || rm.getWay().hasTag("highway", "platform")
     112                    || rm.getWay().hasTag("highway", "platform")
    91113                    || rm.getWay().hasTag("railway", "platform"));
    92114        }
     
    115137
    116138        if (OsmUtils.isTrue(way.get("oneway"))
    117                         || OsmUtils.isReversed(way.get("oneway"))
     139                || OsmUtils.isReversed(way.get("oneway"))
    118140                || way.hasTag("junction", "roundabout")
    119141                || way.hasTag("highway", "motorway")) {
     
    121143            if (!way.hasTag("busway", "lane")
    122144                    && !way.hasTag("busway", "opposite_lane")
    123                         && !way.hasTag("busway:left", "lane")
     145                    && !way.hasTag("busway:left", "lane")
    124146                    && !way.hasTag("busway:right", "lane")
    125147                    && !way.hasTag("oneway:bus", "no")
     
    155177
    156178        return w1FirstNode == w2FirstNode
    157                         || w1FirstNode == w2LastNode
    158                         || w1LastNode == w2FirstNode
     179                || w1FirstNode == w2LastNode
     180                || w1LastNode == w2FirstNode
    159181                || w1LastNode == w2LastNode;
    160182    }
     
    195217    public static boolean isWaySuitableForBuses(Way way) {
    196218
    197         String [] acceptedHighwayTags = new String [] {
    198                         "motorway", "trunk", "primary", "secondary", "tertiary",
     219        String [] acceptedHighwayTags = new String [] {
     220                "motorway", "trunk", "primary", "secondary", "tertiary",
    199221                "unclassified" , "road", "residential", "service",
    200222                "motorway_link", "trunk_link", "primary_link", "secondary_link",
    201223                "tertiary_link", "living_street", "bus_guideway", "road"};
    202224
    203         if(way.hasTag("highway", acceptedHighwayTags)
     225        if(way.hasTag("highway", acceptedHighwayTags)
    204226                || way.hasTag("cycleway", "share_busway")
    205227                || way.hasTag("cycleway", "shared_lane")) {
     
    207229        }
    208230
    209         if (way.hasTag("highway", "pedestrian")
    210                         && (way.hasTag("bus", "yes")
    211                                         || way.hasTag("psv", "yes")
    212                                         || way.hasTag("bus", "designated")
    213                                         || way.hasTag("psv", "designated"))) {
    214             return true;
    215         }
    216 
    217         return false;
     231        return (way.hasTag("highway", "pedestrian")
     232                && (way.hasTag("bus", "yes", "designated")
     233                    || way.hasTag("psv", "yes", "designated")));
    218234    }
    219235
     
    225241    public static boolean isWaySuitableForPublicTransport(Way way) {
    226242
    227         String [] acceptedRailwayTags = new String [] {
    228                         "tram", "subway", "light_rail", "rail"};
     243        String [] acceptedRailwayTags = new String [] {
     244                "tram", "subway", "light_rail", "rail"};
    229245
    230246        return isWaySuitableForBuses(way)
    231                         || way.hasTag("railway", acceptedRailwayTags);
     247                || way.hasTag("railway", acceptedRailwayTags);
    232248    }
    233249}
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/PTAssistantValidatorTest.java

    r33405 r33414  
    144144                }
    145145
    146                 if (!RouteUtils.isTwoDirectionRoute(r)) {
     146                if (!RouteUtils.isVersionTwoPTRoute(r)) {
    147147                        return;
    148148                }
  • applications/editors/josm/plugins/pt_assistant/test/unit/org/openstreetmap/josm/plugins/pt_assistant/validation/SegmentCheckerTest.java

    r33055 r33414  
    2626
    2727        for (Relation r: ds.getRelations()) {
    28             if (RouteUtils.isTwoDirectionRoute(r)) {
     28            if (RouteUtils.isVersionTwoPTRoute(r)) {
    2929                route = r;
    3030                break;
Note: See TracChangeset for help on using the changeset viewer.