diff --git a/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelateNG.java b/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelateNG.java index 97af365712..c0f0594069 100644 --- a/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelateNG.java +++ b/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelateNG.java @@ -227,10 +227,6 @@ public boolean evaluate(Geometry b, TopologyPredicate predicate) { RelateGeometry geomB = new RelateGeometry(b, boundaryNodeRule); - if (geomA.isEmpty() && geomB.isEmpty()) { - //TODO: what if predicate is disjoint? Perhaps use result on disjoint envs? - return finishValue(predicate); - } int dimA = geomA.getDimensionReal(); int dimB = geomB.getDimensionReal(); diff --git a/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelatePredicate.java b/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelatePredicate.java index 87d9f51b53..7802be5a9b 100644 --- a/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelatePredicate.java +++ b/modules/core/src/main/java/org/locationtech/jts/operation/relateng/RelatePredicate.java @@ -482,11 +482,20 @@ public static TopologyPredicate equalsTopo() { @Override public void init(int dimA, int dimB) { super.init(dimA, dimB); - require(dimA == dimB); + //-- don't require equal dims, because EMPTY = EMPTY for all dims } + @Override + public boolean requireInteraction() { + //-- allow EMPTY = EMPTY + return false; + }; + @Override public void init(Envelope envA, Envelope envB) { + //-- handle EMPTY = EMPTY cases + setValueIf(true, envA.isNull() && envB.isNull()); + require(envA.equals(envB)); } diff --git a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java index 21f1aac5fe..93633935d5 100644 --- a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java +++ b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java @@ -597,7 +597,7 @@ public void testRepeatedPointAA() { checkRelate(a, b, "212F01FF2"); } - //================ Repeated Points ============== + //================ EMPTY geometries ============== public void testEmptyEquals() { String empties[] = { @@ -614,9 +614,8 @@ public void testEmptyEquals() { for (int j = 0; j < nempty; j++) { String a = empties[i]; String b = empties[j]; - checkRelate(a, b, "FFFFFFFF2"); - //-- currently in JTS empty geometries do NOT test equal - checkEquals(a, b, false); + ///-- empty geometries are all topologically equal + checkEquals(a, b, true); } } }