Skip to content

Commit 3d3cc48

Browse files
I created a PedestrianTransportMode and a HorseTransportMode. I also added some Icons.
1 parent 2395f15 commit 3d3cc48

5 files changed

Lines changed: 160 additions & 3 deletions

File tree

src/main/java/org/openstreetmap/josm/plugins/pt_assistant/actions/routinghelper/BicycleTransportMode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public boolean canTurn(@NotNull final Way from, @NotNull final Node via, @NotNul
6666

6767
@Override
6868
public ImageProvider getIcon() {
69-
return PTIcons.BICYCLE_DESIGNATED;
69+
return PTIcons.BICYCLE;
7070
}
7171

7272
@Override
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package org.openstreetmap.josm.plugins.pt_assistant.actions.routinghelper;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
import java.util.Objects;
6+
import java.util.Set;
7+
import java.util.stream.Collectors;
8+
9+
import com.drew.lang.annotations.NotNull;
10+
import org.openstreetmap.josm.data.osm.IRelation;
11+
import org.openstreetmap.josm.data.osm.IWay;
12+
import org.openstreetmap.josm.data.osm.Node;
13+
import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
14+
import org.openstreetmap.josm.data.osm.Relation;
15+
import org.openstreetmap.josm.data.osm.Way;
16+
import org.openstreetmap.josm.plugins.pt_assistant.utils.PTIcons;
17+
import org.openstreetmap.josm.tools.I18n;
18+
import org.openstreetmap.josm.tools.ImageProvider;
19+
20+
public class HorseTransportMode implements ITransportMode {
21+
@Override
22+
public boolean canTraverseWay(@NotNull final IWay<?> way, @NotNull final WayTraversalDirection direction) {
23+
final String onewayValue = way.get("oneway");
24+
List<String> majorHighways = Arrays.asList(
25+
"tertiary", "secondary", "primary", "trunk");
26+
majorHighways.forEach(v -> majorHighways.add(String.format("%s_link", v)));
27+
// This list is ordered from most suitable to least suitable
28+
List<String> suitableHighwaysForHorseRiders = Arrays.asList(
29+
"bridleway", "pedestrian", "footway", "path", "track", "living_street", "residential", "unclassified", "cyclestreet", "service", "cycleway");
30+
suitableHighwaysForHorseRiders.addAll(majorHighways); // TODO do this only once when plugin starts
31+
return !way.hasTag("horse", "no") &&
32+
(way.hasTag("highway", suitableHighwaysForHorseRiders) ||
33+
way.hasTag("horse", "yes"))
34+
&& (
35+
onewayValue == null ||
36+
("yes".equals(onewayValue) && direction == WayTraversalDirection.FORWARD) ||
37+
("-1".equals(onewayValue) && direction == WayTraversalDirection.BACKWARD)
38+
);
39+
}
40+
41+
@Override
42+
public boolean canBeUsedForRelation(@NotNull final IRelation<?> relation) {
43+
return relation.hasTag("type", "route") && relation.hasTag("route", "horse");
44+
}
45+
46+
@Override
47+
public boolean canTurn(@NotNull final Way from, @NotNull final Node via, @NotNull final Way to) {
48+
final Set<Relation> restrictionRelations = from.getReferrers().stream()
49+
.map(it -> it.getType() == OsmPrimitiveType.RELATION ? (Relation) it : null)
50+
.filter(Objects::nonNull)
51+
.filter(it -> "restriction".equals(it.get("type")))
52+
.filter(it -> it.findRelationMembers("from").contains(from))
53+
.filter(it -> it.findRelationMembers("via").contains(via))
54+
.filter(it -> it.findRelationMembers("to").contains(to))
55+
.collect(Collectors.toSet());
56+
for (Relation restrictionRelation : restrictionRelations) {
57+
final String restriction = restrictionRelation.get("restriction");
58+
if (restriction.startsWith("no_")) {
59+
return false;
60+
}
61+
}
62+
63+
return from.containsNode(via) && to.containsNode(via);
64+
}
65+
66+
@Override
67+
public ImageProvider getIcon() {
68+
return PTIcons.HORSE;
69+
}
70+
71+
@Override
72+
public String getName() {
73+
return I18n.marktr("equestrian");
74+
}
75+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package org.openstreetmap.josm.plugins.pt_assistant.actions.routinghelper;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
import java.util.Objects;
6+
import java.util.Set;
7+
import java.util.stream.Collectors;
8+
9+
import javax.swing.Icon;
10+
11+
import com.drew.lang.annotations.NotNull;
12+
import org.openstreetmap.josm.data.osm.IRelation;
13+
import org.openstreetmap.josm.data.osm.IWay;
14+
import org.openstreetmap.josm.data.osm.Node;
15+
import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
16+
import org.openstreetmap.josm.data.osm.Relation;
17+
import org.openstreetmap.josm.data.osm.Way;
18+
import org.openstreetmap.josm.plugins.pt_assistant.utils.PTIcons;
19+
import org.openstreetmap.josm.tools.I18n;
20+
import org.openstreetmap.josm.tools.ImageProvider;
21+
22+
public class PedestrianTransportMode implements ITransportMode {
23+
@Override
24+
public boolean canTraverseWay(@NotNull final IWay<?> way, @NotNull final WayTraversalDirection direction) {
25+
final String onewayValue = way.get("oneway");
26+
List<String> majorHighways = Arrays.asList(
27+
"tertiary", "secondary", "primary", "trunk");
28+
majorHighways.forEach(v -> majorHighways.add(String.format("%s_link", v)));
29+
// This list is ordered from most suitable to least suitable
30+
List<String> suitableHighwaysForPedestrians = Arrays.asList(
31+
"pedestrian", "footway", "path", "track", "living_street", "residential", "unclassified", "cyclestreet", "service", "cycleway", "bridleway");
32+
suitableHighwaysForPedestrians.addAll(majorHighways); // TODO do this only once when plugin starts
33+
return !way.hasTag("foot", "no") &&
34+
(way.hasTag("highway", suitableHighwaysForPedestrians) ||
35+
way.hasTag("foot", "yes"))
36+
&& (
37+
onewayValue == null || "no".equals(way.get("foot:backward")) || "no".equals(way.get("oneway:foot")) ||
38+
("yes".equals(onewayValue) && direction == WayTraversalDirection.FORWARD) ||
39+
("-1".equals(onewayValue) && direction == WayTraversalDirection.BACKWARD)
40+
);
41+
}
42+
43+
@Override
44+
public boolean canBeUsedForRelation(@NotNull final IRelation<?> relation) {
45+
return relation.hasTag("type", "route") && relation.hasTag("route",
46+
"foot", "walking", "hiking");
47+
}
48+
49+
@Override
50+
public boolean canTurn(@NotNull final Way from, @NotNull final Node via, @NotNull final Way to) {
51+
final Set<Relation> restrictionRelations = from.getReferrers().stream()
52+
.map(it -> it.getType() == OsmPrimitiveType.RELATION ? (Relation) it : null)
53+
.filter(Objects::nonNull)
54+
.filter(it -> "restriction".equals(it.get("type")))
55+
.filter(it -> it.findRelationMembers("from").contains(from))
56+
.filter(it -> it.findRelationMembers("via").contains(via))
57+
.filter(it -> it.findRelationMembers("to").contains(to))
58+
.collect(Collectors.toSet());
59+
for (Relation restrictionRelation : restrictionRelations) {
60+
final String restriction = restrictionRelation.get("restriction");
61+
if (restriction.startsWith("no_")) {
62+
return false;
63+
}
64+
}
65+
66+
return from.containsNode(via) && to.containsNode(via);
67+
}
68+
69+
@Override
70+
public ImageProvider getIcon() {
71+
return PTIcons.PEDESTRIAN;
72+
}
73+
74+
@Override
75+
public String getName() {
76+
return I18n.marktr("pedestrian");
77+
}
78+
}

src/main/java/org/openstreetmap/josm/plugins/pt_assistant/actions/routinghelper/TrolleyBusTransportMode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public boolean canBeUsedForRelation(@NotNull final IRelation<?> relation) {
2828

2929
@Override
3030
public ImageProvider getIcon() {
31-
return PTIcons.BUS;
32-
} // TODO: find proper icon
31+
return PTIcons.TROLLEY_BUS;
32+
}
3333

3434
@Override
3535
public String getName() {

src/main/java/org/openstreetmap/josm/plugins/pt_assistant/utils/PTIcons.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ private PTIcons() {
88
}
99

1010
public static final ImageProvider BICYCLE_DESIGNATED = new ImageProvider("presets/vehicle/restriction", "bicycle-designated");
11+
public static final ImageProvider BICYCLE = new ImageProvider("presets/sport", "cycling");
1112
public static final ImageProvider BUS = new ImageProvider("bus");
13+
public static final ImageProvider TROLLEY_BUS = new ImageProvider("presets/transport", "trolleybus");
14+
public static final ImageProvider PEDESTRIAN = new ImageProvider("presets/vehicle/restriction","foot-designated");
15+
public static final ImageProvider HORSE = new ImageProvider("presets/leisure","horse_riding");
1216

1317
public static final ImageProvider STOP_SIGN = new ImageProvider("misc", "error");
1418
public static final ImageProvider GREEN_CHECKMARK = new ImageProvider("misc", "green_check");

0 commit comments

Comments
 (0)