Changeset 32230 in osm
- Timestamp:
- 2016-06-10T20:31:05+02:00 (9 years ago)
- Location:
- applications/editors/josm
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/PTAssistantPlugin.java
r32226 r32230 2 2 package org.openstreetmap.josm.plugins.pt_assistant; 3 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 6 import javax.swing.JOptionPane; 7 8 import org.openstreetmap.josm.data.osm.Relation; 9 import org.openstreetmap.josm.data.osm.RelationMember; 4 10 import org.openstreetmap.josm.data.validation.OsmValidator; 5 11 import org.openstreetmap.josm.plugins.Plugin; … … 17 23 */ 18 24 public class PTAssistantPlugin extends Plugin { 19 25 20 26 /** 21 27 * Main constructor. … … 34 40 35 41 } 42 43 36 44 37 45 -
applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/utils/RouteUtils.java
r32222 r32230 1 1 package org.openstreetmap.josm.plugins.pt_assistant.utils; 2 2 3 import static org.openstreetmap.josm.tools.I18n.tr; 4 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import javax.swing.JCheckBox; 9 import javax.swing.JOptionPane; 10 11 import org.openstreetmap.josm.actions.DownloadPrimitiveAction; 3 12 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 13 import org.openstreetmap.josm.data.osm.PrimitiveId; 4 14 import org.openstreetmap.josm.data.osm.Relation; 5 15 import org.openstreetmap.josm.data.osm.RelationMember; … … 14 24 public class RouteUtils { 15 25 26 // indicates if the user needs to be asked before fetching incomplete 27 // members of a relation. 28 29 private enum ASK_TO_FETCH { 30 DO_ASK, DONT_ASK_AND_FETCH, DONT_ASK_AND_DONT_FETCH 31 }; 32 33 private static ASK_TO_FETCH askToFetch = ASK_TO_FETCH.DO_ASK; 34 35 // checks that the same relation is only fetched once 36 private static Relation lastRelationToFetch = null; 37 16 38 private RouteUtils() { 17 39 // private constructor for util classes … … 66 88 || w.hasTag("railway", "platform") || w.hasTag("public_transport", "platform_entry_only") 67 89 || w.hasTag("highway", "platform_entry_only") || w.hasTag("railway", "platform_entry_only") 68 || w.hasTag("public_transport", "platform_exit_only") || w.hasTag("highway", "platform_exit_only") || w.hasTag("railway", "platform_exit_only")) { 90 || w.hasTag("public_transport", "platform_exit_only") || w.hasTag("highway", "platform_exit_only") 91 || w.hasTag("railway", "platform_exit_only")) { 69 92 return true; 70 93 } … … 113 136 } 114 137 138 /** 139 * Checks if all members of a relation are complete. If not, the user is 140 * asked to confirm the permission to fetch them, and they are fetched. The 141 * completeness of the relation itself is not checked. 142 * 143 * @param r 144 * relation 145 * @return true if all relation members are complete (or fetched), false 146 * otherwise (including if the user denies permission to download 147 * data) 148 * TODO: what should be done in case the connection to the server is broken 149 */ 150 public static boolean ensureMemberCompleteness(Relation r) { 151 152 if (r == null) { 153 return false; 154 } 155 156 boolean isComplete = true; 157 158 // check if there is at least one incomplete relation member: 159 for (RelationMember rm : r.getMembers()) { 160 if ((rm.isNode() && rm.getNode().isIncomplete()) || (rm.isWay() && rm.getWay().isIncomplete()) 161 || (rm.isRelation() && rm.getRelation().isIncomplete())) { 162 isComplete = false; 163 break; 164 } 165 } 166 167 if (!isComplete && !r.equals(lastRelationToFetch)) { 168 169 int userInput = Integer.MIN_VALUE; 170 171 172 if (askToFetch == ASK_TO_FETCH.DO_ASK) { 173 String message = tr("The relation (id=" + r.getId() 174 + ") has incomplete members.\nThey need to be downloaded to proceed with validation of this relation.\nDo you want to download incomplete members?"); 175 JCheckBox checkbox = new JCheckBox(tr("Remember my choice and don't ask me again in this session")); 176 Object[] params = { message, checkbox }; 177 String[] options = { tr("Yes"), tr("No") }; 178 // ask the user: 179 userInput = JOptionPane.showOptionDialog(null, params, tr("Fetch Request"), JOptionPane.YES_NO_OPTION, 180 JOptionPane.QUESTION_MESSAGE, null, options, 0); 181 182 183 // if the user does not want to be asked: 184 if (checkbox.isSelected()) { 185 if (userInput == 0) { 186 askToFetch = ASK_TO_FETCH.DONT_ASK_AND_FETCH; 187 } else { 188 askToFetch = ASK_TO_FETCH.DONT_ASK_AND_DONT_FETCH; 189 } 190 } 191 } 192 193 // if the user does want to fetch: 194 if (userInput == 0 || askToFetch == ASK_TO_FETCH.DONT_ASK_AND_FETCH) { 195 List<PrimitiveId> list = new ArrayList<>(1); 196 list.add(r); 197 DownloadPrimitiveAction.processItems(false, list, false, true); 198 isComplete = true; 199 lastRelationToFetch = r; 200 201 } 202 203 } 204 205 return isComplete; 206 } 207 208 209 public static boolean hasIncompleteMembers(Relation r) { 210 if (r == null) { 211 return true; 212 } 213 for (RelationMember rm: r.getMembers()) { 214 if ((rm.isNode() && rm.getNode().isIncomplete()) || (rm.isWay() && rm.getWay().isIncomplete()) 215 || (rm.isRelation() && rm.getRelation().isIncomplete())) { 216 return true; 217 } 218 } 219 220 return false; 221 } 222 223 // /** 224 // * TODO: this is temporal 225 // */ 226 // public static String getFetch() { 227 // if (askToFetch == ASK_TO_FETCH.DO_ASK) { 228 // return "do ask"; 229 // } 230 // if (askToFetch == ASK_TO_FETCH.DONT_ASK_AND_FETCH) { 231 // return "don;t ask and fetch"; 232 // } 233 // return "don't ask and don't fetch"; 234 // } 235 115 236 } -
applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/utils/StopToWayAssigner.java
r32216 r32230 1 1 package org.openstreetmap.josm.plugins.pt_assistant.utils; 2 2 3 import java.util.LinkedList; 3 import java.util.ArrayList; 4 import java.util.HashMap; 4 5 import java.util.List; 5 6 6 7 import org.openstreetmap.josm.data.osm.Node; 8 import org.openstreetmap.josm.data.osm.OsmPrimitive; 7 9 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 8 10 import org.openstreetmap.josm.data.osm.Relation; 9 import org.openstreetmap.josm.data.osm.RelationMember;10 11 import org.openstreetmap.josm.data.osm.Way; 11 12 12 13 public final class StopToWayAssigner { 13 14 private StopToWayAssigner() { 15 // Hide default constructor for utils classes 14 15 private static HashMap<Long, Way> stopToWay = new HashMap<>(); 16 17 private StopToWayAssigner(Relation r) { 18 // Hide default constructor for utils classes 19 } 20 21 public static Way getWay(OsmPrimitive stop, Relation route) { 22 if (stopToWay.containsKey(stop.getId())) { 23 return stopToWay.get(stop.getId()); 24 } 25 26 27 28 29 if (stop.getType().equals(OsmPrimitiveType.NODE)) { 30 List<OsmPrimitive> referrers = stop.getReferrers(); 31 List<Way> referredWays = new ArrayList<>(); 32 for (OsmPrimitive referrer: referrers) { 33 if (referrer.getType().equals(OsmPrimitiveType.WAY)) { 34 referredWays.add((Way)referrer); 35 } 36 } 37 if (stop.hasTag("public_transport", "stop_position")) { 38 // TODO 39 Node n = (Node) stop; 40 } 41 } 42 43 // TODO: algorithm with growing bounding boxes 44 // TODO: if found, add to 45 return null; 16 46 } 17 47 18 public static Way getWay(Node stop, Relation route) { 19 List<Way> ways = new LinkedList<>(); 20 List<RelationMember> members = route.getMembers(); 21 for (RelationMember member: members) { 22 if (member.getType().equals(OsmPrimitiveType.WAY)) { 23 ways.add(member.getWay()); 24 } 48 /** 49 * Remove a map entry 50 * @param stopId 51 */ 52 public static void removeStopKey(long stopId) { 53 Long id = new Long(stopId); 54 if (stopToWay.containsKey(id)) { 55 stopToWay.remove(id); 25 56 } 26 // TODO: algorithm with growing bounding boxes 27 return null; 57 } 58 59 /** 60 * May be needed if the correspondence between stops and ways has changed 61 * significantly 62 */ 63 public static void reinitiate() { 64 stopToWay = new HashMap<>(); 28 65 } 29 66 -
applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/DirectionTest.java
r32228 r32230 6 6 import java.util.List; 7 7 8 import javax.swing.JOptionPane; 9 8 10 import org.openstreetmap.josm.command.ChangeCommand; 9 11 import org.openstreetmap.josm.command.Command; 10 12 import org.openstreetmap.josm.command.SequenceCommand; 13 import org.openstreetmap.josm.data.osm.Node; 11 14 import org.openstreetmap.josm.data.osm.OsmPrimitive; 12 15 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; … … 25 28 26 29 public static final int ERROR_CODE_DIRECTION = 3731; 27 public static final int ERROR_CODE_ROUNDABOUT = 3732; 30 public static final int ERROR_CODE_UNSPLIT_ROUNDABOUT = 3732; 31 public static final int ERROR_CODE_SPLIT_ROUNDABOUT = 3733; 28 32 29 33 public DirectionTest() { 30 34 super(tr("Direction Test"), tr("Checks if the route runs against the direction of underlying one-way roads")); 35 31 36 } 32 37 … … 34 39 public void visit(Relation r) { 35 40 36 if (RouteUtils.isTwoDirectionRoute(r)) { 41 if (!RouteUtils.isTwoDirectionRoute(r)) { 42 return; 43 } 37 44 38 List<RelationMember> waysToCheck = new ArrayList<>(); 45 // boolean isComplete = RouteUtils.ensureMemberCompleteness(r); 46 // if (!isComplete) { 47 // return; 48 // } 49 50 if (RouteUtils.hasIncompleteMembers(r)) { 51 return; 52 } 39 53 40 for (RelationMember rm : r.getMembers()) { 41 if (RouteUtils.isPTWay(rm) && rm.getType().equals(OsmPrimitiveType.WAY)) { 42 waysToCheck.add(rm); 54 List<RelationMember> waysToCheck = new ArrayList<>(); 55 56 for (RelationMember rm : r.getMembers()) { 57 if (RouteUtils.isPTWay(rm) && rm.getType().equals(OsmPrimitiveType.WAY)) { 58 waysToCheck.add(rm); 59 } 60 } 61 62 if (waysToCheck.isEmpty()) { 63 return; 64 } 65 66 WayConnectionTypeCalculator connectionTypeCalculator = new WayConnectionTypeCalculator(); 67 final List<WayConnectionType> links = connectionTypeCalculator.updateLinks(waysToCheck); 68 69 for (int i = 0; i < links.size(); i++) { 70 if ((OsmUtils.isTrue(waysToCheck.get(i).getWay().get("oneway")) 71 && links.get(i).direction.equals(WayConnectionType.Direction.BACKWARD)) 72 || (OsmUtils.isReversed(waysToCheck.get(i).getWay().get("oneway")) 73 && links.get(i).direction.equals(WayConnectionType.Direction.FORWARD))) { 74 75 // At this point, the PTWay is going against the oneway 76 // direction. Check if this road allows buses to disregard 77 // the oneway restriction: 78 79 if (!waysToCheck.get(i).getWay().hasTag("busway", "lane") 80 && !waysToCheck.get(i).getWay().hasTag("oneway:bus", "no") 81 && !waysToCheck.get(i).getWay().hasTag("busway", "opposite_lane") 82 && !waysToCheck.get(i).getWay().hasTag("oneway:psv", "no") 83 && !waysToCheck.get(i).getWay().hasTag("trolley_wire", "backward")) { 84 List<Relation> primitives = new ArrayList<>(1); 85 primitives.add(r); 86 List<Way> highlighted = new ArrayList<>(1); 87 highlighted.add(waysToCheck.get(i).getWay()); 88 errors.add(new TestError(this, Severity.WARNING, 89 tr("PT: Route passes a oneway road in wrong direction"), ERROR_CODE_DIRECTION, primitives, 90 highlighted)); 91 return; 43 92 } 93 44 94 } 45 95 46 if (waysToCheck.isEmpty()) { 47 return; 48 } 49 50 WayConnectionTypeCalculator connectionTypeCalculator = new WayConnectionTypeCalculator(); 51 final List<WayConnectionType> links = connectionTypeCalculator.updateLinks(waysToCheck); 52 53 for (int i = 0; i < links.size(); i++) { 54 if ((OsmUtils.isTrue(waysToCheck.get(i).getWay().get("oneway")) 55 && links.get(i).direction.equals(WayConnectionType.Direction.BACKWARD)) 56 || (OsmUtils.isReversed(waysToCheck.get(i).getWay().get("oneway")) 57 && links.get(i).direction.equals(WayConnectionType.Direction.FORWARD))) { 58 59 // At this point, the PTWay is going against the oneway 60 // direction. Check if this road allows buses to disregard 61 // the oneway restriction: 62 63 if (!waysToCheck.get(i).getWay().hasTag("busway", "lane") 64 && !waysToCheck.get(i).getWay().hasTag("oneway:bus", "no") 65 && !waysToCheck.get(i).getWay().hasTag("busway", "opposite_lane") 66 && !waysToCheck.get(i).getWay().hasTag("oneway:psv", "no") 67 && !waysToCheck.get(i).getWay().hasTag("trolley_wire", "backward")) { 68 List<Relation> primitives = new ArrayList<>(1); 69 primitives.add(r); 70 List<Way> highlighted = new ArrayList<>(1); 71 highlighted.add(waysToCheck.get(i).getWay()); 72 errors.add(new TestError(this, Severity.WARNING, 73 tr("PT: Route passes a oneway road in wrong direction"), ERROR_CODE_DIRECTION, 74 primitives, highlighted)); 75 } 76 77 } 78 79 if (links.get(i).direction.equals(WayConnectionType.Direction.ROUNDABOUT_LEFT) 80 || links.get(i).direction.equals(WayConnectionType.Direction.ROUNDABOUT_RIGHT)) { 81 errors.add(new TestError(this, Severity.WARNING, tr("PT: Route passes on an unsplit roundabout"), 82 ERROR_CODE_ROUNDABOUT, waysToCheck.get(i).getWay())); 83 } 84 } 96 // if (links.get(i).direction.equals(WayConnectionType.Direction.ROUNDABOUT_LEFT) 97 // || links.get(i).direction.equals(WayConnectionType.Direction.ROUNDABOUT_RIGHT)) { 98 // errors.add(new TestError(this, Severity.WARNING, tr("PT: Route passes on an unsplit roundabout"), 99 // ERROR_CODE_UNSPLIT_ROUNDABOUT, waysToCheck.get(i).getWay())); 100 // return; 101 // } 102 103 // if (waysToCheck.get(i).getWay().hasTag("junction", "roundabout")) { 104 // JOptionPane.showMessageDialog(null, waysToCheck.get(i).getWay().getId() + " linkPrev: " + links.get(i).linkPrev + ", linkNext: " + links.get(i).linkNext); 105 //// Node firstNode = waysToCheck.get(i).getWay().firstNode(); 106 //// Node lastNode = waysToCheck.get(index) 107 //// if (i == 0 && waysToCheck.size() > 1) { 108 //// // if this is the very first way: 109 //// 110 //// } 111 // } 112 85 113 86 114 } 115 87 116 } 88 117 -
applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/GapTest.java
r32226 r32230 5 5 import java.util.ArrayList; 6 6 import java.util.List; 7 8 import javax.swing.JOptionPane; 7 9 8 10 import org.openstreetmap.josm.command.ChangeCommand; … … 26 28 public static final int ERROR_CODE_SORTING = 3711; 27 29 public static final int ERROR_CODE_OVERSHOOT = 3712; 30 public static final int ERROR_CODE_SPLITTING = 3713; 28 31 public static final int ERROR_CODE_OTHER_GAP = 3719; 29 32 … … 36 39 @Override 37 40 public void visit(Relation r) { 38 39 if (RouteUtils.isTwoDirectionRoute(r)) { 40 List<RelationMember> members = r.getMembers(); 41 final List<RelationMember> waysToCheck = new ArrayList<>(); 42 for (RelationMember member : members) { 43 44 if (RouteUtils.isPTWay(member)) { 45 waysToCheck.add(member); 46 } 47 } 48 49 if (waysToCheck.isEmpty()) { 50 return; 51 } 52 53 if (hasGap(waysToCheck)) { 54 RelationSorter sorter = new RelationSorter(); 55 List<RelationMember> correctedList = sorter.sortMembers(waysToCheck); 56 57 if (!hasGap(correctedList)) { 41 42 if (!RouteUtils.isTwoDirectionRoute(r)) { 43 return; 44 } 45 46 // boolean isComplete = RouteUtils.ensureMemberCompleteness(r); 47 // if (!isComplete) { 48 // return; 49 // } 50 51 if (RouteUtils.hasIncompleteMembers(r)) { 52 return; 53 } 54 55 List<RelationMember> members = r.getMembers(); 56 final List<RelationMember> waysToCheck = new ArrayList<>(); 57 for (RelationMember member : members) { 58 59 if (RouteUtils.isPTWay(member)) { 60 waysToCheck.add(member); 61 } 62 } 63 64 if (waysToCheck.isEmpty()) { 65 return; 66 } 67 68 if (hasGap(waysToCheck)) { 69 RelationSorter sorter = new RelationSorter(); 70 List<RelationMember> correctedList = sorter.sortMembers(waysToCheck); 71 72 if (!hasGap(correctedList)) { 73 errors.add(new TestError(this, Severity.WARNING, 74 tr("PT: Route contains a gap that can be fixed by sorting"), ERROR_CODE_SORTING, r)); 75 } else { 76 // List<RelationMember> overshoots = 77 // this.getOvershoots(correctedList); 78 // if (!overshoots.isEmpty()) { 79 // // TODO: make sure that duplicates are removed first 80 // for (RelationMember overshoot : overshoots) { 81 // List<Relation> primitives = new ArrayList<>(1); 82 // primitives.add(r); 83 // List<Way> highlighted = new ArrayList<>(1); 84 // highlighted.add(overshoot.getWay()); 85 // errors.add(new TestError(this, Severity.WARNING, tr("PT: 86 // Route contains an overshoot"), 87 // ERROR_CODE_OVERSHOOT, primitives, highlighted)); 88 // } 89 // 90 // } else { 58 91 errors.add(new TestError(this, Severity.WARNING, 59 tr("PT: Route contains a gap that can be fixed by sorting"), ERROR_CODE_SORTING, r)); 60 } else { 61 List<RelationMember> overshoots = this.getOvershoots(correctedList); 62 if (!overshoots.isEmpty()) { 63 // TODO: make sure that duplicates are removed first 64 overshootList = overshoots; 65 errors.add(new TestError(this, Severity.WARNING, tr("PT: Route contains an overshoot"), 66 ERROR_CODE_OVERSHOOT, r)); 67 } else { 68 errors.add(new TestError(this, Severity.WARNING, 69 tr("PT: Route contains a gap that cannot be fixed by sorting the ways"), 70 ERROR_CODE_OTHER_GAP, r)); 71 } 72 } 73 92 tr("PT: Route contains a gap that cannot be fixed by sorting the ways"), 93 ERROR_CODE_OTHER_GAP, r)); 94 // } 74 95 } 75 96 … … 98 119 } 99 120 } 100 101 102 121 103 122 return false; … … 191 210 } else { // stops: 192 211 if (member.getRole().equals("stop_positon")) { 193 // it is not expected that stop_positions could be relations 212 // it is not expected that stop_positions could 213 // be relations 194 214 if (member.getType().equals(OsmPrimitiveType.NODE)) { 195 215 RelationMember modifiedMember = new RelationMember("stop", member.getNode()); … … 230 250 231 251 // if the error is a single overshoot: 232 if (testError.getCode() == ERROR_CODE_OVERSHOOT) { 233 234 for (OsmPrimitive primitive : testError.getPrimitives()) { 235 Relation originalRelation = (Relation) primitive; 236 Relation modifiedRelation = new Relation(originalRelation); 237 List<RelationMember> modifiedMembers = new ArrayList<>(); 238 // add stops of a public transport route first: 239 for (RelationMember rm : originalRelation.getMembers()) { 240 if (RouteUtils.isPTStop(rm)) { 241 if (rm.hasRole("stop_position")) { 242 // it is not expected that stop_positions could be relations 243 if (rm.getType().equals(OsmPrimitiveType.NODE)) { 244 RelationMember modifiedMember = new RelationMember("stop", rm.getNode()); 245 modifiedMembers.add(modifiedMember); 246 } else { // if it is a primitive of type "way": 247 RelationMember modifiedMember = new RelationMember("stop", rm.getWay()); 248 modifiedMembers.add(modifiedMember); 249 } 250 } else { 251 modifiedMembers.add(rm); 252 } 253 254 } 255 256 } 257 // add ways of a public transport route (if they are not 258 // overshoots): 259 for (RelationMember rm : originalRelation.getMembers()) { 260 if (RouteUtils.isPTWay(rm) && !overshootList.contains(rm)) { 261 262 if (rm.getRole().equals("")) { 263 modifiedMembers.add(rm); 264 } else { 265 RelationMember modifiedMember = new RelationMember("", rm.getWay()); 266 modifiedMembers.add(modifiedMember); 267 } 268 } 269 } 270 modifiedRelation.setMembers(modifiedMembers); 271 272 ChangeCommand changeCommand = new ChangeCommand(originalRelation, modifiedRelation); 273 commands.add(changeCommand); 274 } 275 276 } 252 // if (testError.getCode() == ERROR_CODE_OVERSHOOT) { 253 // 254 // for (OsmPrimitive primitive : testError.getPrimitives()) { 255 // Relation originalRelation = (Relation) primitive; 256 // Relation modifiedRelation = new Relation(originalRelation); 257 // List<RelationMember> modifiedMembers = new ArrayList<>(); 258 // // add stops of a public transport route first: 259 // for (RelationMember rm : originalRelation.getMembers()) { 260 // if (RouteUtils.isPTStop(rm)) { 261 // if (rm.hasRole("stop_position")) { 262 // // it is not expected that stop_positions could 263 // // be relations 264 // if (rm.getType().equals(OsmPrimitiveType.NODE)) { 265 // RelationMember modifiedMember = new RelationMember("stop", rm.getNode()); 266 // modifiedMembers.add(modifiedMember); 267 // } else { // if it is a primitive of type "way": 268 // RelationMember modifiedMember = new RelationMember("stop", rm.getWay()); 269 // modifiedMembers.add(modifiedMember); 270 // } 271 // } else { 272 // modifiedMembers.add(rm); 273 // } 274 // 275 // } 276 // 277 // } 278 // // add ways of a public transport route (if they are not 279 // // overshoots): 280 // for (RelationMember rm : originalRelation.getMembers()) { 281 // if (RouteUtils.isPTWay(rm) && !overshootList.contains(rm)) { 282 // 283 // if (rm.getRole().equals("")) { 284 // modifiedMembers.add(rm); 285 // } else { 286 // RelationMember modifiedMember = new RelationMember("", rm.getWay()); 287 // modifiedMembers.add(modifiedMember); 288 // } 289 // } 290 // } 291 // modifiedRelation.setMembers(modifiedMembers); 292 // 293 // ChangeCommand changeCommand = new ChangeCommand(originalRelation, modifiedRelation); 294 // commands.add(changeCommand); 295 // } 296 // 297 // } 277 298 } 278 299 … … 294 315 @Override 295 316 public boolean isFixable(TestError testError) { 296 if (testError.getCode() == ERROR_CODE_SORTING || testError.getCode() == ERROR_CODE_OVERSHOOT) {317 if (testError.getCode() == ERROR_CODE_SORTING ) { 297 318 return true; 298 319 } -
applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/PlatformsFirstTest.java
r32209 r32230 11 11 import org.openstreetmap.josm.data.validation.Test; 12 12 import org.openstreetmap.josm.data.validation.TestError; 13 import org.openstreetmap.josm.plugins.pt_assistant.utils.RouteUtils; 13 14 14 public class PlatformsFirstTest extends Test { 15 15 public class PlatformsFirstTest extends Test { 16 16 17 public static final int ERROR_CODE = 3701; 17 18 /**19 * Constructs a new {@code InternetTags} test.20 */21 public PlatformsFirstTest() {22 super(tr("Platforms first"), tr("Checks if platforms are listed before ways in the route relation."));23 }24 25 @Override26 public void visit(Relation r) {27 28 if (r.hasKey("route")) {29 18 30 List<RelationMember> members = r.getMembers(); 31 RelationMember prevMember = null; 32 for (RelationMember currMember: members) { 33 if (prevMember != null) { 34 // check if the current member is a platform, while the previous member is a way: 35 if (currMember.hasRole("platform") && prevMember.getType().equals(OsmPrimitiveType.WAY) && prevMember.hasRole("")) { 36 this.errors.add(new TestError(this, Severity.WARNING, tr("PT: route relation(s) contain(s) way(s) before platform(s) in the members list"), ERROR_CODE, r)); 37 return; 38 } 39 } 40 prevMember = currMember; 41 } 42 } 43 } 19 /** 20 * Constructs a new {@code InternetTags} test. 21 */ 22 public PlatformsFirstTest() { 23 super(tr("Platforms first"), tr("Checks if platforms are listed before ways in the route relation.")); 24 } 25 26 @Override 27 public void visit(Relation r) { 28 29 if (RouteUtils.isTwoDirectionRoute(r)) { 30 31 List<RelationMember> members = r.getMembers(); 32 RelationMember prevMember = null; 33 for (RelationMember currMember : members) { 34 if (prevMember != null) { 35 // check if the current member is a platform, while the 36 // previous member is a way: 37 if (currMember.hasRole("platform") && prevMember.getType().equals(OsmPrimitiveType.WAY) 38 && prevMember.hasRole("")) { 39 this.errors.add(new TestError(this, Severity.WARNING, 40 tr("PT: route relation(s) contain(s) way(s) before platform(s) in the members list"), 41 ERROR_CODE, r)); 42 return; 43 } 44 } 45 prevMember = currMember; 46 } 47 } 48 } 44 49 } -
applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/RoadTypeTest.java
r32226 r32230 31 31 public void visit(Relation r) { 32 32 33 if (RouteUtils.isTwoDirectionRoute(r)) { 34 35 List<RelationMember> members = r.getMembers();33 if (!RouteUtils.isTwoDirectionRoute(r)) { 34 return; 35 } 36 36 37 for (RelationMember rm : members) { 38 if (RouteUtils.isPTWay(rm)) { 39 40 Way way = rm.getWay(); 41 // at this point, the relation has already been checked to 42 // be a route of public_transport:version 2 43 boolean isCorrectRoadType = true; 44 if (r.hasTag("route", "bus") || r.hasTag("route", "share_taxi")) { 45 if (way.getId()==388339788 || way.getId() == 388339789) { 37 // boolean isComplete = RouteUtils.ensureMemberCompleteness(r); 38 // if (!isComplete) { 39 // return; 40 // } 41 42 if (RouteUtils.hasIncompleteMembers(r)) { 43 return; 44 } 45 46 List<RelationMember> members = r.getMembers(); 46 47 47 } 48 if (!RouteUtils.isWaySuitableForBuses(way)) { 49 isCorrectRoadType = false; 50 } 51 } else if (r.hasTag("route", "trolleybus")) { 52 if (!(RouteUtils.isWaySuitableForBuses(way) && way.hasTag("trolley_wire", "yes"))) { 53 isCorrectRoadType = false; 54 } 55 } else if (r.hasTag("route", "tram")) { 56 if (!r.hasTag("railway", "tram")) { 57 isCorrectRoadType = false; 58 } 59 } else if (r.hasTag("route", "subway")) { 60 if (!r.hasTag("railway", "subway")) { 61 isCorrectRoadType = false; 62 } 63 } else if (r.hasTag("route", "light_rail")) { 64 if (!r.hasTag("raiilway", "subway")) { 65 isCorrectRoadType = false; 66 } 67 } else if (r.hasTag("route", "light_rail")) { 68 if (!r.hasTag("railway", "light_rail")) { 69 isCorrectRoadType = false; 70 } 71 } else if (r.hasTag("route", "train")) { 72 if (!r.hasTag("railway", "train")) { 73 isCorrectRoadType = false; 74 } 48 for (RelationMember rm : members) { 49 if (RouteUtils.isPTWay(rm)) { 50 51 Way way = rm.getWay(); 52 // at this point, the relation has already been checked to 53 // be a route of public_transport:version 2 54 boolean isCorrectRoadType = true; 55 if (r.hasTag("route", "bus") || r.hasTag("route", "share_taxi")) { 56 if (!RouteUtils.isWaySuitableForBuses(way)) { 57 isCorrectRoadType = false; 75 58 } 59 } else if (r.hasTag("route", "trolleybus")) { 60 if (!(RouteUtils.isWaySuitableForBuses(way) && way.hasTag("trolley_wire", "yes"))) { 61 isCorrectRoadType = false; 62 } 63 } else if (r.hasTag("route", "tram")) { 64 if (!r.hasTag("railway", "tram")) { 65 isCorrectRoadType = false; 66 } 67 } else if (r.hasTag("route", "subway")) { 68 if (!r.hasTag("railway", "subway")) { 69 isCorrectRoadType = false; 70 } 71 } else if (r.hasTag("route", "light_rail")) { 72 if (!r.hasTag("raiilway", "subway")) { 73 isCorrectRoadType = false; 74 } 75 } else if (r.hasTag("route", "light_rail")) { 76 if (!r.hasTag("railway", "light_rail")) { 77 isCorrectRoadType = false; 78 } 79 } else if (r.hasTag("route", "train")) { 80 if (!r.hasTag("railway", "train")) { 81 isCorrectRoadType = false; 82 } 83 } 76 84 77 if (!isCorrectRoadType) { 78 79 List<OsmPrimitive> primitiveList = new ArrayList<>(2); 80 primitiveList.add(0, r); 81 primitiveList.add(1, way); 82 83 errors.add(new TestError(this, Severity.WARNING, 84 tr("PT: Route type does not match the type of the road it passes on"), 85 ERROR_CODE_ROAD_TYPE, primitiveList)); 86 } 85 if (!isCorrectRoadType) { 87 86 87 List<Relation> primitives = new ArrayList<>(1); 88 primitives.add(r); 89 List<Way> highlighted = new ArrayList<>(1); 90 highlighted.add(way); 91 errors.add(new TestError(this, Severity.WARNING, 92 tr("PT: Route type does not match the type of the road it passes on"), ERROR_CODE_ROAD_TYPE, 93 primitives, highlighted)); 88 94 } 95 89 96 } 90 97 } 98 91 99 } 92 100 … … 97 105 98 106 if (testError.getTester().getClass().equals(RoadTypeTest.class) && testError.isFixable()) { 99 List<OsmPrimitive> primitiveList = (List<OsmPrimitive>) testError.getPrimitives(); 100 Relation originalRelation = (Relation) primitiveList.get(0); 101 Way wayToRemove = (Way) primitiveList.get(1); 102 107 List<OsmPrimitive> primitives = (List<OsmPrimitive>) testError.getPrimitives(); 108 Relation originalRelation = (Relation) primitives.get(0); 109 List<OsmPrimitive> highlighted = (List<OsmPrimitive>) testError.getHighlighted(); 110 Way wayToRemove = (Way) highlighted.get(0); 111 103 112 Relation modifiedRelation = new Relation(originalRelation); 104 List<RelationMember> modifiedRelationMembers = new ArrayList<>(originalRelation.getMembersCount() -1);105 113 List<RelationMember> modifiedRelationMembers = new ArrayList<>(originalRelation.getMembersCount() - 1); 114 106 115 // copy PT stops first, PT ways last: 107 for (RelationMember rm: originalRelation.getMembers()) { 116 for (RelationMember rm : originalRelation.getMembers()) { 108 117 if (RouteUtils.isPTStop(rm)) { 109 118 110 119 if (rm.getRole().equals("stop_position")) { 111 120 if (rm.getType().equals(OsmPrimitiveType.NODE)) { … … 116 125 modifiedRelationMembers.add(newMember); 117 126 } 118 } else { 119 // if the relation member does not have the role "stop_position": 127 } else { 128 // if the relation member does not have the role 129 // "stop_position": 120 130 modifiedRelationMembers.add(rm); 121 131 } 122 123 } 132 133 } 124 134 } 125 135 126 136 // now copy PT ways: 127 for (RelationMember rm: originalRelation.getMembers()) { 137 for (RelationMember rm : originalRelation.getMembers()) { 128 138 if (RouteUtils.isPTWay(rm)) { 129 139 Way wayToCheck = rm.getWay(); … … 138 148 } 139 149 } 140 150 141 151 modifiedRelation.setMembers(modifiedRelationMembers); 142 152 143 153 ChangeCommand changeCommand = new ChangeCommand(originalRelation, modifiedRelation); 144 154 commands.add(changeCommand); 145 155 146 156 } 147 157 148 158 if (commands.isEmpty()) { 149 159 return null; … … 153 163 return commands.get(0); 154 164 } 155 156 165 157 return new SequenceCommand(tr("Remove way from route if it does not match the route type"), commands); 158 166 return new SequenceCommand(tr("Remove way from route if it does not match the route type"), commands); 167 159 168 } 160 169 … … 167 176 return true; 168 177 } 169 return false; 178 return false; 170 179 } 171 180
Note:
See TracChangeset
for help on using the changeset viewer.