Changeset 36217 in osm for applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix
- Timestamp:
- 2024-03-03T10:25:25+01:00 (13 months ago)
- Location:
- applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/AssociatedStreetFixer.java
r36103 r36217 5 5 6 6 import java.util.ArrayList; 7 import java.util.Collections; 7 8 import java.util.HashMap; 8 9 import java.util.List; 9 10 import java.util.Map; 10 11 11 import org.openstreetmap.josm.command.ChangeCommand; 12 import org.openstreetmap.josm.command.ChangeMembersCommand; 13 import org.openstreetmap.josm.command.ChangePropertyCommand; 12 14 import org.openstreetmap.josm.command.Command; 13 15 import org.openstreetmap.josm.command.SequenceCommand; … … 23 25 public class AssociatedStreetFixer extends RelationFixer { 24 26 27 private static final String ADDR_HOUSENUMBER = "addr:housenumber"; 28 private static final String BUILDING = "building"; 29 private static final String HOUSE = "house"; 30 private static final String STREET = "street"; 31 25 32 public AssociatedStreetFixer() { 26 33 super("associatedStreet"); … … 30 37 public boolean isRelationGood(Relation rel) { 31 38 for (RelationMember m : rel.getMembers()) { 32 if (m.getType() .equals(OsmPrimitiveType.NODE) && !"house".equals(m.getRole())) {39 if (m.getType() == OsmPrimitiveType.NODE && !HOUSE.equals(m.getRole())) { 33 40 setWarningMessage(tr("Node without ''house'' role found")); 34 41 return false; 35 42 } 36 if (m.getType() .equals(OsmPrimitiveType.WAY) && !("house".equals(m.getRole()) ||"street".equals(m.getRole()))) {43 if (m.getType() == OsmPrimitiveType.WAY && !(HOUSE.equals(m.getRole()) || STREET.equals(m.getRole()))) { 37 44 setWarningMessage(tr("Way without ''house'' or ''street'' role found")); 38 45 return false; 39 46 } 40 if (m.getType() .equals(OsmPrimitiveType.RELATION) && !"house".equals(m.getRole())) {47 if (m.getType() == OsmPrimitiveType.RELATION && !HOUSE.equals(m.getRole())) { 41 48 setWarningMessage(tr("Relation without ''house'' role found")); 42 49 return false; … … 54 61 } 55 62 for (RelationMember m : rel.getMembers()) { 56 if ( "street".equals(m.getRole()) && !streetName.equals(m.getWay().get("name"))) {63 if (STREET.equals(m.getRole()) && !streetName.equals(m.getWay().get("name"))) { 57 64 String anotherName = m.getWay().get("name"); 58 65 if (anotherName != null && !anotherName.isEmpty()) { … … 72 79 // name - check which name is most used in street members and add to relation 73 80 // copy this name to the other street members (???) 74 Relation rel = new Relation(source);81 List<RelationMember> members = source.getMembers(); 75 82 boolean fixed = false; 76 83 77 for (int i = 0; i < rel.getMembersCount(); i++) { 78 RelationMember m = rel.getMember(i); 79 84 for (int i = 0; i < members.size(); i++) { 85 RelationMember m = members.get(i); 80 86 if (m.isNode()) { 81 87 Node node = m.getNode(); 82 if (! "house".equals(m.getRole()) &&83 (node.hasKey( "building") || node.hasKey("addr:housenumber"))) {88 if (!HOUSE.equals(m.getRole()) && 89 (node.hasKey(BUILDING) || node.hasKey(ADDR_HOUSENUMBER))) { 84 90 fixed = true; 85 rel.setMember(i, new RelationMember("house", node));91 members.set(i, new RelationMember(HOUSE, node)); 86 92 } 87 93 } else if (m.isWay()) { 88 94 Way way = m.getWay(); 89 if (! "street".equals(m.getRole()) && way.hasKey("highway")) {95 if (!STREET.equals(m.getRole()) && way.hasKey("highway")) { 90 96 fixed = true; 91 rel.setMember(i, new RelationMember("street", way));92 } else if (! "house".equals(m.getRole()) &&93 (way.hasKey( "building") || way.hasKey("addr:housenumber"))) {97 members.set(i, new RelationMember(STREET, way)); 98 } else if (!HOUSE.equals(m.getRole()) && 99 (way.hasKey(BUILDING) || way.hasKey(ADDR_HOUSENUMBER))) { 94 100 fixed = true; 95 rel.setMember(i, new RelationMember("house", way));101 members.set(i, new RelationMember(HOUSE, way)); 96 102 } 97 103 } else if (m.isRelation()) { 98 104 Relation relation = m.getRelation(); 99 if (! "house".equals(m.getRole()) &&100 (relation.hasKey( "building") || relation.hasKey("addr:housenumber") || "multipolygon".equals(relation.get("type")))) {105 if (!HOUSE.equals(m.getRole()) && 106 (relation.hasKey(BUILDING) || relation.hasKey(ADDR_HOUSENUMBER) || "multipolygon".equals(relation.get("type")))) { 101 107 fixed = true; 102 rel.setMember(i, new RelationMember("house", relation));108 members.set(i, new RelationMember(HOUSE, relation)); 103 109 } 104 110 } … … 107 113 // fill relation name 108 114 Map<String, Integer> streetNames = new HashMap<>(); 109 for (RelationMember m : rel.getMembers()) {110 if ( "street".equals(m.getRole()) && m.isWay()) {115 for (RelationMember m : members) { 116 if (STREET.equals(m.getRole()) && m.isWay()) { 111 117 String name = m.getWay().get("name"); 112 118 if (name == null || name.isEmpty()) { 113 119 continue; 114 120 } 115 116 121 Integer count = streetNames.get(name); 117 118 122 streetNames.put(name, count != null ? count + 1 : 1); 119 123 } … … 128 132 } 129 133 130 if (!rel.hasKey("name") && !commonName.isEmpty()) { 131 fixed = true; 132 rel.put("name", commonName); 133 } else { 134 commonName = ""; // set empty common name - if we already have name on relation, do not overwrite it 134 Map<String, String> nameTag = new HashMap<>(); 135 if (!source.hasKey("name") && !commonName.isEmpty()) { 136 nameTag.put("name", commonName); 135 137 } 136 138 137 139 List<Command> commandList = new ArrayList<>(); 140 final DataSet ds = Utils.firstNonNull(source.getDataSet(), MainApplication.getLayerManager().getEditDataSet()); 138 141 if (fixed) { 139 final DataSet ds = Utils.firstNonNull(source.getDataSet(), MainApplication.getLayerManager().getEditDataSet()); 140 commandList.add(new ChangeCommand(ds, source, rel)); 142 commandList.add(new ChangeMembersCommand(ds, source, members)); 143 } 144 if (!nameTag.isEmpty()) { 145 commandList.add(new ChangePropertyCommand(ds, Collections.singleton(source), nameTag)); 141 146 } 142 147 143 /*if (!commonName.isEmpty())144 // fill common name to streets145 for (RelationMember m : rel.getMembers())146 if ("street".equals(m.getRole()) && m.isWay()) {147 String name = m.getWay().get("name");148 if (commonName.equals(name)) continue;149 150 // TODO: ask user if he really wants to overwrite street name??151 152 Way oldWay = m.getWay();153 Way newWay = new Way(oldWay);154 newWay.put("name", commonName);155 156 commandList.add(new ChangeCommand(MainApplication.getLayerManager().getEditDataSet(), oldWay, newWay));157 }158 */159 148 // return results 160 if (commandList.isEmpty()) {149 if (commandList.isEmpty()) 161 150 return null; 162 }163 151 return SequenceCommand.wrapIfNeeded(tr("fix associatedStreet relation"), commandList); 164 152 } -
applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/BoundaryFixer.java
r36103 r36217 4 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 5 6 import org.openstreetmap.josm.command.ChangeCommand; 6 import java.util.ArrayList; 7 import java.util.List; 8 9 import org.openstreetmap.josm.command.ChangeMembersCommand; 7 10 import org.openstreetmap.josm.command.Command; 8 11 import org.openstreetmap.josm.data.osm.DataSet; … … 37 40 public boolean isRelationGood(Relation rel) { 38 41 for (RelationMember m : rel.getMembers()) { 39 if (m.getType() .equals(OsmPrimitiveType.RELATION)&& !"subarea".equals(m.getRole())) {42 if (m.getType() == OsmPrimitiveType.RELATION && !"subarea".equals(m.getRole())) { 40 43 setWarningMessage(tr("Relation without ''subarea'' role found")); 41 44 return false; 42 45 } 43 if (m.getType() .equals(OsmPrimitiveType.NODE)&& !("label".equals(m.getRole()) || "admin_centre".equals(m.getRole()))) {46 if (m.getType() == OsmPrimitiveType.NODE && !("label".equals(m.getRole()) || "admin_centre".equals(m.getRole()))) { 44 47 setWarningMessage(tr("Node without ''label'' or ''admin_centre'' role found")); 45 48 return false; 46 49 } 47 if (m.getType() .equals(OsmPrimitiveType.WAY)&& !("outer".equals(m.getRole()) || "inner".equals(m.getRole()))) {50 if (m.getType() == OsmPrimitiveType.WAY && !("outer".equals(m.getRole()) || "inner".equals(m.getRole()))) { 48 51 setWarningMessage(tr("Way without ''inner'' or ''outer'' role found")); 49 52 return false; … … 56 59 @Override 57 60 public Command fixRelation(Relation rel) { 58 Relation r = rel; 59 Relation rr = fixMultipolygonRoles(r); 60 boolean fixed = false; 61 if (rr != null) { 62 fixed = true; 63 r = rr; 61 List<RelationMember> members = fixMultipolygonRoles(rel.getMembers()); 62 if (members.isEmpty()) { 63 members = rel.getMembers(); 64 64 } 65 rr = fixBoundaryRoles(r); 66 if (rr != null) { 67 fixed = true; 68 r = rr; 69 } 70 if (fixed) { 65 members = fixBoundaryRoles(members); 66 if (!members.equals(rel.getMembers())) { 71 67 final DataSet ds = Utils.firstNonNull(rel.getDataSet(), MainApplication.getLayerManager().getEditDataSet()); 72 return new ChangeCommand(ds, rel, r);68 return new ChangeMembersCommand(ds, rel, members); 73 69 } 74 70 return null; 75 71 } 76 72 77 private Relation fixBoundaryRoles(Relation source) { 78 Relation r = new Relation(source); 79 boolean fixed = false; 80 for (int i = 0; i < r.getMembersCount(); i++) { 81 RelationMember m = r.getMember(i); 73 /** 74 * Possibly change roles of non-way members. 75 * @param origMembers original list of relation members 76 * @return either the original and unmodified list or a new one with at least one new item 77 */ 78 private static List<RelationMember> fixBoundaryRoles(List<RelationMember> origMembers) { 79 List<RelationMember> members = origMembers; 80 for (int i = 0; i < members.size(); i++) { 81 RelationMember m = members.get(i); 82 82 String role = null; 83 83 if (m.isRelation()) { 84 84 role = "subarea"; 85 } else if (m.isNode()) { 85 } else if (m.isNode() && !m.getMember().isIncomplete()) { 86 86 Node n = (Node) m.getMember(); 87 if (!n.isIncomplete()) { 88 if (n.hasKey("place")) { 89 String place = n.get("place"); 90 if (place.equals("state") || place.equals("country") || 91 place.equals("county") || place.equals("region")) { 92 role = "label"; 93 } else { 94 role = "admin_centre"; 95 } 87 if (n.hasKey("place")) { 88 String place = n.get("place"); 89 if ("state".equals(place) || "country".equals(place) || 90 "county".equals(place) || "region".equals(place)) { 91 role = "label"; 96 92 } else { 97 role = " label";93 role = "admin_centre"; 98 94 } 95 } else { 96 role = "label"; 99 97 } 100 98 } 101 99 if (role != null && !role.equals(m.getRole())) { 102 r.setMember(i, new RelationMember(role, m.getMember())); 103 fixed = true; 100 if (members == origMembers) { 101 members = new ArrayList<>(origMembers); // don't modify original list 102 } 103 members.set(i, new RelationMember(role, m.getMember())); 104 104 } 105 105 } 106 return fixed ? r : null;106 return members; 107 107 } 108 108 } -
applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/MultipolygonFixer.java
r36103 r36217 5 5 6 6 import java.util.ArrayList; 7 import java.util.Collection; 7 import java.util.Collections; 8 8 import java.util.HashSet; 9 import java.util.List; 9 10 import java.util.Set; 11 import java.util.stream.Collectors; 10 12 11 import org.openstreetmap.josm.command.ChangeCommand; 13 import org.openstreetmap.josm.command.ChangeMembersCommand; 12 14 import org.openstreetmap.josm.command.Command; 13 15 import org.openstreetmap.josm.data.osm.DataSet; … … 29 31 } 30 32 31 protected MultipolygonFixer(String...types) { 33 protected MultipolygonFixer(String... types) { 32 34 super(types); 33 35 } … … 36 38 public boolean isRelationGood(Relation rel) { 37 39 for (RelationMember m : rel.getMembers()) { 38 if (m.getType() .equals(OsmPrimitiveType.WAY)&& !("outer".equals(m.getRole()) || "inner".equals(m.getRole()))) {40 if (m.getType() == OsmPrimitiveType.WAY && !("outer".equals(m.getRole()) || "inner".equals(m.getRole()))) { 39 41 setWarningMessage(tr("Way without ''inner'' or ''outer'' role found")); 40 42 return false; … … 47 49 @Override 48 50 public Command fixRelation(Relation rel) { 49 Relation rr= fixMultipolygonRoles(rel);50 if ( rr != null) {51 List<RelationMember> members = fixMultipolygonRoles(rel.getMembers()); 52 if (!members.equals(rel.getMembers())) { 51 53 final DataSet ds = Utils.firstNonNull(rel.getDataSet(), MainApplication.getLayerManager().getEditDataSet()); 52 return new ChangeCommand(ds, rel, rr);54 return new ChangeMembersCommand(ds, rel, members); 53 55 } 54 56 return null; … … 56 58 57 59 /** 58 * Basically, created multipolygon from scratch, and if successful, replace roles with new ones. 60 * Basically, create member list of a multipolygon from scratch, and if 61 * successful, replace roles with new ones. 62 * 63 * @param origMembers original list of relation members 64 * @return either the original and unmodified list or a new one with at least 65 * one new item or the empty list if the way members don't build a 66 * correct multipolygon 59 67 */ 60 protected Relation fixMultipolygonRoles(Relation source) { 61 Collection<Way> ways = new ArrayList<>(source.getMemberPrimitives(Way.class)); 68 protected List<RelationMember> fixMultipolygonRoles(final List<RelationMember> origMembers) { 69 List<Way> ways = origMembers.stream().filter(m -> m.isWay()).map(m -> m.getWay()).collect(Collectors.toList()); 70 62 71 MultipolygonBuilder mpc = new MultipolygonBuilder(); 63 72 String error = mpc.makeFromWays(ways); 64 73 if (error != null) 65 return null;74 return Collections.emptyList(); 66 75 67 Relation r = new Relation(source);68 boolean fixed = false;69 76 Set<Way> outerWays = new HashSet<>(); 70 77 for (MultipolygonBuilder.JoinedPolygon poly : mpc.outerWays) { … … 75 82 innerWays.addAll(poly.ways); 76 83 } 77 for (int i = 0; i < r.getMembersCount(); i++) { 78 RelationMember m = r.getMember(i); 84 List<RelationMember> members = origMembers; 85 for (int i = 0; i < members.size(); i++) { 86 RelationMember m = members.get(i); 79 87 if (m.isWay()) { 80 88 final Way way = m.getWay(); … … 86 94 } 87 95 if (role != null && !role.equals(m.getRole())) { 88 r.setMember(i, new RelationMember(role, way)); 89 fixed = true; 96 if (members == origMembers) { 97 members = new ArrayList<>(origMembers); // don't modify original list 98 } 99 members.set(i, new RelationMember(role, way)); 90 100 } 91 101 } 92 102 } 93 return fixed ? r : null;103 return members; 94 104 } 95 105 } -
applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/PublicTransportFixer.java
r36103 r36217 4 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 5 6 import org.openstreetmap.josm.command.ChangeCommand; 6 import java.util.ArrayList; 7 import java.util.List; 8 9 import org.openstreetmap.josm.command.ChangeMembersCommand; 7 10 import org.openstreetmap.josm.command.Command; 8 11 import org.openstreetmap.josm.data.osm.DataSet; … … 11 14 import org.openstreetmap.josm.data.osm.RelationMember; 12 15 import org.openstreetmap.josm.gui.MainApplication; 16 import org.openstreetmap.josm.tools.Utils; 13 17 14 import org.openstreetmap.josm.tools.Utils;15 18 import relcontext.actions.PublicTransportHelper; 16 19 … … 26 29 } 27 30 28 /*protected PublicTransportFixer(String...types) {29 super(types);30 }*/31 32 31 @Override 33 32 public boolean isRelationGood(Relation rel) { 34 33 for (RelationMember m : rel.getMembers()) { 35 if (m.getType() .equals(OsmPrimitiveType.NODE)34 if (m.getType() == OsmPrimitiveType.NODE 36 35 && !(m.getRole().startsWith(PublicTransportHelper.STOP) || m.getRole().startsWith(PublicTransportHelper.PLATFORM))) { 37 36 setWarningMessage(tr("Node without ''stop'' or ''platform'' role found")); 38 37 return false; 39 38 } 40 if (m.getType() .equals(OsmPrimitiveType.WAY)39 if (m.getType() == OsmPrimitiveType.WAY 41 40 && PublicTransportHelper.isWayPlatform(m) 42 41 && !m.getRole().startsWith(PublicTransportHelper.PLATFORM)) { … … 49 48 } 50 49 51 /*@Override52 public boolean isFixerApplicable(Relation rel) {53 return true;54 }*/55 56 50 @Override 57 51 public Command fixRelation(Relation rel) { 58 Relation r = rel; 59 Relation rr = fixStopPlatformRole(r); 60 boolean fixed = false; 61 if (rr != null) { 62 fixed = true; 63 r = rr; 64 } 65 if (fixed) { 52 List<RelationMember> members = fixStopPlatformRole(rel.getMembers()); 53 if (!members.equals(rel.getMembers())) { 66 54 final DataSet ds = Utils.firstNonNull(rel.getDataSet(), MainApplication.getLayerManager().getEditDataSet()); 67 return new ChangeCommand(ds, rel, r); 55 return new ChangeMembersCommand(ds, rel, rel.getMembers()); 68 56 } 69 57 return null; 70 58 } 71 59 72 private Relation fixStopPlatformRole(Relation source) { 73 Relation r = new Relation(source); 74 boolean fixed = false; 75 for (int i = 0; i < r.getMembersCount(); i++) { 76 RelationMember m = r.getMember(i); 60 /** 61 * Fix roles of members. 62 * @param origMembers original list of relation members 63 * @return either the original and unmodified list or a new one with at least one new item 64 */ 65 private static List<RelationMember> fixStopPlatformRole(List<RelationMember> origMembers) { 66 List<RelationMember> members = origMembers; 67 for (int i = 0; i < members.size(); i++) { 68 RelationMember m = members.get(i); 77 69 String role = PublicTransportHelper.getRoleByMember(m); 78 70 79 71 if (role != null && !m.getRole().startsWith(role)) { 80 r.setMember(i, new RelationMember(role, m.getMember())); 81 fixed = true; 72 if (members == origMembers) { 73 members = new ArrayList<>(origMembers); 74 } 75 members.set(i, new RelationMember(role, m.getMember())); 82 76 } 83 77 } 84 return fixed ? r : null;78 return members; 85 79 } 86 80 }
Note:
See TracChangeset
for help on using the changeset viewer.