From eb2943c6656a26c0bf75da917438d3591ed36aa8 Mon Sep 17 00:00:00 2001 From: Martin Davis Date: Thu, 18 Apr 2024 13:25:01 -0700 Subject: [PATCH] Add DistanceOp optimization for Point-Point (#1049) --- .../jts/operation/distance/DistanceOp.java | 5 ++ .../distance/PointPointDistancePerfTest.java | 61 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 modules/core/src/test/java/test/jts/perf/operation/distance/PointPointDistancePerfTest.java diff --git a/modules/core/src/main/java/org/locationtech/jts/operation/distance/DistanceOp.java b/modules/core/src/main/java/org/locationtech/jts/operation/distance/DistanceOp.java index cca020c846..5675926d96 100644 --- a/modules/core/src/main/java/org/locationtech/jts/operation/distance/DistanceOp.java +++ b/modules/core/src/main/java/org/locationtech/jts/operation/distance/DistanceOp.java @@ -158,6 +158,11 @@ public double distance() if (geom[0].isEmpty() || geom[1].isEmpty()) return 0.0; + //-- optimization for Point/Point case + if (geom[0] instanceof Point && geom[1] instanceof Point) { + return geom[0].getCoordinate().distance(geom[1].getCoordinate()); + } + computeMinDistance(); return minDistance; } diff --git a/modules/core/src/test/java/test/jts/perf/operation/distance/PointPointDistancePerfTest.java b/modules/core/src/test/java/test/jts/perf/operation/distance/PointPointDistancePerfTest.java new file mode 100644 index 0000000000..7472502dfd --- /dev/null +++ b/modules/core/src/test/java/test/jts/perf/operation/distance/PointPointDistancePerfTest.java @@ -0,0 +1,61 @@ +package test.jts.perf.operation.distance; + +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Envelope; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; + +import test.jts.perf.PerformanceTestCase; +import test.jts.perf.PerformanceTestRunner; + +public class PointPointDistancePerfTest extends PerformanceTestCase { + + + public static void main(String args[]) { + PerformanceTestRunner.run(PointPointDistancePerfTest.class); + } + + private Point[] grid; + + public PointPointDistancePerfTest(String name) { + super(name); + setRunSize(new int[] {10000}); + setRunIterations(1); + } + + public void startRun(int npts) + { + System.out.println("\n------- Running with # pts = " + npts); + grid = createPointGrid(new Envelope(0, 10., 0, 10), npts); + } + + private Point[] createPointGrid(Envelope envelope, int npts) { + List geoms = new ArrayList(); + GeometryFactory fact = new GeometryFactory(); + int nSide = (int) Math.sqrt(npts); + double xInc = envelope.getWidth() / nSide; + double yInc = envelope.getHeight() / nSide; + for (int i = 0; i < nSide; i++) { + for (int j = 0; j < nSide; j++) { + double x = envelope.getMinX() + i * xInc; + double y = envelope.getMinY() + i * yInc; + Point p = fact.createPoint(new Coordinate(x, y)); + geoms.add(p); + } + } + return GeometryFactory.toPointArray(geoms); + } + + public void runPoints() { + for (Geometry p1 : grid) { + for (Geometry p2 : grid) { + double dist = p1.distance(p2); + } + } + } + +}