Changeset 36217 in osm for applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/BoundaryFixer.java
- Timestamp:
- 2024-03-03T10:25:25+01:00 (16 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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 }
Note:
See TracChangeset
for help on using the changeset viewer.