Function for testing equivalence of the given geometries

gEquals(spgeom1, spgeom2 = NULL, byid = FALSE, returnDense=TRUE,
 checkValidity=FALSE)
  gEqualsExact(spgeom1, spgeom2 = NULL, tol=0.0, byid = FALSE,
 returnDense=TRUE, checkValidity=FALSE)

Arguments

spgeom1, spgeom2

sp objects as defined in package sp. If spgeom2 is NULL then spgeom1 is compared to itself.

byid

Logical vector determining if the function should be applied across ids (TRUE) or the entire object (FALSE) for spgeom1 and spgeom2

tol

Numerical value of tolerance to use when assessing equivalence

returnDense

default TRUE, if false returns a list of the length of spgeom1 of integer vectors listing the 1:length(spgeom2) indices which would be TRUE in the dense logical matrix representation; useful when the sizes of the byid=TRUE returned matrix is very large and it is sparse; essential when the returned matrix would be too large

checkValidity

default FALSE; error meesages from GEOS do not say clearly which object fails if a topology exception is encountered. If this argument is TRUE, gIsValid is run on each in turn in an environment in which object names are available. If objects are invalid, this is reported and those affected are named

Value

gEquals returns TRUE if geometries are "spatially equivalent" which requires that spgeom1 is within spgeom2 and spgeom2 is within spgeom1, this ignores ordering of points within the geometries. Note that it is possible for geometries with different coordinates to be "spatially equivalent".

gEqualsExact returns TRUE if geometries are "exactly equivalent" which requires that spgeom1 and spgeom1 are "spatially equivalent" and that their constituent points are in the same order.

Note

Error messages from GEOS, in particular topology exceptions, report 0-based object order, so geom 0 is spgeom1, and geom 1 is spgeom2.

Author

Roger Bivand & Colin Rundel

Examples


# p1 and p2 are spatially identical but not exactly identical due to point ordering
p1=readWKT("POLYGON((0 0,1 0,1 1,0 1,0 0))")
p2=readWKT("POLYGON((1 1,0 1,0 0,1 0,1 1))")
p3=readWKT("POLYGON((0.01 0.01,1.01 0.01,1.01 1.01,0.01 1.01,0.01 0.01))")

gEquals(p1,p2)
#> [1] TRUE
gEquals(p1,p3)
#> [1] FALSE
gEqualsExact(p1,p2)
#> [1] FALSE
gEqualsExact(p1,p3,tol=0)
#> [1] FALSE
gEqualsExact(p1,p3,tol=0.1)
#> [1] TRUE

# pt1 and p2t are spatially identical but not exactly identical due to point ordering
pt1 = readWKT("MULTIPOINT(1 1,2 2,3 3)")
pt2 = readWKT("MULTIPOINT(3 3,2 2,1 1)")
pt3 = readWKT("MULTIPOINT(1.01 1.01,2.01 2.01,3.01 3.01)")

gEquals(pt1,pt2)
#> [1] TRUE
gEquals(pt1,pt3)
#> [1] FALSE
gEqualsExact(pt1,pt2)
#> [1] FALSE
gEqualsExact(pt1,pt3,tol=0)
#> [1] FALSE
gEqualsExact(pt1,pt3,tol=0.1)
#> [1] TRUE


# l2 contains a point that l1 does not
l1 = readWKT("LINESTRING (10 10, 20 20)")
l2 = readWKT("LINESTRING (10 10, 15 15,20 20)")
gEquals(l1,l2)
#> [1] TRUE
gEqualsExact(l1,l2)
#> [1] FALSE