Ticket #24851: 24851-powerlines.patch

File 24851-powerlines.patch, 4.7 KB (added by GerdP, 33 hours ago)

Patch for test PowerLines so that it adds the related parent objects to the error node

  • src/org/openstreetmap/josm/data/validation/tests/PowerLines.java

     
    1111import java.util.EnumSet;
    1212import java.util.HashMap;
    1313import java.util.HashSet;
     14import java.util.LinkedHashSet;
    1415import java.util.List;
    1516import java.util.Map;
     17import java.util.Map.Entry;
    1618import java.util.Set;
    1719
    1820import org.openstreetmap.josm.data.coor.ILatLon;
     
    7577
    7678    private double hillyCompensation;
    7779    private double hillyThreshold;
    78     private final Set<Node> badConnections = new HashSet<>();
    79     private final Set<Node> missingTags = new HashSet<>();
     80    private final Map<Node, Set<OsmPrimitive>> badConnections = new HashMap<>();
     81    private final Map<Node, Set<OsmPrimitive>> missingTags = new HashMap<>();
    8082    private final Set<Way> wrongLineType = new HashSet<>();
    8183    private final Set<WaySegment> missingNodes = new HashSet<>();
    8284    private final Set<OsmPrimitive> refDiscontinuities = new HashSet<>();
     
    99101    @Override
    100102    public void visit(Node n) {
    101103        boolean nodeInLineOrCable = false;
    102         boolean connectedToUnrelated = false;
     104        List<Way> unrelatedParents = new ArrayList<>();
    103105        for (Way parent : n.getParentWays()) {
    104106            if (parent.hasTag(POWER, "line", MINOR_LINE, "cable"))
    105107                nodeInLineOrCable = true;
    106108            else if (!isRelatedToPower(parent))
    107                 connectedToUnrelated = true;
     109                unrelatedParents.add(parent);
    108110        }
    109         if (nodeInLineOrCable && connectedToUnrelated)
    110             badConnections.add(n);
     111        if (nodeInLineOrCable && !unrelatedParents.isEmpty()) {
     112            Set<OsmPrimitive> old = badConnections.get(n);
     113            if (old == null) {
     114                old = new HashSet<>();
     115                badConnections.put(n, old);
     116            }
     117            old.addAll(unrelatedParents);
     118        }
    111119    }
    112120
    113121    @Override
     
    162170            powerlineChecks(w);
    163171        }
    164172        // Then return the errors
    165         for (Node n : missingTags) {
     173        for (Entry<Node, Set<OsmPrimitive>> entry : missingTags.entrySet()) {
     174            Node n = entry.getKey();
    166175            if (!isInPowerStation(n)) {
    167176                errors.add(TestError.builder(this, Severity.WARNING, POWER_SUPPORT)
    168177                        // the "missing tag" grouping can become broken if the MapCSS message get reworded
    169178                        .message(tr("missing tag"), tr("node without power=*"))
    170                         .primitives(n)
     179                        .primitives(getAllPrimitives(entry))
     180                        .highlight(n)
    171181                        .build());
    172182            }
    173183        }
    174184
    175         for (Node n : badConnections) {
     185        for (Entry<Node, Set<OsmPrimitive>> entry : badConnections.entrySet()) {
    176186            errors.add(TestError.builder(this, Severity.WARNING, POWER_CONNECTION)
    177187                    .message(tr("Node connects a power line or cable with an object "
    178188                            + "which is not related to the power infrastructure"))
    179                     .primitives(n)
     189                    .primitives(getAllPrimitives(entry))
     190                    .highlight(entry.getKey())
    180191                    .build());
    181192        }
    182193
     
    224235    }
    225236
    226237    /**
     238     * Combine the node and the related objects.
     239     * @param entry a map entry with a node and related objects
     240     * @return set containing the node and the related objects
     241     */
     242    private Collection<? extends OsmPrimitive> getAllPrimitives(Entry<Node, Set<OsmPrimitive>> entry) {
     243        Set<OsmPrimitive> primitives = new LinkedHashSet<>();
     244        primitives.add(entry.getKey());
     245        primitives.addAll(entry.getValue());
     246        return primitives;
     247    }
     248
     249    /**
    227250     * The base powerline checks
    228251     * @param w The powerline to check
    229252     */
     
    253276
    254277            /// handle missing power line support tags (e.g. tower)
    255278            if (!isPowerTower(n) && !isPowerInfrastructure(n) && IN_DOWNLOADED_AREA.test(n)
    256                     && (!w.isFirstLastNode(n) || !isPowerStation(n)))
    257                 missingTags.add(n);
     279                    && (!w.isFirstLastNode(n) || !isPowerStation(n))) {
     280                Set<OsmPrimitive> old = missingTags.get(n);
     281                if (old == null) {
     282                    old = new HashSet<>();
     283                    missingTags.put(n, old);
     284                }
     285                old.add(w);
     286            }
    258287
    259288            /// handle missing nodes
    260289            double segmentLen = n.greatCircleDistance(prevNode);