[geos-commits] [SCM] GEOS branch 3.13 updated. c6efac893a74f71b9d4fcc112e78def153f22e0b
git at osgeo.org
git at osgeo.org
Fri Oct 11 14:55:12 PDT 2024
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GEOS".
The branch, 3.13 has been updated
via c6efac893a74f71b9d4fcc112e78def153f22e0b (commit)
via 2d2802d7f7acd7919599b94f3d1530e8cd987aee (commit)
from c80bdc7d3afd7b20ee178a9be256038658ba9d20 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit c6efac893a74f71b9d4fcc112e78def153f22e0b
Author: Martin Davis <mtnclimb at gmail.com>
Date: Fri Oct 11 14:54:48 2024 -0700
Update NEWS
diff --git a/NEWS.md b/NEWS.md
index 0f267b12d..b605e1a62 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -3,7 +3,7 @@
- Fixes/Improvements:
- Fix ConcaveHullOfPolygons nested shell handling (GH-1169, Martin Davis)
-
+ - Fix RelateNG for computing IM for empty-nonempty cases (Martin Davis)
## Changes in 3.13.0
2024-09-06
commit 2d2802d7f7acd7919599b94f3d1530e8cd987aee
Author: Martin Davis <mtnclimb at gmail.com>
Date: Fri Oct 11 14:00:07 2024 -0700
Fix RelateNG IM for empty-nonempty cases
diff --git a/src/operation/relateng/TopologyComputer.cpp b/src/operation/relateng/TopologyComputer.cpp
index 1e1c64683..1c164d635 100644
--- a/src/operation/relateng/TopologyComputer.cpp
+++ b/src/operation/relateng/TopologyComputer.cpp
@@ -302,10 +302,16 @@ TopologyComputer::addPointOnPointExterior(bool isGeomA, const CoordinateXY* pt)
/* public */
void
-TopologyComputer::addPointOnGeometry(bool isA, Location locTarget, int dimTarget, const CoordinateXY* pt)
+TopologyComputer::addPointOnGeometry(bool isPointA, Location locTarget, int dimTarget, const CoordinateXY* pt)
{
(void)pt;
- updateDim(isA, Location::INTERIOR, locTarget, Dimension::P);
+ //-- update entry for Point interior
+ updateDim(isPointA, Location::INTERIOR, locTarget, Dimension::P);
+
+ //-- an empty geometry has no points to infer entries from
+ if (getGeometry(! isPointA).isEmpty())
+ return;
+
switch (dimTarget) {
case Dimension::P:
return;
@@ -323,8 +329,8 @@ TopologyComputer::addPointOnGeometry(bool isA, Location locTarget, int dimTarget
* If a point intersects an area target, then the area interior and boundary
* must extend beyond the point and thus interact with its exterior.
*/
- updateDim(isA, Location::EXTERIOR, Location::INTERIOR, Dimension::A);
- updateDim(isA, Location::EXTERIOR, Location::BOUNDARY, Dimension::L);
+ updateDim(isPointA, Location::EXTERIOR, Location::INTERIOR, Dimension::A);
+ updateDim(isPointA, Location::EXTERIOR, Location::BOUNDARY, Dimension::L);
return;
}
throw IllegalStateException("Unknown target dimension: " + std::to_string(dimTarget));
@@ -339,6 +345,10 @@ TopologyComputer::addLineEndOnGeometry(bool isLineA, Location locLineEnd, Locati
//-- record topology at line end point
updateDim(isLineA, locLineEnd, locTarget, Dimension::P);
+ //-- an empty geometry has no points to infer entries from
+ if (getGeometry(! isLineA).isEmpty())
+ return;
+
//-- Line and Area targets may have additional topology
switch (dimTarget) {
case Dimension::P:
diff --git a/tests/unit/operation/relateng/RelateNGTest.cpp b/tests/unit/operation/relateng/RelateNGTest.cpp
index 7e54c71c9..2a4a53156 100644
--- a/tests/unit/operation/relateng/RelateNGTest.cpp
+++ b/tests/unit/operation/relateng/RelateNGTest.cpp
@@ -839,20 +839,21 @@ void object::test<60> ()
//================ Empty Geometries ==============
+std::string empties[] = {
+ "POINT EMPTY",
+ "LINESTRING EMPTY",
+ "POLYGON EMPTY",
+ "MULTIPOINT EMPTY",
+ "MULTILINESTRING EMPTY",
+ "MULTIPOLYGON EMPTY",
+ "GEOMETRYCOLLECTION EMPTY"
+};
+
//-- test equals against all combinations of empty geometries
template<>
template<>
void object::test<61> ()
{
- std::string empties[] = {
- "POINT EMPTY",
- "LINESTRING EMPTY",
- "POLYGON EMPTY",
- "MULTIPOINT EMPTY",
- "MULTILINESTRING EMPTY",
- "MULTIPOLYGON EMPTY",
- "GEOMETRYCOLLECTION EMPTY"
- };
int nempty = 7;
for (int i = 0; i < nempty; i++) {
for (int j = 0; j < nempty; j++) {
@@ -862,13 +863,51 @@ void object::test<61> ()
checkEquals(a, b, true);
}
}
+}
+// testEmptyNonEmpty
+template<>
+template<>
+void object::test<62> ()
+{
+ std::string nonEmptyPoint = "POINT (1 1)";
+ std::string nonEmptyLine = "LINESTRING (1 1, 2 2)";
+ std::string nonEmptyPolygon = "POLYGON ((1 1, 1 2, 2 1, 1 1))";
+
+ for (int i = 0; i < 7; i++) {
+ std::string empty = empties[i];
+
+ checkRelate(empty, nonEmptyPoint, "FFFFFF0F2");
+ checkRelate(nonEmptyPoint, empty, "FF0FFFFF2");
+
+ checkRelate(empty, nonEmptyLine, "FFFFFF102");
+ checkRelate(nonEmptyLine, empty, "FF1FF0FF2");
+
+ checkRelate(empty, nonEmptyPolygon, "FFFFFF212");
+ checkRelate(nonEmptyPolygon, empty, "FF2FF1FF2");
+
+ checkEquals(empty, nonEmptyPoint, false);
+ checkEquals(empty, nonEmptyLine, false);
+ checkEquals(empty, nonEmptyPolygon, false);
+
+ checkIntersectsDisjoint(empty, nonEmptyPoint, false);
+ checkIntersectsDisjoint(empty, nonEmptyLine, false);
+ checkIntersectsDisjoint(empty, nonEmptyPolygon, false);
+
+ checkContainsWithin(empty, nonEmptyPoint, false);
+ checkContainsWithin(empty, nonEmptyLine, false);
+ checkContainsWithin(empty, nonEmptyPolygon, false);
+
+ checkContainsWithin(nonEmptyPoint, empty, false);
+ checkContainsWithin(nonEmptyLine, empty, false);
+ checkContainsWithin(nonEmptyPolygon, empty, false);
+ }
}
// Prepared test
template<>
template<>
-void object::test<62> ()
+void object::test<63> ()
{
std::string a = "POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))";
std::string b = "POLYGON((0.5 0.5, 1.5 0.5, 1.5 1.5, 0.5 1.5, 0.5 0.5))";
diff --git a/tests/xmltester/tests/general/TestRelateEmpty.xml b/tests/xmltester/tests/general/TestRelateEmpty.xml
new file mode 100644
index 000000000..6ed612820
--- /dev/null
+++ b/tests/xmltester/tests/general/TestRelateEmpty.xml
@@ -0,0 +1,1114 @@
+<run>
+ <desc>
+ Test relate predicates against cases containing EMPTY geometries.
+ </desc>
+
+<!-- ================ POINT ============== -->
+<case>
+ <desc>P/P - empty point VS empty point </desc>
+ <a>
+ POINT EMPTY
+ </a>
+ <b>
+ POINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>P/L - empty point VS empty line</desc>
+ <a>
+ POINT EMPTY
+ </a>
+ <b>
+ LINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>P/A - empty point VS empty polygon</desc>
+ <a>
+ POINT EMPTY
+ </a>
+ <b>
+ POLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>P/mP - empty Point VS empty MultiPoint </desc>
+ <a>
+ POINT EMPTY
+ </a>
+ <b>
+ MULTIPOINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>P/mL - empty Point VS empty MultiLineString</desc>
+ <a>
+ POINT EMPTY
+ </a>
+ <b>
+ MULTILINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>P/mA - empty Point VS empty MultiPolygon</desc>
+ <a>
+ POINT EMPTY
+ </a>
+ <b>
+ MULTIPOLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>P/GC - empty Point VS empty GC </desc>
+ <a>
+ POINT EMPTY
+ </a>
+ <b>
+ GEOMETRYCOLLECTION EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<!-- ================ LINESTRING ============== -->
+<case>
+ <desc>L/P - empty line VS empty point </desc>
+ <a>
+ LINESTRING EMPTY
+ </a>
+ <b>
+ POINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>L/L - empty line VS empty line</desc>
+ <a>
+ LINESTRING EMPTY
+ </a>
+ <b>
+ LINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>L/A - empty line VS empty polygon</desc>
+ <a>
+ LINESTRING EMPTY
+ </a>
+ <b>
+ POLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>L/mP - empty line VS empty MultiPoint </desc>
+ <a>
+ LINESTRING EMPTY
+ </a>
+ <b>
+ MULTIPOINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>L/mL - empty line VS empty MultiLineString</desc>
+ <a>
+ LINESTRING EMPTY
+ </a>
+ <b>
+ MULTILINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>L/mA - empty line VS empty MultiPolygon</desc>
+ <a>
+ LINESTRING EMPTY
+ </a>
+ <b>
+ MULTIPOLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>L/GC - empty line VS empty GC </desc>
+ <a>
+ LINESTRING EMPTY
+ </a>
+ <b>
+ GEOMETRYCOLLECTION EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<!-- ================ POLYGON ============== -->
+
+<case>
+ <desc>A/P - empty polygon VS empty line</desc>
+ <a>
+ POLYGON EMPTY
+ </a>
+ <b>
+ POINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>A/L - empty polygon VS empty line</desc>
+ <a>
+ POLYGON EMPTY
+ </a>
+ <b>
+ LINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>A/A - empty polygon VS empty polygon</desc>
+ <a>
+ POLYGON EMPTY
+ </a>
+ <b>
+ POLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>A/mP - empty polygon VS empty MultiPoint </desc>
+ <a>
+ POLYGON EMPTY
+ </a>
+ <b>
+ MULTIPOINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>A/mP - empty polygon VS empty MultiLineString</desc>
+ <a>
+ POLYGON EMPTY
+ </a>
+ <b>
+ MULTILINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>A/mP - empty polygon VS empty MultiPolygon</desc>
+ <a>
+ POLYGON EMPTY
+ </a>
+ <b>
+ MULTIPOLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>A/mP - empty polygon VS empty GC </desc>
+ <a>
+ POLYGON EMPTY
+ </a>
+ <b>
+ GEOMETRYCOLLECTION EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<!-- ================ MULTIPOINT ============== -->
+<case>
+ <desc>mP/P - empty MultiPoint VS empty point </desc>
+ <a>
+ MULTIPOINT EMPTY
+ </a>
+ <b>
+ POINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mP/L - empty MultiPoint VS empty line</desc>
+ <a>
+ MULTIPOINT EMPTY
+ </a>
+ <b>
+ LINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mP/A - empty MultiPoint VS empty polygon</desc>
+ <a>
+ MULTIPOINT EMPTY
+ </a>
+ <b>
+ POLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mP/mP - empty MultiPoint VS empty MultiPoint </desc>
+ <a>
+ MULTIPOINT EMPTY
+ </a>
+ <b>
+ MULTIPOINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mP/mL - empty MultiPoint VS empty MultiLineString</desc>
+ <a>
+ MULTIPOINT EMPTY
+ </a>
+ <b>
+ MULTILINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mP/mA - empty MultiPoint VS empty MultiPolygon</desc>
+ <a>
+ MULTIPOINT EMPTY
+ </a>
+ <b>
+ MULTIPOLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mP/GC - empty MultiPoint VS empty GC </desc>
+ <a>
+ MULTIPOINT EMPTY
+ </a>
+ <b>
+ GEOMETRYCOLLECTION EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<!-- ================ LINESTRING ============== -->
+<case>
+ <desc>mL/P - empty Multiline VS empty point </desc>
+ <a>
+ MULTILINESTRING EMPTY
+ </a>
+ <b>
+ POINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mL/L - empty Multiline VS empty line</desc>
+ <a>
+ MULTILINESTRING EMPTY
+ </a>
+ <b>
+ LINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mL/A - empty Multiline VS empty polygon</desc>
+ <a>
+ MULTILINESTRING EMPTY
+ </a>
+ <b>
+ POLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mL/mP - empty Multiline VS empty MultiPoint </desc>
+ <a>
+ MULTILINESTRING EMPTY
+ </a>
+ <b>
+ MULTIPOINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mL/mL - empty Multiline VS empty MultiLineString</desc>
+ <a>
+ MULTILINESTRING EMPTY
+ </a>
+ <b>
+ MULTILINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mL/mA - empty Multiline VS empty MultiPolygon</desc>
+ <a>
+ MULTILINESTRING EMPTY
+ </a>
+ <b>
+ MULTIPOLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mL/GC - empty Multiline VS empty GC </desc>
+ <a>
+ MULTILINESTRING EMPTY
+ </a>
+ <b>
+ GEOMETRYCOLLECTION EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<!-- ================ POLYGON ============== -->
+
+<case>
+ <desc>mA/P - empty Multipolygon VS empty line</desc>
+ <a>
+ MULTIPOLYGON EMPTY
+ </a>
+ <b>
+ POINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mA/L - empty Multipolygon VS empty line</desc>
+ <a>
+ MULTIPOLYGON EMPTY
+ </a>
+ <b>
+ LINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mA/A - empty Multipolygon VS empty polygon</desc>
+ <a>
+ MULTIPOLYGON EMPTY
+ </a>
+ <b>
+ POLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mA/mP - empty Multipolygon VS empty MultiPoint </desc>
+ <a>
+ MULTIPOLYGON EMPTY
+ </a>
+ <b>
+ MULTIPOINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mA/mL - empty Multipolygon VS empty MultiLineString</desc>
+ <a>
+ MULTIPOLYGON EMPTY
+ </a>
+ <b>
+ MULTILINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mA/mA - empty Multipolygon VS empty MultiPolygon</desc>
+ <a>
+ MULTIPOLYGON EMPTY
+ </a>
+ <b>
+ MULTIPOLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>mA/GC - empty Multipolygon VS empty GC </desc>
+ <a>
+ MULTIPOLYGON EMPTY
+ </a>
+ <b>
+ GEOMETRYCOLLECTION EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<!-- ================ POLYGON ============== -->
+
+<case>
+ <desc>GC/P - empty GC VS empty line</desc>
+ <a>
+ GEOMETRYCOLLECTION EMPTY
+ </a>
+ <b>
+ POINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>GC/L - empty GC VS empty line</desc>
+ <a>
+ GEOMETRYCOLLECTION EMPTY
+ </a>
+ <b>
+ LINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>GC/A - empty GC VS empty polygon</desc>
+ <a>
+ GEOMETRYCOLLECTION EMPTY
+ </a>
+ <b>
+ POLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>GC/mP - empty GC VS empty MultiPoint </desc>
+ <a>
+ GEOMETRYCOLLECTION EMPTY
+ </a>
+ <b>
+ MULTIPOINT EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>GC/mL - empty GC VS empty MultiLineString</desc>
+ <a>
+ GEOMETRYCOLLECTION EMPTY
+ </a>
+ <b>
+ MULTILINESTRING EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>GC/mA - empty GC VS empty MultiPolygon</desc>
+ <a>
+ GEOMETRYCOLLECTION EMPTY
+ </a>
+ <b>
+ MULTIPOLYGON EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>GC/GC - empty GC VS empty GC </desc>
+ <a>
+ GEOMETRYCOLLECTION EMPTY
+ </a>
+ <b>
+ GEOMETRYCOLLECTION EMPTY
+ </b>
+ <test><op name="relate" arg3="FFFFFFFF2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> true </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<!-- ================ Mixed EMPTY and non-EMPTY ============== -->
+
+<case>
+ <desc>P/P - empty Point VS Point</desc>
+ <a>
+ POINT EMPTY
+ </a>
+ <b>
+ POINT (1 1)
+ </b>
+ <test><op name="relate" arg3="FFFFFF0F2" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> false </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+
+<case>
+ <desc>P/L - empty Point VS LineString</desc>
+ <a>
+ POINT EMPTY
+ </a>
+ <b>
+ LINESTRING (1 1, 2 2)
+ </b>
+ <test><op name="relate" arg3="FFFFFF102" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> false </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+<case>
+ <desc>P/L - empty Point VS Polygon</desc>
+ <a>
+ POINT EMPTY
+ </a>
+ <b>
+ POLYGON ((1 1, 1 2, 2 1, 1 1))
+ </b>
+ <test><op name="relate" arg3="FFFFFF212" arg1="A" arg2="B"> true </op></test>
+ <test><op name="contains" arg1="A" arg2="B"> false </op></test>
+ <test><op name="coveredBy" arg1="A" arg2="B"> false </op></test>
+ <test><op name="covers" arg1="A" arg2="B"> false </op></test>
+ <test><op name="crosses" arg1="A" arg2="B"> false </op></test>
+ <test><op name="disjoint" arg1="A" arg2="B"> true </op></test>
+ <test><op name="equalsTopo" arg1="A" arg2="B"> false </op></test>
+ <test><op name="intersects" arg1="A" arg2="B"> false </op></test>
+ <test><op name="overlaps" arg1="A" arg2="B"> false </op></test>
+ <test><op name="touches" arg1="A" arg2="B"> false </op></test>
+ <test><op name="within" arg1="A" arg2="B"> false </op></test>
+</case>
+
+
+
+
+</run>
-----------------------------------------------------------------------
Summary of changes:
NEWS.md | 2 +-
src/operation/relateng/TopologyComputer.cpp | 18 +-
tests/unit/operation/relateng/RelateNGTest.cpp | 59 +-
tests/xmltester/tests/general/TestRelateEmpty.xml | 1114 +++++++++++++++++++++
4 files changed, 1178 insertions(+), 15 deletions(-)
create mode 100644 tests/xmltester/tests/general/TestRelateEmpty.xml
hooks/post-receive
--
GEOS
More information about the geos-commits
mailing list