Changeset 329 in josm for branch/0.5/src/org/openstreetmap/josm/data/osm
- Timestamp:
- 2007-09-24T01:36:24+02:00 (18 years ago)
- Location:
- branch/0.5/src/org/openstreetmap/josm/data/osm
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
branch/0.5/src/org/openstreetmap/josm/data/osm/DataSet.java
r298 r329 31 31 32 32 /** 33 * All segments goes here, even when they are in a way. 33 * All ways (Streets etc.) in the DataSet. 34 * 35 * The way nodes are stored only in the way list. 34 36 */ 35 public Collection< Segment> segments = new LinkedList<Segment>();37 public Collection<Way> ways = new LinkedList<Way>(); 36 38 37 39 /** 38 * All ways (Streets etc.) in the DataSet. 39 * 40 * The nodes of the way segments of this way must be objects from 41 * the nodes list, however the way segments are stored only in the 42 * way list. 40 * All relations/relationships 43 41 */ 44 public Collection< Way> ways = new LinkedList<Way>();42 public Collection<Relation> relations = new LinkedList<Relation>(); 45 43 46 44 /** … … 55 53 * selection does only change in the active layer) 56 54 */ 57 public static Collection<SelectionChangedListener> listeners = new LinkedList<SelectionChangedListener>();55 public static Collection<SelectionChangedListener> selListeners = new LinkedList<SelectionChangedListener>(); 58 56 59 57 /** 60 58 * @return A collection containing all primitives of the dataset. The 61 * data is ordered after: first come snodes, thensegments, thenways.59 * data is ordered after: first come nodes, then ways, then relations. 62 60 * Ordering in between the categories is not guaranteed. 63 61 */ … … 65 63 List<OsmPrimitive> o = new LinkedList<OsmPrimitive>(); 66 64 o.addAll(nodes); 67 o.addAll(segments);68 65 o.addAll(ways); 66 o.addAll(relations); 69 67 return o; 70 68 } … … 88 86 public void clearSelection() { 89 87 clearSelection(nodes); 90 clearSelection(segments);91 88 clearSelection(ways); 89 clearSelection(relations); 92 90 Collection<OsmPrimitive> sel = Collections.emptyList(); 93 91 fireSelectionChanged(sel); … … 100 98 public Collection<OsmPrimitive> getSelected() { 101 99 Collection<OsmPrimitive> sel = getSelected(nodes); 102 sel.addAll(getSelected(segments));103 100 sel.addAll(getSelected(ways)); 101 sel.addAll(getSelected(relations)); 104 102 return sel; 105 103 } … … 107 105 public void setSelected(Collection<? extends OsmPrimitive> selection) { 108 106 clearSelection(nodes); 109 clearSelection(segments);110 107 clearSelection(ways); 108 clearSelection(relations); 111 109 for (OsmPrimitive osm : selection) 112 110 osm.selected = true; … … 120 118 } 121 119 clearSelection(nodes); 122 clearSelection(segments);123 120 clearSelection(ways); 121 clearSelection(relations); 124 122 for (OsmPrimitive o : osm) 125 123 if (o != null) … … 158 156 */ 159 157 public static void fireSelectionChanged(Collection<? extends OsmPrimitive> sel) { 160 for (SelectionChangedListener l : listeners)158 for (SelectionChangedListener l : selListeners) 161 159 l.selectionChanged(sel); 162 160 } 163 161 164 162 @Override public DataSet clone() { 165 163 DataSet ds = new DataSet(); 166 164 for (Node n : nodes) 167 165 ds.nodes.add(new Node(n)); 168 for (Segment s : segments)169 ds.segments.add(new Segment(s));170 166 for (Way w : ways) 171 167 ds.ways.add(new Way(w)); 168 for (Relation e : relations) 169 ds.relations.add(new Relation(e)); 172 170 for (DataSource source : dataSources) 173 171 ds.dataSources.add(new DataSource(source.bounds, source.origin)); -
branch/0.5/src/org/openstreetmap/josm/data/osm/Node.java
r298 r329 18 18 public volatile EastNorth eastNorth; 19 19 20 /** 21 * Create an incomplete Node object 22 */ 23 public Node(long id) { 24 this.id = id; 25 incomplete = true; 26 } 27 20 28 /** 21 29 * Create an identical clone of the argument (including the id) -
branch/0.5/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
r298 r329 3 3 4 4 import java.text.SimpleDateFormat; 5 import java.util.ArrayList; 5 6 import java.util.Collection; 6 7 import java.util.Collections; … … 90 91 91 92 /** 93 * If set to true, this object is incomplete, which means only the id 94 * and type is known (type is the objects instance class) 95 */ 96 public boolean incomplete = false; 97 98 /** 92 99 * Implementation of the visitor scheme. Subclases have to call the correct 93 100 * visitor function. … … 125 132 Visitor v = new Visitor(){ 126 133 public void visit(Node n) { ret[0] = 1; } 127 public void visit( Segment s) { ret[0] = 2; }128 public void visit( Way w) { ret[0] = 3; }134 public void visit(Way w) { ret[0] = 2; } 135 public void visit(Relation e) { ret[0] = 3; } 129 136 }; 130 137 visit(v); 131 return id == 0 ? super.hashCode() : (int)(id<< 3)+ret[0];138 return id == 0 ? super.hashCode() : (int)(id<<2)+ret[0]; 132 139 } 133 140 … … 205 212 return timestamp == null ? null : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(timestamp); 206 213 } 214 215 207 216 } -
branch/0.5/src/org/openstreetmap/josm/data/osm/Segment.java
r298 r329 1 // License: GPL. Copyright 2007 by Immanuel Scholz and others2 package org.openstreetmap.josm.data.osm;3 4 import org.openstreetmap.josm.data.osm.visitor.Visitor;5 6 7 /**8 * One way segment consisting of a pair of nodes (from/to)9 *10 * @author imi11 */12 public final class Segment extends OsmPrimitive {13 14 /**15 * The starting node of the segment16 */17 public Node from;18 19 /**20 * The ending node of the segment21 */22 public Node to;23 24 /**25 * If set to true, this object is incomplete, which means only the id26 * and type is known (type is the objects instance class)27 */28 public boolean incomplete;29 30 /**31 * Create an identical clone of the argument (including the id)32 */33 public Segment(Segment clone) {34 cloneFrom(clone);35 }36 37 /**38 * Create an segment from the given starting and ending node39 * @param from Starting node of the segment.40 * @param to Ending node of the segment.41 */42 public Segment(Node from, Node to) {43 this.from = from;44 this.to = to;45 incomplete = false;46 }47 48 public Segment(long id) {49 this.id = id;50 incomplete = true;51 }52 53 @Override public void visit(Visitor visitor) {54 visitor.visit(this);55 }56 57 /**58 * @return <code>true</code>, if the <code>ls</code> occupy59 * exactly the same place as <code>this</code>.60 */61 public boolean equalPlace(Segment ls) {62 if (equals(ls))63 return true;64 if (incomplete || ls.incomplete)65 return incomplete == ls.incomplete;66 return ((from.coor.equals(ls.from.coor) && to.coor.equals(ls.to.coor)) ||67 (from.coor.equals(ls.to.coor) && to.coor.equals(ls.from.coor)));68 }69 70 @Override public void cloneFrom(OsmPrimitive osm) {71 super.cloneFrom(osm);72 Segment ls = ((Segment)osm);73 from = ls.from;74 to = ls.to;75 incomplete = ls.incomplete;76 }77 78 @Override public String toString() {79 return "{Segment id="+id+" from="+from+" to="+to+"}";80 }81 82 @Override public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) {83 if (!(osm instanceof Segment))84 return super.realEqual(osm, semanticOnly);85 if (incomplete)86 return super.realEqual(osm, semanticOnly) && ((Segment)osm).incomplete;87 return super.realEqual(osm, semanticOnly) && from.equals(((Segment)osm).from) && to.equals(((Segment)osm).to);88 }89 90 public int compareTo(OsmPrimitive o) {91 return o instanceof Segment ? Long.valueOf(id).compareTo(o.id) : (o instanceof Node ? -1 : 1);92 }93 } -
branch/0.5/src/org/openstreetmap/josm/data/osm/Way.java
r298 r329 9 9 10 10 /** 11 * One full way, consisting of several way segments chained together.11 * One full way, consisting of a list of way nodes. 12 12 * 13 13 * @author imi … … 16 16 17 17 /** 18 * All way segments in this way18 * All way nodes in this way 19 19 */ 20 public final List< Segment> segments = new ArrayList<Segment>();20 public final List<Node> nodes = new ArrayList<Node>(); 21 21 22 22 @Override public void visit(Visitor visitor) { … … 31 31 } 32 32 33 /** 34 * Create an empty way without id. Use this only if you set meaningful 35 * values yourself. 36 */ 33 37 public Way() { 38 } 39 40 /** 41 * Create an incomplete Way. 42 */ 43 public Way(long id) { 44 this.id = id; 45 incomplete = true; 34 46 } 35 47 36 48 @Override public void cloneFrom(OsmPrimitive osm) { 37 49 super.cloneFrom(osm); 38 segments.clear();39 segments.addAll(((Way)osm).segments);50 nodes.clear(); 51 nodes.addAll(((Way)osm).nodes); 40 52 } 41 53 42 54 @Override public String toString() { 43 return "{Way id="+id+" segments="+Arrays.toString(segments.toArray())+"}";55 return "{Way id="+id+" nodes="+Arrays.toString(nodes.toArray())+"}"; 44 56 } 45 57 46 58 @Override public boolean realEqual(OsmPrimitive osm, boolean semanticOnly) { 47 return osm instanceof Way ? super.realEqual(osm, semanticOnly) && segments.equals(((Way)osm).segments) : false;59 return osm instanceof Way ? super.realEqual(osm, semanticOnly) && nodes.equals(((Way)osm).nodes) : false; 48 60 } 49 61 … … 52 64 } 53 65 66 @Deprecated 54 67 public boolean isIncomplete() { 55 for (Segment s : segments)56 if (s.incomplete)57 return true;58 68 return false; 59 69 } -
branch/0.5/src/org/openstreetmap/josm/data/osm/visitor/AddVisitor.java
r298 r329 1 1 // License: GPL. Copyright 2007 by Immanuel Scholz and others 2 /**3 */4 2 package org.openstreetmap.josm.data.osm.visitor; 5 3 6 4 import org.openstreetmap.josm.data.osm.DataSet; 7 import org.openstreetmap.josm.data.osm. Segment;5 import org.openstreetmap.josm.data.osm.Relation; 8 6 import org.openstreetmap.josm.data.osm.Node; 9 7 import org.openstreetmap.josm.data.osm.Way; … … 27 25 ds.nodes.add(n); 28 26 } 29 public void visit(Segment s) {30 ds.segments.add(s);31 }32 27 public void visit(Way w) { 33 28 ds.ways.add(w); 34 29 } 30 public void visit(Relation e) { 31 ds.relations.add(e); 32 } 35 33 } -
branch/0.5/src/org/openstreetmap/josm/data/osm/visitor/AllNodesVisitor.java
r298 r329 5 5 import java.util.HashSet; 6 6 7 import org.openstreetmap.josm.data.osm.Segment; 7 import org.openstreetmap.josm.data.osm.Relation; 8 import org.openstreetmap.josm.data.osm.RelationMember; 8 9 import org.openstreetmap.josm.data.osm.Node; 9 10 import org.openstreetmap.josm.data.osm.OsmPrimitive; … … 30 31 31 32 /** 32 * Line segments haveexactly two nodes: from and to.33 * Ways have their way nodes. 33 34 */ 34 public void visit(Segment ls) { 35 if (!ls.incomplete) { 36 visit(ls.from); 37 visit(ls.to); 38 } 35 public void visit(Way w) { 36 for (Node n : w.nodes) 37 visit(n); 39 38 } 40 39 41 40 /** 42 * Ways have all nodes from their segments. 41 * Relations may have any number of nodes. 42 * FIXME: do we want to collect nodes from segs/ways that are relation members? 43 * if so, use AutomatchVisitor! 43 44 */ 44 public void visit( Way w) {45 for ( Segment ls : w.segments)46 visit(ls);45 public void visit(Relation e) { 46 for (RelationMember m : e.members) 47 if (m.member instanceof Node) visit((Node)m.member); 47 48 } 48 49 49 /** 50 50 * @return All nodes the given primitive has. -
branch/0.5/src/org/openstreetmap/josm/data/osm/visitor/BoundingXYVisitor.java
r298 r329 5 5 import org.openstreetmap.josm.data.Bounds; 6 6 import org.openstreetmap.josm.data.coor.EastNorth; 7 import org.openstreetmap.josm.data.osm. Segment;7 import org.openstreetmap.josm.data.osm.Relation; 8 8 import org.openstreetmap.josm.data.osm.Node; 9 9 import org.openstreetmap.josm.data.osm.Way; … … 22 22 } 23 23 24 public void visit(Segment ls) { 25 if (!ls.incomplete) { 26 visit(ls.from); 27 visit(ls.to); 28 } 24 public void visit(Way w) { 25 for (Node n : w.nodes) 26 visit(n); 29 27 } 30 28 31 public void visit(Way w) { 32 for (Segment ls : w.segments) 33 visit(ls); 29 public void visit(Relation e) { 30 // relations have no bounding box. 34 31 } 35 32 -
branch/0.5/src/org/openstreetmap/josm/data/osm/visitor/CollectBackReferencesVisitor.java
r298 r329 6 6 7 7 import org.openstreetmap.josm.data.osm.DataSet; 8 import org.openstreetmap.josm.data.osm.Segment; 8 import org.openstreetmap.josm.data.osm.Relation; 9 import org.openstreetmap.josm.data.osm.RelationMember; 9 10 import org.openstreetmap.josm.data.osm.Node; 10 11 import org.openstreetmap.josm.data.osm.OsmPrimitive; … … 12 13 13 14 /** 14 * Helper that collect all segments a node is part of, all ways 15 * a node or segment is part of and all areas a node is part of. 15 * Helper that collect all ways a node is part of. 16 16 * 17 17 * Deleted objects are not collected. … … 41 41 if (w.deleted) 42 42 continue; 43 for (Segment ls : w.segments) { 44 if (ls.incomplete) 45 continue; 46 if (ls.from == n || ls.to == n) { 43 for (Node n2 : w.nodes) { 44 if (n == n2) { 47 45 data.add(w); 46 } 47 } 48 } 49 checkRelationMembership(n); 50 } 51 52 public void visit(Way w) { 53 checkRelationMembership(w); 54 } 55 56 public void visit(Relation r) { 57 checkRelationMembership(r); 58 } 59 60 private void checkRelationMembership(OsmPrimitive p) { 61 // FIXME - this might be a candidate for optimisation 62 // if OSM primitives are made to hold a list of back 63 // references. 64 for (Relation r : ds.relations) { 65 for (RelationMember m : r.members) { 66 if (m.member == p) { 67 data.add(r); 68 // move up the tree (there might be relations 69 // referring to this relation) 70 checkRelationMembership(r); 48 71 break; 49 72 } 50 73 } 51 74 } 52 for (Segment ls : ds.segments) {53 if (ls.deleted || ls.incomplete)54 continue;55 if (ls.from == n || ls.to == n)56 data.add(ls);57 }58 75 } 59 public void visit(Segment ls) {60 for (Way w : ds.ways) {61 if (w.deleted)62 continue;63 if (w.segments.contains(ls))64 data.add(w);65 }66 }67 public void visit(Way w) {}68 76 } -
branch/0.5/src/org/openstreetmap/josm/data/osm/visitor/DeleteVisitor.java
r298 r329 1 1 // License: GPL. Copyright 2007 by Immanuel Scholz and others 2 /**3 */4 2 package org.openstreetmap.josm.data.osm.visitor; 5 3 6 4 import org.openstreetmap.josm.data.osm.DataSet; 7 import org.openstreetmap.josm.data.osm. Segment;5 import org.openstreetmap.josm.data.osm.Relation; 8 6 import org.openstreetmap.josm.data.osm.Node; 9 7 import org.openstreetmap.josm.data.osm.Way; … … 27 25 ds.nodes.remove(n); 28 26 } 29 public void visit(Segment ls) {30 ds.segments.remove(ls);31 }32 27 public void visit(Way w) { 33 28 ds.ways.remove(w); 34 29 } 30 public void visit(Relation e) { 31 ds.relations.remove(e); 32 } 35 33 } -
branch/0.5/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java
r298 r329 10 10 11 11 import org.openstreetmap.josm.data.osm.DataSet; 12 import org.openstreetmap.josm.data.osm.Relation; 13 import org.openstreetmap.josm.data.osm.RelationMember; 12 14 import org.openstreetmap.josm.data.osm.Node; 13 15 import org.openstreetmap.josm.data.osm.OsmPrimitive; 14 import org.openstreetmap.josm.data.osm.Segment;15 16 import org.openstreetmap.josm.data.osm.Way; 16 17 … … 25 26 /** 26 27 * Map from primitives in the database to visited primitives. (Attention: The other way 27 * round than mergedNodes and mergedSegments)28 * round than mergedNodes) 28 29 */ 29 30 public Map<OsmPrimitive, OsmPrimitive> conflicts = new HashMap<OsmPrimitive, OsmPrimitive>(); … … 38 39 */ 39 40 private final Map<Node, Node> mergedNodes = new HashMap<Node, Node>(); 40 /**41 * A list of all segments that got replaced with others.42 * Key is the segment in the other's dataset and the value is the one that is now43 * in ds.segments.44 */45 private final Map<Segment, Segment> mergedSegments = new HashMap<Segment, Segment>();46 41 47 42 public MergeVisitor(DataSet ds, DataSet mergeds) { … … 81 76 82 77 /** 83 * Merge the segment if id matches or if both nodes are the same (and the 84 * id is zero of either segment). Nodes are the "same" when they @see match 85 */ 86 public void visit(Segment other) { 87 if (mergeAfterId(mergedSegments, ds.segments, other)) 88 return; 89 90 Segment my = null; 91 for (Segment ls : ds.segments) { 92 if (match(other, ls) && ((mergeds == null) || (!mergeds.segments.contains(ls)))) { 93 my = ls; 94 break; 95 } 96 } 97 98 if (my == null) 99 ds.segments.add(other); 100 else if (my.incomplete && !other.incomplete) { 101 mergedSegments.put(other, my); 102 my.cloneFrom(other); 103 } else if (!other.incomplete) { 104 mergedSegments.put(other, my); 105 mergeCommon(my, other); 106 if (my.modified && !other.modified) 107 return; 108 if (!match(my.from, other.from)) { 109 my.from = other.from; 110 my.modified = other.modified; 111 } 112 if (!match(my.to, other.to)) { 113 my.to = other.to; 114 my.modified = other.modified; 115 } 116 } 117 } 118 78 * Simply calls cloneFrom() for now. 79 * Might be useful to keep around to facilitate merge with the relations 80 * branch. 81 */ 119 82 private <T extends OsmPrimitive> void cloneFromExceptIncomplete(T myOsm, T otherOsm) { 120 if (!(myOsm instanceof Way)) 121 myOsm.cloneFrom(otherOsm); 122 else { 123 Way my = (Way)myOsm; 124 Way other = (Way)otherOsm; 125 HashMap<Long, Segment> copy = new HashMap<Long, Segment>(); 126 for (Segment s : my.segments) 127 copy.put(s.id, s); 128 my.cloneFrom(other); 129 my.segments.clear(); 130 for (Segment s : other.segments) { 131 Segment myS = copy.get(s.id); 132 if (s.incomplete && myS != null && !myS.incomplete) { 133 mergedSegments.put(s, myS); 134 my.segments.add(myS); 135 } else 136 my.segments.add(s); 137 } 138 } 83 myOsm.cloneFrom(otherOsm); 139 84 } 140 85 141 86 /** 142 * Merge the way if id matches or if all segments matchesand the87 * Merge the way if id matches or if all nodes match and the 143 88 * id is zero of either way. 144 89 */ … … 155 100 } 156 101 if (my == null) { 157 // Add the way and replace any incomplete segments that we already have158 102 ds.ways.add(other); 159 for (Segment s : other.segments) { 160 if (s.incomplete) { 103 } else { 104 mergeCommon(my, other); 105 if (my.modified && !other.modified) 106 return; 107 boolean same = true; 108 Iterator<Node> it = other.nodes.iterator(); 109 for (Node n : my.nodes) { 110 if (!match(n, it.next())) 111 same = false; 112 } 113 if (!same) { 114 my.nodes.clear(); 115 my.nodes.addAll(other.nodes); 116 my.modified = other.modified; 117 } 118 } 119 } 120 121 /** 122 * Merge the relation if id matches or if all members match and the 123 * id of either relation is zero. 124 */ 125 public void visit(Relation other) { 126 if (mergeAfterId(null, ds.relations, other)) 127 return; 128 129 Relation my = null; 130 for (Relation e : ds.relations) { 131 if (match(other, e) && ((mergeds == null) || (!mergeds.relations.contains(e)))) { 132 my = e; 133 break; 134 } 135 } 136 137 if (my == null) { 138 // Add the relation and replace any incomplete segments that we already have 139 ds.relations.add(other); 140 // FIXME unclear! 141 /* 142 for (RelationMember em : other.getMembers()) { 143 if (em.member.incomplete) { 161 144 for (Segment ourSegment : ds.segments) { 162 145 if (ourSegment.id == s.id) { … … 166 149 } 167 150 } 168 } 151 }*/ 169 152 } else { 170 153 mergeCommon(my, other); … … 172 155 return; 173 156 boolean same = true; 174 Iterator<Segment> it = other.segments.iterator(); 175 for (Segment ls : my.segments) { 176 if (!match(ls, it.next())) 157 if (other.members.size() != my.members.size()) { 177 158 same = false; 178 } 159 } else { 160 for (RelationMember em : my.members) { 161 if (!other.members.contains(em)) { 162 same = false; 163 break; 164 } 165 } 166 } 167 // FIXME Unclear 168 /* 179 169 if (!same) { 180 170 HashMap<Long, Segment> copy = new HashMap<Long, Segment>(); … … 192 182 my.modified = other.modified; 193 183 } 184 */ 194 185 } 195 186 } … … 200 191 */ 201 192 public void fixReferences() { 202 for (Segment s : ds.segments)203 fixSegment(s);204 for (OsmPrimitive osm : conflicts.values())205 if (osm instanceof Segment)206 fixSegment((Segment)osm);207 193 for (Way w : ds.ways) 208 194 fixWay(w); … … 214 200 private void fixWay(Way w) { 215 201 boolean replacedSomething = false; 216 LinkedList< Segment> newSegments = new LinkedList<Segment>();217 for ( Segment ls : w.segments) {218 Segment otherLs= mergedSegments.get(ls);219 new Segments.add(otherLs== null ?ls: otherLs);220 if (other Ls!= null)202 LinkedList<Node> newNodes = new LinkedList<Node>(); 203 for (Node n : w.nodes) { 204 Node otherN = mergedNodes.get(n); 205 newNodes.add(otherN == null ? n : otherN); 206 if (otherN != null) 221 207 replacedSomething = true; 222 208 } 223 209 if (replacedSomething) { 224 w.segments.clear(); 225 w.segments.addAll(newSegments); 226 } 227 for (Segment ls : w.segments) 228 fixSegment(ls); 210 w.nodes.clear(); 211 w.nodes.addAll(newNodes); 229 212 } 230 231 private void fixSegment(Segment ls) {232 233 if (mergedNodes.containsKey(ls.from))234 ls.from = mergedNodes.get(ls.from);235 236 if (mergedNodes.containsKey(ls.to))237 ls.to = mergedNodes.get(ls.to);238 239 213 } 240 214 241 215 /** 242 * @return Whether the nodes match es(in sense of "be mergable").216 * @return Whether the nodes match (in sense of "be mergable"). 243 217 */ 244 218 private boolean match(Node n1, Node n2) { … … 249 223 250 224 /** 251 * @return Whether the segments matches (in sense of "be mergable"). 252 */ 253 private boolean match(Segment ls1, Segment ls2) { 254 if (ls1.id == ls2.id && ls1.id != 0) 255 return true; 256 //if (ls1.id != 0 && ls2.id != 0) 257 // return false; 258 if (ls1.incomplete || ls2.incomplete) 259 return false; 260 return match(ls1.from, ls2.from) && match(ls1.to, ls2.to); 261 } 262 263 /** 264 * @return Whether the ways matches (in sense of "be mergable"). 225 * @return Whether the ways match (in sense of "be mergable"). 265 226 */ 266 227 private boolean match(Way w1, Way w2) { 267 228 if (w1.id == 0 || w2.id == 0) { 268 if (w1. segments.size() != w2.segments.size())269 270 Iterator< Segment> it = w1.segments.iterator();271 for ( Segment ls : w2.segments)272 if (!match( ls, it.next()))229 if (w1.nodes.size() != w2.nodes.size()) 230 return false; 231 Iterator<Node> it = w1.nodes.iterator(); 232 for (Node n : w2.nodes) 233 if (!match(n, it.next())) 273 234 return false; 274 235 return true; … … 276 237 return w1.id == w2.id; 277 238 } 239 /** 240 * @return Whether the relations match (in sense of "be mergable"). 241 */ 242 private boolean match(Relation w1, Relation w2) { 243 // FIXME this is not perfect yet... 244 if (w1.id == 0 || w2.id == 0) { 245 if (w1.members.size() != w2.members.size()) 246 return false; 247 for (RelationMember em : w1.members) { 248 if (!w2.members.contains(em)) { 249 return false; 250 } 251 } 252 return true; 253 } 254 return w1.id == w2.id; 255 } 256 278 257 279 258 /** … … 327 306 } 328 307 if (my.id == other.id && my.id != 0) { 329 if (my instanceof Segment && ((Segment)my).incomplete)330 return false; // merge always over an incomplete331 308 if (my.modified && other.modified) { 332 309 conflicts.put(my, other); -
branch/0.5/src/org/openstreetmap/josm/data/osm/visitor/NameVisitor.java
r298 r329 1 1 // License: GPL. Copyright 2007 by Immanuel Scholz and others 2 3 2 package org.openstreetmap.josm.data.osm.visitor; 4 3 … … 13 12 14 13 import org.openstreetmap.josm.Main; 14 import org.openstreetmap.josm.data.osm.Relation; 15 15 import org.openstreetmap.josm.data.osm.Node; 16 16 import org.openstreetmap.josm.data.osm.OsmPrimitive; 17 import org.openstreetmap.josm.data.osm.Segment;18 17 import org.openstreetmap.josm.data.osm.Way; 19 18 import org.openstreetmap.josm.tools.ImageProvider; … … 41 40 42 41 /** 43 * If the segment has a key named "name", its value is displayed.44 * Otherwise, if it has "id", this is used. If none of these available,45 * "(x1,y1) -> (x2,y2)" is displayed with the nodes coordinates.46 */47 public void visit(Segment ls) {48 name = ls.get("name");49 if (name == null) {50 if (ls.incomplete)51 name = ls.id == 0 ? tr("new") : ls.id+" ("+tr("unknown")+")";52 else53 name = (ls.id==0?"":ls.id+" ")+"("+ls.from.coor.lat()+","+ls.from.coor.lon()+") -> ("+ls.to.coor.lat()+","+ls.to.coor.lon()+")";54 }55 addId(ls);56 icon = ImageProvider.get("data", "segment");57 trn("segment", "segments", 0); // no marktrn available58 className = "segment";59 }60 61 /**62 42 * If the node has a name-key or id-key, this is displayed. If not, (lat,lon) 63 43 * is displayed. … … 81 61 if (name == null) name = w.get("ref"); 82 62 if (name == null) { 83 AllNodesVisitor.getAllNodes(w.segments);84 Set<Node> nodes = new HashSet<Node>();85 for (Segment ls : w.segments) {86 if (!ls.incomplete) {87 nodes.add(ls.from);88 nodes.add(ls.to);89 }90 }91 63 String what = (w.get("highway") != null) ? "highway " : (w.get("railway") != null) ? "railway " : (w.get("waterway") != null) ? "waterway " : ""; 92 name = what + trn("{0} node", "{0} nodes", nodes.size(), nodes.size()); 64 name = what + trn("{0} node", "{0} nodes", w.nodes.size(), w.nodes.size()); 93 65 } 94 if (w.isIncomplete())95 name += " ("+tr("incomplete")+")";96 66 addId(w); 97 67 icon = ImageProvider.get("data", "way"); 98 68 trn("way", "ways", 0); // no marktrn available 99 69 className = "way"; 70 } 71 72 /** 73 */ 74 public void visit(Relation e) { 75 name = e.get("type"); 76 // FIXME add names of members 77 if (name == null) 78 name = "relation"; 79 addId(e); 80 icon = ImageProvider.get("data", "relation"); 81 trn("relation", "relations", 0); // no marktrn available 82 className = "relation"; 100 83 } 101 84 -
branch/0.5/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
r319 r329 4 4 import java.awt.Color; 5 5 import java.awt.Graphics; 6 import java.awt.Graphics2D;7 6 import java.awt.Point; 8 7 import java.awt.Rectangle; 9 import java.awt.geom.GeneralPath;10 8 import java.awt.geom.Line2D; 11 9 12 10 import org.openstreetmap.josm.Main; 13 11 import org.openstreetmap.josm.data.osm.DataSet; 12 import org.openstreetmap.josm.data.osm.Relation; 14 13 import org.openstreetmap.josm.data.osm.Node; 15 14 import org.openstreetmap.josm.data.osm.OsmPrimitive; 16 import org.openstreetmap.josm.data.osm.Segment;17 15 import org.openstreetmap.josm.data.osm.Way; 18 16 import org.openstreetmap.josm.gui.NavigatableComponent; … … 30 28 public final static Color darkblue = new Color(0,0,128); 31 29 public final static Color darkgreen = new Color(0,128,0); 32 30 33 31 /** 34 32 * The environment to paint to. … … 41 39 42 40 public boolean inactive; 43 41 44 42 protected static final double PHI = Math.toRadians(20); 45 43 46 /**47 * Preferences48 */49 protected Color inactiveColor;50 protected Color selectedColor;51 protected Color nodeColor;52 protected Color segmentColor;53 protected Color dfltWayColor;54 protected Color incompleteColor;55 protected Color backgroundColor;56 protected boolean showDirectionArrow;57 protected boolean showOrderNumber;58 59 /**60 * Draw subsequent segments of same color as one Path61 */62 protected Color currentColor = null;63 protected GeneralPath currrentPath = new GeneralPath();64 65 44 public void visitAll(DataSet data) { 66 inactiveColor = getPreferencesColor("inactive", Color.DARK_GRAY);67 selectedColor = getPreferencesColor("selected", Color.WHITE);68 nodeColor = getPreferencesColor("node", Color.RED);69 segmentColor = getPreferencesColor("segment", darkgreen);70 dfltWayColor = getPreferencesColor("way", darkblue);71 incompleteColor = getPreferencesColor("incomplete way", darkerblue);72 backgroundColor = getPreferencesColor("background", Color.BLACK);73 showDirectionArrow = Main.pref.getBoolean("draw.segment.direction");74 showOrderNumber = Main.pref.getBoolean("draw.segment.order_number");75 76 for (final OsmPrimitive osm : data.segments)77 if (!osm.deleted && !osm.selected)78 osm.visit(this);79 45 for (final OsmPrimitive osm : data.ways) 80 46 if (!osm.deleted && !osm.selected) 81 47 osm.visit(this); 82 displaySegments(null); // Flush segment cache before nodes83 48 for (final OsmPrimitive osm : data.nodes) 84 49 if (!osm.deleted && !osm.selected) … … 87 52 if (!osm.deleted) 88 53 osm.visit(this); 89 displaySegments(null);90 54 } 91 55 … … 99 63 Color color = null; 100 64 if (inactive) 101 color = inactive Color;65 color = getPreferencesColor("inactive", Color.DARK_GRAY); 102 66 else if (n.selected) 103 color = selected Color;67 color = getPreferencesColor("selected", Color.WHITE); 104 68 else 105 color = nodeColor;69 color = getPreferencesColor("node", Color.RED); 106 70 drawNode(n, color); 107 }108 109 /**110 * Draw just a line between the points.111 * White if selected (as always) or green otherwise.112 */113 public void visit(Segment ls) {114 Color color;115 if (inactive)116 color = inactiveColor;117 else if (ls.selected)118 color = selectedColor;119 else120 color = segmentColor;121 drawSegment(ls, color, showDirectionArrow);122 71 } 123 72 … … 129 78 Color wayColor; 130 79 if (inactive) 131 wayColor = inactive Color;80 wayColor = getPreferencesColor("inactive", Color.DARK_GRAY); 132 81 else { 133 wayColor = dfltWayColor; 134 for (Segment ls : w.segments) { 135 if (ls.incomplete) { 136 wayColor = incompleteColor; 137 break; 138 } 139 } 82 wayColor = getPreferencesColor("way", darkblue); 140 83 } 141 84 85 boolean showDirectionArrow = Main.pref.getBoolean("draw.segment.direction"); 86 boolean showOrderNumber = Main.pref.getBoolean("draw.segment.order_number"); 142 87 int orderNumber = 0; 143 for (Segment ls : w.segments) { 88 Node lastN = null; 89 for (Node n : w.nodes) { 90 if (lastN == null) { 91 lastN = n; 92 continue; 93 } 144 94 orderNumber++; 145 if (!ls.selected) //selectedalready in good color146 drawSegment(ls, w.selected && !inactive ? selectedColor : wayColor, showDirectionArrow);147 if (!ls.incomplete && showOrderNumber)148 drawOrderNumber(ls, orderNumber);95 drawSegment(lastN, n, w.selected && !inactive ? getPreferencesColor("selected", Color.WHITE) : wayColor, showDirectionArrow); 96 if (showOrderNumber) 97 drawOrderNumber(lastN, n, orderNumber); 98 lastN = n; 149 99 } 150 100 } 151 101 102 public void visit(Relation e) { 103 // relations are not drawn. 104 } 152 105 /** 153 * Draw an number of the order of the segment within the parents way 106 * Draw an number of the order of the two consecutive nodes within the 107 * parents way 154 108 */ 155 protected void drawOrderNumber( Segment ls, int orderNumber) {109 protected void drawOrderNumber(Node n1, Node n2, int orderNumber) { 156 110 int strlen = (""+orderNumber).length(); 157 Point p1 = nc.getPoint( ls.from.eastNorth);158 Point p2 = nc.getPoint( ls.to.eastNorth);111 Point p1 = nc.getPoint(n1.eastNorth); 112 Point p2 = nc.getPoint(n2.eastNorth); 159 113 int x = (p1.x+p2.x)/2 - 4*strlen; 160 114 int y = (p1.y+p2.y)/2 + 4; … … 163 117 if (screen.contains(x,y)) { 164 118 Color c = g.getColor(); 165 g.setColor(background Color);119 g.setColor(getPreferencesColor("background", Color.BLACK)); 166 120 g.fillRect(x-1, y-12, 8*strlen+1, 14); 167 121 g.setColor(c); … … 188 142 * Draw a line with the given color. 189 143 */ 190 protected void drawSegment(Segment ls, Color col, boolean showDirection) { 191 if (ls.incomplete) 192 return; 193 if (col != currentColor) { 194 displaySegments(col); 195 } 144 protected void drawSegment(Node n1, Node n2, Color col, boolean showDirection) { 145 g.setColor(col); 146 Point p1 = nc.getPoint(n1.eastNorth); 147 Point p2 = nc.getPoint(n2.eastNorth); 196 148 197 Point p1 = nc.getPoint(ls.from.eastNorth); 198 Point p2 = nc.getPoint(ls.to.eastNorth); 199 200 Rectangle screen = g.getClipBounds(); 149 Rectangle screen = g.getClipBounds(); 201 150 Line2D line = new Line2D.Double(p1.x, p1.y, p2.x, p2.y); 202 151 if (screen.contains(p1.x, p1.y, p2.x, p2.y) || screen.intersectsLine(line)) 203 152 { 204 currrentPath.moveTo(p1.x, p1.y); 205 currrentPath.lineTo(p2.x, p2.y); 153 g.drawLine(p1.x, p1.y, p2.x, p2.y); 206 154 207 155 if (showDirection) { 208 156 double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI; 209 currrentPath.lineTo((int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI))); 210 currrentPath.moveTo((int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI))); 211 currrentPath.lineTo(p2.x, p2.y); } 212 } 213 } 214 215 protected void displaySegments(Color newColor) { 216 if (currrentPath != null) { 217 g.setColor(currentColor); 218 ((Graphics2D) g).draw(currrentPath); 219 currrentPath = new GeneralPath(); 220 currentColor = newColor; 157 g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI))); 158 g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI))); 159 } 221 160 } 222 161 } -
branch/0.5/src/org/openstreetmap/josm/data/osm/visitor/Visitor.java
r298 r329 2 2 package org.openstreetmap.josm.data.osm.visitor; 3 3 4 import org.openstreetmap.josm.data.osm.Relation; 4 5 import org.openstreetmap.josm.data.osm.Node; 5 import org.openstreetmap.josm.data.osm.Segment;6 6 import org.openstreetmap.josm.data.osm.Way; 7 7 … … 14 14 public interface Visitor { 15 15 void visit(Node n); 16 void visit(Segment s);17 16 void visit(Way w); 17 void visit(Relation e); 18 18 }
Note:
See TracChangeset
for help on using the changeset viewer.