Changeset 366 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2007-10-11T23:28:26+02:00 (17 years ago)
Author:
gebner
Message:

Handle merging of incomplete ways. Fixes #392.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java

    r362 r366  
    2626        /**
    2727         * Map from primitives in the database to visited primitives. (Attention: The other way
    28          * round than mergedNodes)
     28         * round than mergedPrims)
    2929         */
    3030        public Map<OsmPrimitive, OsmPrimitive> conflicts = new HashMap<OsmPrimitive, OsmPrimitive>();
     
    3838         * in ds.nodes instead.
    3939         */
    40         private final Map<Node, Node> mergedNodes = new HashMap<Node, Node>();
     40        private final Map<OsmPrimitive, OsmPrimitive> mergedPrims
     41                = new HashMap<OsmPrimitive, OsmPrimitive>();
    4142
    4243        public MergeVisitor(DataSet ds, DataSet mergeds) {
     
    5051         */
    5152        public void visit(Node other) {
    52                 if (mergeAfterId(mergedNodes, ds.nodes, other))
     53                if (mergeAfterId(mergedPrims, ds.nodes, other))
    5354                        return;
    5455
     
    6364                        ds.nodes.add(other);
    6465                else {
    65                         mergedNodes.put(other, my);
     66                        mergedPrims.put(other, my);
    6667                        mergeCommon(my, other);
    6768                        if (my.modified && !other.modified)
     
    7576        }
    7677
    77         /**
    78          * Simply calls cloneFrom() for now.
    79          * Might be useful to keep around to facilitate merge with the relations
    80          * branch.
    81          */
    8278        private <T extends OsmPrimitive> void cloneFromExceptIncomplete(T myOsm, T otherOsm) {
    83                 myOsm.cloneFrom(otherOsm);
     79                if (!otherOsm.incomplete) {
     80                        myOsm.cloneFrom(otherOsm);
     81                }
    8482    }
    8583
     
    8987         */
    9088        public void visit(Way other) {
    91                 if (mergeAfterId(null, ds.ways, other))
     89                if (mergeAfterId(mergedPrims, ds.ways, other))
    9290                        return;
    9391
     
    102100                        ds.ways.add(other);
    103101                } else {
     102                        mergedPrims.put(other, my);
    104103                        mergeCommon(my, other);
    105104                        if (my.modified && !other.modified)
     
    151150                        }*/
    152151                } else {
     152                        mergedPrims.put(other, my);
    153153                        mergeCommon(my, other);
    154154                        if (my.modified && !other.modified)
     
    191191         */
    192192        public void fixReferences() {
    193                 for (Way w : ds.ways)
    194                         fixWay(w);
     193                for (Way w : ds.ways) fixWay(w);
     194                for (Relation r : ds.relations) fixRelation(r);
    195195                for (OsmPrimitive osm : conflicts.values())
    196196                        if (osm instanceof Way)
    197197                                fixWay((Way)osm);
     198                        else if (osm instanceof Relation)
     199                                fixRelation((Relation) osm);
    198200        }
    199201
     
    202204            LinkedList<Node> newNodes = new LinkedList<Node>();
    203205            for (Node n : w.nodes) {
    204                 Node otherN = mergedNodes.get(n);
     206                Node otherN = (Node) mergedPrims.get(n);
    205207                newNodes.add(otherN == null ? n : otherN);
    206208                if (otherN != null)
     
    210212                w.nodes.clear();
    211213                w.nodes.addAll(newNodes);
     214                }
    212215    }
    213     }
     216
     217        private void fixRelation(Relation r) {
     218            boolean replacedSomething = false;
     219            LinkedList<RelationMember> newMembers = new LinkedList<RelationMember>();
     220            for (RelationMember m : r.members) {
     221                OsmPrimitive otherP = mergedPrims.get(m.member);
     222                        if (otherP == null) {
     223                                newMembers.add(m);
     224                        } else {
     225                                RelationMember mnew = new RelationMember(m);
     226                                mnew.member = otherP;
     227                                newMembers.add(mnew);
     228                        replacedSomething = true;
     229                        }
     230            }
     231            if (replacedSomething) {
     232                r.members.clear();
     233                r.members.addAll(newMembers);
     234                }
     235        }
    214236
    215237        /**
     
    286308         * @return <code>true</code>, if no merge is needed or merge is performed already.
    287309         */
    288         private <P extends OsmPrimitive> boolean mergeAfterId(Map<P,P> merged, Collection<P> primitives, P other) {
     310        private <P extends OsmPrimitive> boolean mergeAfterId(Map<OsmPrimitive,OsmPrimitive> merged, Collection<P> primitives, P other) {
    289311                for (P my : primitives) {
     312                        Date myd = my.timestamp == null ? new Date(0) : my.getTimestamp();
     313                        Date otherd = other.timestamp == null ? new Date(0) : other.getTimestamp();
    290314                        if (my.realEqual(other, false)) {
    291315                                if (merged != null)
     
    297321                                if (merged != null)
    298322                                        merged.put(other, my);
    299                                 if (my.getTimestamp().before(other.getTimestamp())) {
     323                                if (myd.before(otherd)) {
    300324                                        my.modified = other.modified;
    301325                                        my.timestamp = other.timestamp;
     
    304328                        }
    305329                        if (my.id == other.id && my.id != 0) {
    306                                 if (my.modified && other.modified) {
     330                                if (my.incomplete) {
     331                                        return false;
     332                                } else if (my.modified && other.modified) {
    307333                                        conflicts.put(my, other);
    308                                         if (merged != null)
    309                                                 merged.put(other, my);
    310334                                } else if (!my.modified && !other.modified) {
    311                                         if (my.getTimestamp().before(other.getTimestamp())) {
     335                                        if (myd.before(otherd)) {
    312336                                                cloneFromExceptIncomplete(my, other);
    313                                                 if (merged != null)
    314                                                         merged.put(other, my);
    315337                                        }
    316338                                } else if (other.modified) {
    317                                         if (my.getTimestamp().after(other.getTimestamp())) {
     339                                        if (myd.after(otherd)) {
    318340                                                conflicts.put(my, other);
    319                                                 if (merged != null)
    320                                                         merged.put(other, my);
    321341                                        } else {
    322342                                                cloneFromExceptIncomplete(my, other);
    323                                                 if (merged != null)
    324                                                         merged.put(other, my);
    325343                                        }
    326344                                } else if (my.modified) {
    327                                         if (my.getTimestamp().before(other.getTimestamp())) {
     345                                        if (myd.before(otherd)) {
    328346                                                conflicts.put(my, other);
    329                                                 if (merged != null)
    330                                                         merged.put(other, my);
    331                                         }
    332                                 }
     347                                        }
     348                                }
     349                                if (merged != null)
     350                                        merged.put(other, my);
    333351                                return true;
    334352                        }
Note: See TracChangeset for help on using the changeset viewer.