Changeset 32395 in osm for applications/editors/josm/plugins/reltoolbox/src/relcontext/actions/ReconstructRouteAction.java
- Timestamp:
- 2016-06-24T09:10:57+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/reltoolbox/src/relcontext/actions/ReconstructRouteAction.java
r30841 r32395 1 // License: GPL. For details, see LICENSE file. 1 2 package relcontext.actions; 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 2 5 3 6 import java.awt.event.ActionEvent; … … 6 9 import java.util.List; 7 10 import java.util.Map; 11 8 12 import javax.swing.AbstractAction; 9 import static javax.swing.Action.LONG_DESCRIPTION; 10 import static javax.swing.Action.SMALL_ICON; 13 11 14 import org.openstreetmap.josm.Main; 12 15 import org.openstreetmap.josm.command.ChangeCommand; … … 21 24 import org.openstreetmap.josm.gui.dialogs.relation.sort.RelationSorter; 22 25 import org.openstreetmap.josm.tools.Geometry; 23 import static org.openstreetmap.josm.tools.I18n.tr;24 26 import org.openstreetmap.josm.tools.ImageProvider; 27 25 28 import relcontext.ChosenRelation; 26 29 import relcontext.ChosenRelationListener; … … 32 35 public class ReconstructRouteAction extends AbstractAction implements ChosenRelationListener { 33 36 private final ChosenRelation rel; 34 37 35 38 public ReconstructRouteAction (ChosenRelation rel) { 36 39 super(tr("Reconstruct route")); … … 41 44 setEnabled(isSuitableRelation(rel.get())); 42 45 } 43 44 public void actionPerformed( ActionEvent e ) { 46 47 @Override 48 public void actionPerformed(ActionEvent e) { 45 49 Relation r = rel.get(); 46 Relation recRel = new Relation(r); 50 Relation recRel = new Relation(r); 47 51 recRel.removeMembersFor(recRel.getMemberPrimitives()); 48 52 49 53 Map<OsmPrimitive, RelationMember> stopMembers = new LinkedHashMap<>(); 50 54 Map<String, List<RelationMember>> platformMembers = new LinkedHashMap<>(); … … 52 56 List<RelationMember> routeMembers = new ArrayList<>(); 53 57 List<RelationMember> wtfMembers = new ArrayList<>(); 54 58 55 59 int mCount = r.getMembersCount(); 56 60 for (int i = 0; i < mCount; i++) { … … 58 62 if (PublicTransportHelper.isMemberStop(m)) { 59 63 RelationMember rm = new RelationMember( 60 m.hasRole() ? m.getRole() : PublicTransportHelper.STOP, 61 m.getMember()); 64 m.hasRole() ? m.getRole() : PublicTransportHelper.STOP, 65 m.getMember()); 62 66 stopMembers.put(rm.getMember(), rm); 63 67 } 64 68 else if (PublicTransportHelper.isMemberPlatform(m)) { 65 69 RelationMember rm = new RelationMember( 66 m.hasRole() ? m.getRole() : PublicTransportHelper.PLATFORM, 67 m.getMember()); 70 m.hasRole() ? m.getRole() : PublicTransportHelper.PLATFORM, 71 m.getMember()); 68 72 String platformName = PublicTransportHelper.getNameViaStoparea(rm); 69 if (platformName == null) platformName = ""; 70 if (platformMembers.containsKey(platformName)) platformMembers.get(platformName).add(rm); 71 else { 73 if (platformName == null) { 74 platformName = ""; 75 } 76 if (platformMembers.containsKey(platformName)) { 77 platformMembers.get(platformName).add(rm); 78 } else { 72 79 List<RelationMember> nList = new ArrayList<>(); 73 80 nList.add(rm); 74 81 platformMembers.put(platformName, nList); 75 } 76 } 77 else if (PublicTransportHelper.isMemberRouteway(m)) routeMembers.add(new RelationMember(m)); 78 else wtfMembers.add(new RelationMember(m)); 79 } 80 82 } 83 } 84 else if (PublicTransportHelper.isMemberRouteway(m)) { 85 routeMembers.add(new RelationMember(m)); 86 } else { 87 wtfMembers.add(new RelationMember(m)); 88 } 89 } 90 81 91 routeMembers = RelationSorter.sortMembersByConnectivity(routeMembers); 82 92 83 93 Node lastNode = null; 84 94 for (int rIndex = 0; rIndex < routeMembers.size(); rIndex++) { … … 91 101 dirForward = true; 92 102 lastNode = w.lastNode(); 93 } else lastNode = w.firstNode(); 103 } else { 104 lastNode = w.firstNode(); 105 } 94 106 } // else one segment - direction unknown 95 107 } else { 96 if (lastNode.equals(w.firstNode())) { dirForward = true; lastNode = w.lastNode(); } 97 else lastNode = w.firstNode(); 108 if (lastNode.equals(w.firstNode())) { dirForward = true; lastNode = w.lastNode(); } else { 109 lastNode = w.firstNode(); 110 } 98 111 } 99 112 final int wayNodeBeginIndex = (dirForward ? 0 : w.getNodesCount() - 1); 100 113 final int wayNodeEndIndex = (dirForward ? w.getNodesCount() - 1 : 0); 101 114 final int increment = (dirForward ? 1 : -1); 102 for(int nIndex = wayNodeBeginIndex; 115 for (int nIndex = wayNodeBeginIndex; 103 116 nIndex != wayNodeEndIndex; 104 117 nIndex += increment) { … … 109 122 stopMembers.remove(refNode); 110 123 String stopName = PublicTransportHelper.getNameViaStoparea(refNode); 111 if (stopName == null) stopName = ""; 124 if (stopName == null) { 125 stopName = ""; 126 } 112 127 boolean existsPlatform = platformMembers.containsKey(stopName); 113 128 if (!existsPlatform) { stopName = ""; } // find of the nameless … … 118 133 lMember.remove(0); 119 134 } else { 120 // choose closest 135 // choose closest 121 136 RelationMember candidat = getClosestPlatform(lMember, refNode); 122 137 if (candidat != null) { … … 125 140 } 126 141 } 127 if (lMember.isEmpty()) platformMembers.remove(stopName); 142 if (lMember.isEmpty()) { 143 platformMembers.remove(stopName); 144 } 128 145 } 129 146 } … … 131 148 } 132 149 } 133 150 134 151 for (RelationMember stop : stopMembers.values()) { 135 152 recRel.addMember(stop); … … 137 154 boolean existsPlatform = platformMembers.containsKey(stopName); 138 155 if (!existsPlatform) { stopName = ""; } // find of the nameless 139 if (existsPlatform || platformMembers.containsKey(stopName)) { 156 if (existsPlatform || platformMembers.containsKey(stopName)) { 140 157 List<RelationMember> lMember = platformMembers.get(stopName); 141 158 if (lMember.size() == 1) { … … 143 160 lMember.remove(0); 144 161 } else { 145 // choose closest 162 // choose closest 146 163 RelationMember candidat = getClosestPlatform(lMember, stop.getNode()); 147 164 if (candidat != null) { … … 150 167 } 151 168 } 152 if (lMember.isEmpty()) platformMembers.remove(stopName); 153 } 154 } 155 156 for (List<RelationMember> lPlatforms : platformMembers.values()) 157 for (RelationMember platform : lPlatforms) 169 if (lMember.isEmpty()) { 170 platformMembers.remove(stopName); 171 } 172 } 173 } 174 175 for (List<RelationMember> lPlatforms : platformMembers.values()) { 176 for (RelationMember platform : lPlatforms) { 158 177 recRel.addMember(platform); 159 160 for (RelationMember route : routeMembers) 178 } 179 } 180 181 for (RelationMember route : routeMembers) { 161 182 recRel.addMember(route); 162 for (RelationMember wtf : wtfMembers) 163 recRel.addMember(wtf); 183 } 184 for (RelationMember wtf : wtfMembers) { 185 recRel.addMember(wtf); 186 } 164 187 Command command = new ChangeCommand(r, recRel); 165 188 Main.main.undoRedo.add(command); 166 189 } 167 168 private static final double maxSqrDistBetweenStopAndPlatform = 2000; // ~ 26m 190 191 private static final double maxSqrDistBetweenStopAndPlatform = 2000; // ~ 26m 169 192 private RelationMember getClosestPlatform(List<RelationMember> members, Node stop) { 170 193 if (stop == null || members.isEmpty()) return null; … … 182 205 Way way = member.getWay(); 183 206 EastNorth closest = Geometry.closestPointToSegment( 184 185 186 187 ); 207 way.firstNode().getEastNorth(), 208 way.lastNode().getEastNorth(), 209 stop.getEastNorth() 210 ); 188 211 double sqrDist = stop.getEastNorth().distanceSq(closest); 189 212 if (sqrDist < maxDist) { … … 195 218 return result; 196 219 } 197 198 public void chosenRelationChanged( Relation oldRelation, Relation newRelation ) { 199 setEnabled(isSuitableRelation(newRelation)); 200 } 201 220 221 @Override 222 public void chosenRelationChanged(Relation oldRelation, Relation newRelation) { 223 setEnabled(isSuitableRelation(newRelation)); 224 } 225 202 226 private boolean isSuitableRelation (Relation newRelation) { 203 227 return !(newRelation == null || !"route".equals(newRelation.get("type")) || newRelation.getMembersCount() == 0);
Note:
See TracChangeset
for help on using the changeset viewer.