package com.revolsys.geometry.graph.visitor; import java.util.Set; import java.util.function.Consumer; import com.revolsys.geometry.graph.Edge; import com.revolsys.geometry.graph.Graph; import com.revolsys.geometry.graph.Node; import com.revolsys.geometry.model.LineString; import com.revolsys.geometry.util.LineStringUtil; import com.revolsys.util.ObjectProcessor; /** * Find all edges that share the same line geometry and remove the current edge * and matching edges. Can be used to dissolve lines between polygons. */ public class RemoveBothDuplicateEdgeVisitor<T> implements Consumer<Edge<T>>, ObjectProcessor<Graph<T>> { @Override public void accept(final Edge<T> edge) { final LineString line = edge.getLine(); final Node<T> fromNode = edge.getFromNode(); final Node<T> toNode = edge.getToNode(); final Set<Edge<T>> edges = fromNode.getEdgesTo(toNode); edges.remove(edge); boolean hasDuplicate = false; for (final Edge<T> edge2 : edges) { final LineString line2 = edge2.getLine(); if (LineStringUtil.equalsIgnoreDirection(line, line2, 2)) { edge2.remove(); hasDuplicate = true; } } if (hasDuplicate) { edge.remove(); } } @Override public void process(final Graph<T> graph) { graph.forEachEdge(this); } }