[geos-commits] [SCM] GEOS branch main updated. face0894c3a82268d4e551f65fa1c620b48cbf20
git at osgeo.org
git at osgeo.org
Fri Oct 11 14:00:30 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, main has been updated
via face0894c3a82268d4e551f65fa1c620b48cbf20 (commit)
from 29a4c7ea895da8bb721f1d9342b0a8ef3ad89b2f (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 face0894c3a82268d4e551f65fa1c620b48cbf20
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:
src/operation/relateng/TopologyComputer.cpp | 18 +-
tests/unit/operation/relateng/RelateNGTest.cpp | 59 +-
tests/xmltester/tests/general/TestRelateEmpty.xml | 1114 +++++++++++++++++++++
3 files changed, 1177 insertions(+), 14 deletions(-)
create mode 100644 tests/xmltester/tests/general/TestRelateEmpty.xml
hooks/post-receive
--
GEOS
More information about the geos-commits
mailing list