1 | package net.simon04.comfort0;
|
---|
2 |
|
---|
3 | import java.util.Collection;
|
---|
4 |
|
---|
5 | import org.openstreetmap.josm.data.coor.LatLon;
|
---|
6 | import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
|
---|
7 | import org.openstreetmap.josm.data.osm.KeyValueVisitor;
|
---|
8 | import org.openstreetmap.josm.data.osm.Node;
|
---|
9 | import org.openstreetmap.josm.data.osm.OsmPrimitive;
|
---|
10 | import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
|
---|
11 | import org.openstreetmap.josm.data.osm.Relation;
|
---|
12 | import org.openstreetmap.josm.data.osm.RelationMember;
|
---|
13 | import org.openstreetmap.josm.data.osm.Tagged;
|
---|
14 | import org.openstreetmap.josm.data.osm.Way;
|
---|
15 | import org.openstreetmap.josm.data.osm.visitor.OsmPrimitiveVisitor;
|
---|
16 |
|
---|
17 | /**
|
---|
18 | * Implements a conversion from {@link OsmPrimitive} to <a href="https://wiki.openstreetmap.org/wiki/Level0L">Level0L</a>.
|
---|
19 | */
|
---|
20 | public class OsmToLevel0L implements OsmPrimitiveVisitor, KeyValueVisitor {
|
---|
21 |
|
---|
22 | private final StringBuilder sb = new StringBuilder();
|
---|
23 |
|
---|
24 | /**
|
---|
25 | * Visits a collection of primitives
|
---|
26 | * @param primitives The collection of primitives
|
---|
27 | * @return {@code this}
|
---|
28 | */
|
---|
29 | public OsmToLevel0L visit(Collection<OsmPrimitive> primitives) {
|
---|
30 | primitives.stream()
|
---|
31 | .sorted(OsmPrimitiveComparator.orderingWaysRelationsNodes().thenComparing(OsmPrimitiveComparator.comparingUniqueId()))
|
---|
32 | .forEachOrdered(p -> p.accept(this));
|
---|
33 | return this;
|
---|
34 | }
|
---|
35 |
|
---|
36 | @Override
|
---|
37 | public void visit(Node n) {
|
---|
38 | appendCommon(n);
|
---|
39 | }
|
---|
40 |
|
---|
41 | @Override
|
---|
42 | public void visit(Way w) {
|
---|
43 | appendCommon(w);
|
---|
44 | for (Node node : w.getNodes()) {
|
---|
45 | appendRef(node, "");
|
---|
46 | }
|
---|
47 | }
|
---|
48 |
|
---|
49 | @Override
|
---|
50 | public void visit(Relation r) {
|
---|
51 | appendCommon(r);
|
---|
52 | for (RelationMember member : r.getMembers()) {
|
---|
53 | appendRef(member.getMember(), " " + member.getRole());
|
---|
54 | }
|
---|
55 | }
|
---|
56 |
|
---|
57 | private void appendRef(OsmPrimitive primitive, String mixin) {
|
---|
58 | sb.append(" ");
|
---|
59 | switch (primitive.getType()) {
|
---|
60 | case NODE:
|
---|
61 | sb.append("nd ");
|
---|
62 | break;
|
---|
63 | case WAY:
|
---|
64 | sb.append("wy ");
|
---|
65 | break;
|
---|
66 | case RELATION:
|
---|
67 | sb.append("rel ");
|
---|
68 | break;
|
---|
69 | default:
|
---|
70 | break;
|
---|
71 | }
|
---|
72 | sb.append(primitive.getUniqueId());
|
---|
73 | sb.append(mixin);
|
---|
74 | appendDisplayName(primitive);
|
---|
75 | }
|
---|
76 |
|
---|
77 | void appendCommon(OsmPrimitive p) {
|
---|
78 | sb.append("\n");
|
---|
79 | sb.append(p.getType().getAPIName()).append(" ").append(p.getUniqueId());
|
---|
80 | if (p instanceof Node) {
|
---|
81 | final LatLon latLon = ((Node) p).getCoor();
|
---|
82 | if (latLon != null) {
|
---|
83 | sb.append(": ").append(latLon.lat()).append(", ").append(latLon.lon());
|
---|
84 | }
|
---|
85 | }
|
---|
86 | appendDisplayName(p);
|
---|
87 | p.visitKeys(this);
|
---|
88 | }
|
---|
89 |
|
---|
90 | void appendDisplayName(OsmPrimitive p) {
|
---|
91 | sb.append(" #").append(p.getDisplayName(DefaultNameFormatter.getInstance())).append("\n");
|
---|
92 | }
|
---|
93 |
|
---|
94 | @Override
|
---|
95 | public void visitKeyValue(Tagged primitive, String key, String value) {
|
---|
96 | if (key.contains("#") || key.contains("=")) {
|
---|
97 | throw new UnsupportedOperationException("# and = are not supported in keys");
|
---|
98 | }
|
---|
99 | sb.append(" ").append(key).append(" = ").append(value).append("\n");
|
---|
100 | }
|
---|
101 |
|
---|
102 | @Override
|
---|
103 | public String toString() {
|
---|
104 | return sb.toString()
|
---|
105 | .replace("\u200C", "")
|
---|
106 | .replace("\u200E", "")
|
---|
107 | .replace("\u200F", "")
|
---|
108 | .replaceFirst("^\\n", "");
|
---|
109 | }
|
---|
110 | }
|
---|