Changeset 30738 in osm for applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix
- Timestamp:
- 2014-10-19T01:27:04+02:00 (10 years ago)
- Location:
- applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/AssociatedStreetFixer.java
r30737 r30738 19 19 public class AssociatedStreetFixer extends RelationFixer { 20 20 21 public AssociatedStreetFixer() { 22 super("associatedStreet"); 23 } 24 25 @Override 26 public boolean isRelationGood(Relation rel) { 27 for (RelationMember m : rel.getMembers()) { 28 if (m.getType().equals(OsmPrimitiveType.NODE) && !"house".equals(m.getRole())) { 29 setWarningMessage(tr("Node without ''house'' role found")); 30 return false; 31 } 32 if (m.getType().equals(OsmPrimitiveType.WAY) && !("house".equals(m.getRole()) || "street".equals(m.getRole()))) { 33 setWarningMessage(tr("Way without ''house'' or ''street'' role found")); 34 return false; 35 } 36 if (m.getType().equals(OsmPrimitiveType.RELATION) && !"house".equals(m.getRole())) { 37 setWarningMessage(tr("Relation without ''house'' role found")); 38 return false; 39 } 40 } 41 // relation should have name 42 if (!rel.hasKey("name")) { 43 setWarningMessage(tr("Relation does not have name")); 44 return false; 45 } 46 // check that all street members have same name as relation (???) 47 String streetName = rel.get("name"); 48 if (streetName == null) streetName = ""; 49 for (RelationMember m : rel.getMembers()) { 50 if ("street".equals(m.getRole()) && !streetName.equals(m.getWay().get("name"))) { 51 String anotherName = m.getWay().get("name"); 52 if (anotherName != null && !anotherName.isEmpty()) { 53 setWarningMessage(tr("Relation has streets with different names")); 54 return false; 55 } 56 } 57 } 58 clearWarningMessage(); 59 return true; 60 } 21 public AssociatedStreetFixer() { 22 super("associatedStreet"); 23 } 61 24 62 25 @Override 63 public Command fixRelation(Relation source) { 64 // any way with highway tag -> street 65 // any way/point/relation with addr:housenumber=* or building=* or type=multipolygon -> house 66 // name - check which name is most used in street members and add to relation 67 // copy this name to the other street members (???) 68 Relation rel = new Relation(source); 69 boolean fixed = false; 26 public boolean isRelationGood(Relation rel) { 27 for (RelationMember m : rel.getMembers()) { 28 if (m.getType().equals(OsmPrimitiveType.NODE) && !"house".equals(m.getRole())) { 29 setWarningMessage(tr("Node without ''house'' role found")); 30 return false; 31 } 32 if (m.getType().equals(OsmPrimitiveType.WAY) && !("house".equals(m.getRole()) || "street".equals(m.getRole()))) { 33 setWarningMessage(tr("Way without ''house'' or ''street'' role found")); 34 return false; 35 } 36 if (m.getType().equals(OsmPrimitiveType.RELATION) && !"house".equals(m.getRole())) { 37 setWarningMessage(tr("Relation without ''house'' role found")); 38 return false; 39 } 40 } 41 // relation should have name 42 if (!rel.hasKey("name")) { 43 setWarningMessage(tr("Relation does not have name")); 44 return false; 45 } 46 // check that all street members have same name as relation (???) 47 String streetName = rel.get("name"); 48 if (streetName == null) streetName = ""; 49 for (RelationMember m : rel.getMembers()) { 50 if ("street".equals(m.getRole()) && !streetName.equals(m.getWay().get("name"))) { 51 String anotherName = m.getWay().get("name"); 52 if (anotherName != null && !anotherName.isEmpty()) { 53 setWarningMessage(tr("Relation has streets with different names")); 54 return false; 55 } 56 } 57 } 58 clearWarningMessage(); 59 return true; 60 } 70 61 71 for (int i = 0; i < rel.getMembersCount(); i++) { 72 RelationMember m = rel.getMember(i); 62 @Override 63 public Command fixRelation(Relation source) { 64 // any way with highway tag -> street 65 // any way/point/relation with addr:housenumber=* or building=* or type=multipolygon -> house 66 // name - check which name is most used in street members and add to relation 67 // copy this name to the other street members (???) 68 Relation rel = new Relation(source); 69 boolean fixed = false; 73 70 74 if (m.isNode()) { 75 Node node = m.getNode(); 76 if (!"house".equals(m.getRole()) && 77 (node.hasKey("building") || node.hasKey("addr:housenumber"))) { 78 fixed = true; 79 rel.setMember(i, new RelationMember("house", node)); 80 } 81 } else if (m.isWay()) { 82 Way way = m.getWay(); 83 if (!"street".equals(m.getRole()) && way.hasKey("highway")) { 84 fixed = true; 85 rel.setMember(i, new RelationMember("street", way)); 86 } else if (!"house".equals(m.getRole()) && 87 (way.hasKey("building") || way.hasKey("addr:housenumber"))) { 88 fixed = true; 89 rel.setMember(i, new RelationMember("house", way)); 90 } 91 } else if (m.isRelation()) { 92 Relation relation = m.getRelation(); 93 if (!"house".equals(m.getRole()) && 94 (relation.hasKey("building") || relation.hasKey("addr:housenumber") || "multipolygon".equals(relation.get("type")))) { 95 fixed = true; 96 rel.setMember(i, new RelationMember("house", relation)); 97 } 98 } 99 } 71 for (int i = 0; i < rel.getMembersCount(); i++) { 72 RelationMember m = rel.getMember(i); 100 73 101 // fill relation name 102 Map<String, Integer> streetNames = new HashMap<>(); 103 for (RelationMember m : rel.getMembers()) 104 if ("street".equals(m.getRole()) && m.isWay()) { 105 String name = m.getWay().get("name"); 106 if (name == null || name.isEmpty()) continue; 74 if (m.isNode()) { 75 Node node = m.getNode(); 76 if (!"house".equals(m.getRole()) && 77 (node.hasKey("building") || node.hasKey("addr:housenumber"))) { 78 fixed = true; 79 rel.setMember(i, new RelationMember("house", node)); 80 } 81 } else if (m.isWay()) { 82 Way way = m.getWay(); 83 if (!"street".equals(m.getRole()) && way.hasKey("highway")) { 84 fixed = true; 85 rel.setMember(i, new RelationMember("street", way)); 86 } else if (!"house".equals(m.getRole()) && 87 (way.hasKey("building") || way.hasKey("addr:housenumber"))) { 88 fixed = true; 89 rel.setMember(i, new RelationMember("house", way)); 90 } 91 } else if (m.isRelation()) { 92 Relation relation = m.getRelation(); 93 if (!"house".equals(m.getRole()) && 94 (relation.hasKey("building") || relation.hasKey("addr:housenumber") || "multipolygon".equals(relation.get("type")))) { 95 fixed = true; 96 rel.setMember(i, new RelationMember("house", relation)); 97 } 98 } 99 } 107 100 108 Integer count = streetNames.get(name); 101 // fill relation name 102 Map<String, Integer> streetNames = new HashMap<>(); 103 for (RelationMember m : rel.getMembers()) 104 if ("street".equals(m.getRole()) && m.isWay()) { 105 String name = m.getWay().get("name"); 106 if (name == null || name.isEmpty()) continue; 109 107 110 streetNames.put(name, count != null? count + 1 : 1); 111 } 112 String commonName = ""; 113 Integer commonCount = 0; 114 for (Map.Entry<String, Integer> entry : streetNames.entrySet()) { 115 if (entry.getValue() > commonCount) { 116 commonCount = entry.getValue(); 117 commonName = entry.getKey(); 118 } 119 } 108 Integer count = streetNames.get(name); 120 109 121 if (!rel.hasKey("name") && !commonName.isEmpty()) { 122 fixed = true; 123 rel.put("name", commonName); 124 } else { 125 commonName = ""; // set empty common name - if we already have name on relation, do not overwrite it 126 } 110 streetNames.put(name, count != null? count + 1 : 1); 111 } 112 String commonName = ""; 113 Integer commonCount = 0; 114 for (Map.Entry<String, Integer> entry : streetNames.entrySet()) { 115 if (entry.getValue() > commonCount) { 116 commonCount = entry.getValue(); 117 commonName = entry.getKey(); 118 } 119 } 127 120 128 List<Command> commandList = new ArrayList<>(); 129 if (fixed) { 130 commandList.add(new ChangeCommand(source, rel)); 131 } 121 if (!rel.hasKey("name") && !commonName.isEmpty()) { 122 fixed = true; 123 rel.put("name", commonName); 124 } else { 125 commonName = ""; // set empty common name - if we already have name on relation, do not overwrite it 126 } 132 127 133 /*if (!commonName.isEmpty()) 134 // fill common name to streets 135 for (RelationMember m : rel.getMembers()) 136 if ("street".equals(m.getRole()) && m.isWay()) { 137 String name = m.getWay().get("name"); 138 if (commonName.equals(name)) continue; 128 List<Command> commandList = new ArrayList<>(); 129 if (fixed) { 130 commandList.add(new ChangeCommand(source, rel)); 131 } 139 132 140 // TODO: ask user if he really wants to overwrite street name?? 133 /*if (!commonName.isEmpty()) 134 // fill common name to streets 135 for (RelationMember m : rel.getMembers()) 136 if ("street".equals(m.getRole()) && m.isWay()) { 137 String name = m.getWay().get("name"); 138 if (commonName.equals(name)) continue; 141 139 142 Way oldWay = m.getWay(); 143 Way newWay = new Way(oldWay); 144 newWay.put("name", commonName); 140 // TODO: ask user if he really wants to overwrite street name?? 145 141 146 commandList.add(new ChangeCommand(oldWay, newWay)); 147 } 148 */ 149 // return results 150 if (commandList.size() == 0) 151 return null; 152 if (commandList.size() == 1) 153 return commandList.get(0); 154 return new SequenceCommand(tr("fix associatedStreet relation"), commandList); 155 } 142 Way oldWay = m.getWay(); 143 Way newWay = new Way(oldWay); 144 newWay.put("name", commonName); 145 146 commandList.add(new ChangeCommand(oldWay, newWay)); 147 } 148 */ 149 // return results 150 if (commandList.size() == 0) 151 return null; 152 if (commandList.size() == 1) 153 return commandList.get(0); 154 return new SequenceCommand(tr("fix associatedStreet relation"), commandList); 155 } 156 156 } -
applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/BoundaryFixer.java
r28762 r30738 16 16 public class BoundaryFixer extends MultipolygonFixer { 17 17 18 19 20 18 public BoundaryFixer() { 19 super("boundary", "multipolygon"); 20 } 21 21 22 23 24 25 26 27 28 29 30 22 /** 23 * For boundary relations both "boundary" and "multipolygon" types are applicable, but 24 * it should also have key boundary=administrative to be fully boundary. 25 * @see http://wiki.openstreetmap.org/wiki/Relation:boundary 26 */ 27 @Override 28 public boolean isFixerApplicable(Relation rel) { 29 return super.isFixerApplicable(rel) && "administrative".equals(rel.get("boundary")); 30 } 31 31 32 33 34 32 @Override 33 public boolean isRelationGood(Relation rel) { 34 for( RelationMember m : rel.getMembers() ) { 35 35 if (m.getType().equals(OsmPrimitiveType.RELATION) && !"subarea".equals(m.getRole())) { 36 36 setWarningMessage(tr("Relation without ''subarea'' role found")); … … 43 43 if (m.getType().equals(OsmPrimitiveType.WAY) && !("outer".equals(m.getRole()) || "inner".equals(m.getRole()))) { 44 44 setWarningMessage(tr("Way without ''inner'' or ''outer'' role found")); 45 45 return false; 46 46 } 47 47 } 48 49 50 48 clearWarningMessage(); 49 return true; 50 } 51 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 52 @Override 53 public Command fixRelation(Relation rel) { 54 Relation r = rel; 55 Relation rr = fixMultipolygonRoles(r); 56 boolean fixed = false; 57 if (rr != null) { 58 fixed = true; 59 r = rr; 60 } 61 rr = fixBoundaryRoles(r); 62 if (rr != null) { 63 fixed = true; 64 r = rr; 65 } 66 return fixed ? new ChangeCommand(rel, r) : null; 67 } 68 68 69 69 private Relation fixBoundaryRoles( Relation source ) { 70 70 Relation r = new Relation(source); 71 71 boolean fixed = false; -
applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/MultipolygonFixer.java
r30737 r30738 22 22 public class MultipolygonFixer extends RelationFixer { 23 23 24 25 26 24 public MultipolygonFixer() { 25 super("multipolygon"); 26 } 27 27 28 29 30 28 protected MultipolygonFixer(String...types) { 29 super(types); 30 } 31 31 32 32 33 34 35 36 37 38 39 40 41 42 33 @Override 34 public boolean isRelationGood(Relation rel) { 35 for (RelationMember m : rel.getMembers()) 36 if (m.getType().equals(OsmPrimitiveType.WAY) && !("outer".equals(m.getRole()) || "inner".equals(m.getRole()))) { 37 setWarningMessage(tr("Way without ''inner'' or ''outer'' role found")); 38 return false; 39 } 40 clearWarningMessage(); 41 return true; 42 } 43 43 44 45 46 47 48 44 @Override 45 public Command fixRelation(Relation rel) { 46 Relation rr = fixMultipolygonRoles(rel); 47 return rr != null? new ChangeCommand(rel, rr) : null; 48 } 49 49 50 50 /** 51 51 * Basically, created multipolygon from scratch, and if successful, replace roles with new ones. 52 52 */ -
applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/NothingFixer.java
r28693 r30738 9 9 public class NothingFixer extends RelationFixer { 10 10 11 12 13 14 15 16 17 18 19 20 21 11 public NothingFixer() { 12 super(""); 13 } 14 @Override 15 public boolean isFixerApplicable(Relation rel) { 16 return true; 17 } 18 @Override 19 public boolean isRelationGood(Relation rel) { 20 return true; 21 } 22 22 23 24 25 26 23 @Override 24 public Command fixRelation(Relation rel) { 25 return null; 26 } 27 27 28 28 } -
applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/RelationFixer.java
r30737 r30738 15 15 public abstract class RelationFixer { 16 16 17 18 17 private List<String> applicableTypes; 18 private SortAndFixAction sortAndFixAction; 19 19 20 21 22 23 24 25 26 27 28 29 20 /** 21 * Construct new RelationFixer by a list of applicable types 22 * @param types 23 */ 24 public RelationFixer(String... types) { 25 applicableTypes = new ArrayList<>(); 26 for(String type: types) { 27 applicableTypes.add(type); 28 } 29 } 30 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 31 /** 32 * Check if given relation is of needed type. You may override this method to check first type 33 * and then check desired relation properties. 34 * Note that this only verifies if current RelationFixer can be used to check and fix given relation 35 * Deeper relation checking is at {@link isRelationGood} 36 * 37 * @param rel Relation to check 38 * @return true if relation can be verified by current RelationFixer 39 */ 40 public boolean isFixerApplicable(Relation rel) { 41 if (rel == null) 42 return false; 43 if (!rel.hasKey("type")) 44 return false; 45 45 46 47 48 49 46 String type = rel.get("type"); 47 for(String oktype: applicableTypes) 48 if (oktype.equals(type)) 49 return true; 50 50 51 52 51 return false; 52 } 53 53 54 55 56 57 58 59 60 61 54 /** 55 * Check if given relation is OK. That means if all roles are given properly, all tags exist as expected etc. 56 * Should be written in children classes. 57 * 58 * @param rel Relation to verify 59 * @return true if given relation is OK 60 */ 61 public abstract boolean isRelationGood(Relation rel); 62 62 63 64 65 66 67 68 69 70 63 /** 64 * Fix relation and return new relation with fixed tags, roles etc. 65 * Note that is not obligatory to return true for isRelationGood for new relation 66 * 67 * @param rel Relation to fix 68 * @return command that fixes the relation {@code null} if it cannot be fixed or is already OK 69 */ 70 public abstract Command fixRelation(Relation rel); 71 71 72 72 public void setFixAction(SortAndFixAction sortAndFixAction) {
Note:
See TracChangeset
for help on using the changeset viewer.