Changeset 36217 in osm for applications/editors/josm/plugins/reltoolbox/src/relcontext/actions/ReconstructRouteAction.java
- Timestamp:
- 2024-03-03T10:25:25+01:00 (22 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/reltoolbox/src/relcontext/actions/ReconstructRouteAction.java
r36102 r36217 13 13 import javax.swing.AbstractAction; 14 14 15 import org.openstreetmap.josm.command.ChangeCommand; 16 import org.openstreetmap.josm.command.Command; 15 import org.openstreetmap.josm.command.ChangeMembersCommand; 17 16 import org.openstreetmap.josm.data.UndoRedoHandler; 18 17 import org.openstreetmap.josm.data.coor.EastNorth; … … 35 34 */ 36 35 public class ReconstructRouteAction extends AbstractAction implements ChosenRelationListener { 37 private final ChosenRelation rel; 38 36 private final transient ChosenRelation rel; 37 38 /** 39 * Reconstruct route relation to scheme of public_transport. 40 * @param rel chosen relation 41 */ 39 42 public ReconstructRouteAction(ChosenRelation rel) { 40 43 super(tr("Reconstruct route")); … … 49 52 public void actionPerformed(ActionEvent e) { 50 53 Relation r = rel.get(); 51 Relation recRel = new Relation(r); 52 recRel.removeMembersFor(recRel.getMemberPrimitives()); 54 List<RelationMember> recMembers = new ArrayList<>(); 53 55 54 56 Map<OsmPrimitive, RelationMember> stopMembers = new LinkedHashMap<>(); … … 118 120 nIndex += increment) { 119 121 Node refNode = w.getNode(nIndex); 120 if (PublicTransportHelper.isNodeStop(refNode)) { 121 if (stopMembers.containsKey(refNode)) { 122 recRel.addMember(stopMembers.get(refNode)); 123 stopMembers.remove(refNode); 124 String stopName = PublicTransportHelper.getNameViaStoparea(refNode); 125 if (stopName == null) { 126 stopName = ""; 122 if (!(PublicTransportHelper.isNodeStop(refNode) && stopMembers.containsKey(refNode))) 123 continue; 124 recMembers.add(stopMembers.get(refNode)); 125 stopMembers.remove(refNode); 126 String stopName = PublicTransportHelper.getNameViaStoparea(refNode); 127 if (stopName == null) { 128 stopName = ""; 129 } 130 boolean existsPlatform = platformMembers.containsKey(stopName); 131 if (!existsPlatform) { 132 stopName = ""; // find of the nameless 133 } 134 if (existsPlatform || platformMembers.containsKey(stopName)) { 135 List<RelationMember> lMember = platformMembers.get(stopName); 136 if (lMember.size() == 1) { 137 recMembers.add(lMember.get(0)); 138 lMember.remove(0); 139 } else { 140 // choose closest 141 RelationMember candidat = getClosestPlatform(lMember, refNode); 142 if (candidat != null) { 143 recMembers.add(candidat); 144 lMember.remove(candidat); 127 145 } 128 boolean existsPlatform = platformMembers.containsKey(stopName); 129 if (!existsPlatform) { 130 stopName = ""; // find of the nameless 131 } 132 if (existsPlatform || platformMembers.containsKey(stopName)) { 133 List<RelationMember> lMember = platformMembers.get(stopName); 134 if (lMember.size() == 1) { 135 recRel.addMember(lMember.get(0)); 136 lMember.remove(0); 137 } else { 138 // choose closest 139 RelationMember candidat = getClosestPlatform(lMember, refNode); 140 if (candidat != null) { 141 recRel.addMember(candidat); 142 lMember.remove(candidat); 143 } 144 } 145 if (lMember.isEmpty()) { 146 platformMembers.remove(stopName); 147 } 148 } 146 } 147 if (lMember.isEmpty()) { 148 platformMembers.remove(stopName); 149 149 } 150 150 } … … 153 153 154 154 for (RelationMember stop : stopMembers.values()) { 155 rec Rel.addMember(stop);155 recMembers.add(stop); 156 156 String stopName = PublicTransportHelper.getNameViaStoparea(stop); 157 157 boolean existsPlatform = platformMembers.containsKey(stopName); … … 162 162 List<RelationMember> lMember = platformMembers.get(stopName); 163 163 if (lMember.size() == 1) { 164 rec Rel.addMember(lMember.get(0));164 recMembers.add(lMember.get(0)); 165 165 lMember.remove(0); 166 166 } else { … … 168 168 RelationMember candidat = getClosestPlatform(lMember, stop.getNode()); 169 169 if (candidat != null) { 170 rec Rel.addMember(candidat);170 recMembers.add(candidat); 171 171 lMember.remove(candidat); 172 172 } … … 180 180 for (List<RelationMember> lPlatforms : platformMembers.values()) { 181 181 for (RelationMember platform : lPlatforms) { 182 rec Rel.addMember(platform);182 recMembers.add(platform); 183 183 } 184 184 } 185 185 186 186 for (RelationMember route : routeMembers) { 187 rec Rel.addMember(route);187 recMembers.add(route); 188 188 } 189 189 for (RelationMember wtf : wtfMembers) { 190 recRel.addMember(wtf); 191 } 192 Command command = new ChangeCommand(r, recRel); 193 UndoRedoHandler.getInstance().add(command); 190 recMembers.add(wtf); 191 } 192 UndoRedoHandler.getInstance().add(new ChangeMembersCommand(r, recMembers)); 194 193 } 195 194 196 195 private static final double maxSqrDistBetweenStopAndPlatform = 2000; // ~ 26m 197 private RelationMember getClosestPlatform(List<RelationMember> members, Node stop) { 196 197 private static RelationMember getClosestPlatform(List<RelationMember> members, Node stop) { 198 198 if (stop == null || members.isEmpty()) return null; 199 199 double maxDist = maxSqrDistBetweenStopAndPlatform; … … 229 229 } 230 230 231 private boolean isSuitableRelation(Relation newRelation) { 231 private static boolean isSuitableRelation(Relation newRelation) { 232 232 return !(newRelation == null || !"route".equals(newRelation.get("type")) || newRelation.getMembersCount() == 0); 233 233 }
Note:
See TracChangeset
for help on using the changeset viewer.
