Changeset 15178 in josm for trunk/src/org


Ignore:
Timestamp:
2019-06-17T11:05:51+02:00 (5 years ago)
Author:
GerdP
Message:

fix #17819

  • Create ArrayList instead of modifying a CopyList instance in joinWays()
  • Avoid to remove node, instead add sublist to avoid duplicate nodes, always use addAll().
  • use HashSet to store larger collections of way ids, Collections.singleton for single ids

Result: Multipolygon.load() performance is much better for very complex multipolygons (1.6 secs instead of 30), no changes for normal sized relations.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java

    r15123 r15178  
    185185        public JoinedWay(List<Node> nodes, Collection<Long> wayIds, boolean selected) {
    186186            this.nodes = new ArrayList<>(nodes);
    187             this.wayIds = new ArrayList<>(wayIds);
     187            // see #17819
     188            if (wayIds.size() == 1) {
     189                this.wayIds = Collections.singleton(wayIds.iterator().next());
     190            } else {
     191                this.wayIds = wayIds.size() <= 10 ? new ArrayList<>(wayIds) : new HashSet<>(wayIds);
     192            }
    188193            this.selected = selected;
    189194        }
     
    638643                                --left;
    639644                                if (nodes == null) {
    640                                     nodes = w.getNodes();
     645                                    nodes = new ArrayList<>(w.getNodes());
    641646                                    wayIds.add(w.getUniqueId());
    642647                                }
    643                                 nodes.remove((mode == 21 || mode == 22) ? nl : 0);
    644648                                if (mode == 21) {
    645                                     nodes.addAll(c.getNodes());
     649                                    nodes.addAll(c.getNodes().subList(1, cl + 1));
    646650                                } else if (mode == 12) {
    647                                     nodes.addAll(0, c.getNodes());
    648                                 } else if (mode == 22) {
    649                                     for (Node node : c.getNodes()) {
    650                                         nodes.add(nl, node);
    651                                     }
    652                                 } else /* mode == 11 */ {
    653                                     for (Node node : c.getNodes()) {
    654                                         nodes.add(0, node);
     651                                    nodes.addAll(0, c.getNodes().subList(0, cl));
     652                                } else {
     653                                    ArrayList<Node> reversed = new ArrayList<>(c.getNodes());
     654                                    Collections.reverse(reversed);
     655                                    if (mode == 22) {
     656                                        nodes.addAll(reversed.subList(1, cl + 1));
     657                                    } else /* mode == 11 */ {
     658                                        nodes.addAll(0, reversed.subList(0, cl));
    655659                                    }
    656660                                }
Note: See TracChangeset for help on using the changeset viewer.