Skip to content

Commit

Permalink
handle stub-loops
Browse files Browse the repository at this point in the history
  • Loading branch information
msbarry committed Nov 18, 2024
1 parent 267dd75 commit 202c14e
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -201,18 +201,35 @@ private void removeShortStubEdges() {
}
while (!toRemove.isEmpty()) {
var edge = toRemove.poll();
if (edge.removed) {
continue;
}
edge.remove();
if (degreeTwoMerge(edge.from) instanceof Edge merged && isShortStubEdge(merged)) {
toRemove.offer(merged);
}
if (degreeTwoMerge(edge.to) instanceof Edge merged && isShortStubEdge(merged)) {
toRemove.offer(merged);
if (edge.from.getEdges().size() == 1) {
var other = edge.from.getEdges().getFirst();
if (isShortStubEdge(other)) {
toRemove.offer(other);
}
}
if (edge.from != edge.to) {
if (degreeTwoMerge(edge.to) instanceof Edge merged && isShortStubEdge(merged)) {
toRemove.offer(merged);
}
if (edge.to.getEdges().size() == 1) {
var other = edge.to.getEdges().getFirst();
if (isShortStubEdge(other)) {
toRemove.offer(other);
}
}
}
}
}

private boolean isShortStubEdge(Edge edge) {
return edge != null && edge.main && edge.length < stubMinLength &&
return edge != null && !edge.removed && edge.length < stubMinLength &&
(edge.from.getEdges().size() == 1 || edge.to.getEdges().size() == 1 || edge.from == edge.to);
}

Expand Down Expand Up @@ -420,6 +437,7 @@ private class Edge {
final Node to;
final double length;
final boolean main;
boolean removed;

Edge reversed;
List<Coordinate> coordinates;
Expand All @@ -442,8 +460,11 @@ public Edge(int id, Node from, Node to, double length, List<Coordinate> coordina
}

public void remove() {
from.removeEdge(this);
to.removeEdge(reversed);
if (!removed) {
from.removeEdge(this);
to.removeEdge(reversed);
removed = true;
}
}

double angleTo(Edge other) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,24 @@ void testMergeCarriagewaysWithTwoSplits() {
);
}

@Test
void testMergeLoopAttachedToStub() {
var merger = new LoopLineMerger()
.setMinLength(10)
.setLoopMinLength(10)
.setStubMinLength(10)
.setTolerance(-1);

merger.add(newLineString(-20, 0, 0, 0, 20, 0));
merger.add(newLineString(0, 0, 0, 1));
merger.add(newLineString(0, 1, 1, 2, 1, 1, 0, 1));

assertEquals(
List.of(newLineString(-20, 0, 0, 0, 20, 0)),
merger.getMergedLineStrings()
);
}

@Test
void testRealWorldHarkingen() {
var merger = new LoopLineMerger()
Expand Down

0 comments on commit 202c14e

Please sign in to comment.