diff --git a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java index a420eb712..867d93e0f 100644 --- a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java +++ b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -12,6 +13,12 @@ import java.util.Set; import org.osm2world.core.map_elevation.data.EleConnector; +import org.osm2world.core.math.VectorXZ; +import org.apache.commons.math3.stat.descriptive.rank.Median; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Envelope; +import org.locationtech.jts.index.kdtree.KdNode; +import org.locationtech.jts.index.kdtree.KdTree; /** * enforcer implementation that ignores many of the constraints, @@ -34,23 +41,35 @@ public final class SimpleEleConstraintEnforcer implements EleConstraintEnforcer @Override public void addConnectors(Iterable newConnectors) { - for (EleConnector c : newConnectors) { connectors.add(c); } - + /* build Kd-tree */ + /* ArrayList is stored in the KdNode */ + KdTree kdTree = new KdTree(); + for (EleConnector c : connectors) { + Coordinate co = new Coordinate(c.pos.x, c.pos.z); + KdNode node = kdTree.query(co); + if (node == null) { + ArrayList cs = new ArrayList(); + cs.add(c); + kdTree.insert(co, cs); + } else { + ArrayList cs = (ArrayList) node.getData(); + cs.add(c); + } + } /* connect connectors */ - for (EleConnector c1 : newConnectors) { - for (EleConnector c2 : connectors) { - + Coordinate co = new Coordinate(c1.pos.x, c1.pos.z); + KdNode node = kdTree.query(co); + ArrayList cs = (ArrayList) node.getData(); + for (EleConnector c2 : cs) { if (c1 != c2 && c1.connectsTo(c2)) { requireSameEle(c1, c2); } - } } - } @Override