package com.revolsys.geometry.graph.visitor;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import com.revolsys.geometry.graph.Graph;
import com.revolsys.geometry.graph.Node;
import com.revolsys.geometry.index.IdObjectIndex;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.visitor.CreateListVisitor;
public class NodeLessThanDistanceOfGeometryVisitor<T> implements Consumer<Node<T>> {
public static <T> List<Node<T>> getNodes(final Graph<T> graph, final Geometry geometry,
final double maxDistance) {
if (geometry == null) {
return Collections.emptyList();
} else {
final CreateListVisitor<Node<T>> results = new CreateListVisitor<>();
BoundingBox env = geometry.getBoundingBox();
env = env.expand(maxDistance);
final IdObjectIndex<Node<T>> index = graph.getNodeIndex();
final NodeLessThanDistanceOfGeometryVisitor<T> visitor = new NodeLessThanDistanceOfGeometryVisitor<>(
geometry, maxDistance, results);
index.forEach(env, visitor);
return results.getList();
}
}
private final Geometry geometry;
private final GeometryFactory geometryFactory;
private final Consumer<Node<T>> matchVisitor;
private final double maxDistance;
public NodeLessThanDistanceOfGeometryVisitor(final Geometry geometry, final double maxDistance,
final Consumer<Node<T>> matchVisitor) {
this.geometry = geometry;
this.maxDistance = maxDistance;
this.matchVisitor = matchVisitor;
this.geometryFactory = geometry.getGeometryFactory();
}
@Override
public void accept(final Node<T> node) {
final double distance = this.geometry.distancePoint(node);
if (distance < this.maxDistance) {
this.matchVisitor.accept(node);
}
}
}