source: osm/applications/editors/josm/plugins/reltoolbox/src/relcontext/relationfix/AssociatedStreetFixer.java@ 32395

Last change on this file since 32395 was 32395, checked in by donvip, 8 years ago

checkstyle, update to JOSM 10279

File size: 6.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package relcontext.relationfix;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.util.ArrayList;
7import java.util.HashMap;
8import java.util.List;
9import java.util.Map;
10
11import org.openstreetmap.josm.command.ChangeCommand;
12import org.openstreetmap.josm.command.Command;
13import org.openstreetmap.josm.command.SequenceCommand;
14import org.openstreetmap.josm.data.osm.Node;
15import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
16import org.openstreetmap.josm.data.osm.Relation;
17import org.openstreetmap.josm.data.osm.RelationMember;
18import org.openstreetmap.josm.data.osm.Way;
19
20public class AssociatedStreetFixer extends RelationFixer {
21
22 public AssociatedStreetFixer() {
23 super("associatedStreet");
24 }
25
26 @Override
27 public boolean isRelationGood(Relation rel) {
28 for (RelationMember m : rel.getMembers()) {
29 if (m.getType().equals(OsmPrimitiveType.NODE) && !"house".equals(m.getRole())) {
30 setWarningMessage(tr("Node without ''house'' role found"));
31 return false;
32 }
33 if (m.getType().equals(OsmPrimitiveType.WAY) && !("house".equals(m.getRole()) || "street".equals(m.getRole()))) {
34 setWarningMessage(tr("Way without ''house'' or ''street'' role found"));
35 return false;
36 }
37 if (m.getType().equals(OsmPrimitiveType.RELATION) && !"house".equals(m.getRole())) {
38 setWarningMessage(tr("Relation without ''house'' role found"));
39 return false;
40 }
41 }
42 // relation should have name
43 if (!rel.hasKey("name")) {
44 setWarningMessage(tr("Relation does not have name"));
45 return false;
46 }
47 // check that all street members have same name as relation (???)
48 String streetName = rel.get("name");
49 if (streetName == null) {
50 streetName = "";
51 }
52 for (RelationMember m : rel.getMembers()) {
53 if ("street".equals(m.getRole()) && !streetName.equals(m.getWay().get("name"))) {
54 String anotherName = m.getWay().get("name");
55 if (anotherName != null && !anotherName.isEmpty()) {
56 setWarningMessage(tr("Relation has streets with different names"));
57 return false;
58 }
59 }
60 }
61 clearWarningMessage();
62 return true;
63 }
64
65 @Override
66 public Command fixRelation(Relation source) {
67 // any way with highway tag -> street
68 // any way/point/relation with addr:housenumber=* or building=* or type=multipolygon -> house
69 // name - check which name is most used in street members and add to relation
70 // copy this name to the other street members (???)
71 Relation rel = new Relation(source);
72 boolean fixed = false;
73
74 for (int i = 0; i < rel.getMembersCount(); i++) {
75 RelationMember m = rel.getMember(i);
76
77 if (m.isNode()) {
78 Node node = m.getNode();
79 if (!"house".equals(m.getRole()) &&
80 (node.hasKey("building") || node.hasKey("addr:housenumber"))) {
81 fixed = true;
82 rel.setMember(i, new RelationMember("house", node));
83 }
84 } else if (m.isWay()) {
85 Way way = m.getWay();
86 if (!"street".equals(m.getRole()) && way.hasKey("highway")) {
87 fixed = true;
88 rel.setMember(i, new RelationMember("street", way));
89 } else if (!"house".equals(m.getRole()) &&
90 (way.hasKey("building") || way.hasKey("addr:housenumber"))) {
91 fixed = true;
92 rel.setMember(i, new RelationMember("house", way));
93 }
94 } else if (m.isRelation()) {
95 Relation relation = m.getRelation();
96 if (!"house".equals(m.getRole()) &&
97 (relation.hasKey("building") || relation.hasKey("addr:housenumber") || "multipolygon".equals(relation.get("type")))) {
98 fixed = true;
99 rel.setMember(i, new RelationMember("house", relation));
100 }
101 }
102 }
103
104 // fill relation name
105 Map<String, Integer> streetNames = new HashMap<>();
106 for (RelationMember m : rel.getMembers()) {
107 if ("street".equals(m.getRole()) && m.isWay()) {
108 String name = m.getWay().get("name");
109 if (name == null || name.isEmpty()) {
110 continue;
111 }
112
113 Integer count = streetNames.get(name);
114
115 streetNames.put(name, count != null ? count + 1 : 1);
116 }
117 }
118 String commonName = "";
119 Integer commonCount = 0;
120 for (Map.Entry<String, Integer> entry : streetNames.entrySet()) {
121 if (entry.getValue() > commonCount) {
122 commonCount = entry.getValue();
123 commonName = entry.getKey();
124 }
125 }
126
127 if (!rel.hasKey("name") && !commonName.isEmpty()) {
128 fixed = true;
129 rel.put("name", commonName);
130 } else {
131 commonName = ""; // set empty common name - if we already have name on relation, do not overwrite it
132 }
133
134 List<Command> commandList = new ArrayList<>();
135 if (fixed) {
136 commandList.add(new ChangeCommand(source, rel));
137 }
138
139 /*if (!commonName.isEmpty())
140 // fill common name to streets
141 for (RelationMember m : rel.getMembers())
142 if ("street".equals(m.getRole()) && m.isWay()) {
143 String name = m.getWay().get("name");
144 if (commonName.equals(name)) continue;
145
146 // TODO: ask user if he really wants to overwrite street name??
147
148 Way oldWay = m.getWay();
149 Way newWay = new Way(oldWay);
150 newWay.put("name", commonName);
151
152 commandList.add(new ChangeCommand(oldWay, newWay));
153 }
154 */
155 // return results
156 if (commandList.size() == 0)
157 return null;
158 if (commandList.size() == 1)
159 return commandList.get(0);
160 return new SequenceCommand(tr("fix associatedStreet relation"), commandList);
161 }
162}
Note: See TracBrowser for help on using the repository browser.