func Overlaps(a, b geom.Geometry) (bool, error) {
	result, err := binaryOpB(a, b, func(h C.GEOSContextHandle_t, a, b *C.GEOSGeometry) C.char {
		return C.GEOSOverlaps_r(h, a, b)
	})
	return result, wrap(err, "executing GEOSOverlaps_r")
}
Overlaps returns true if and only if geometry A and B overlap with each
other. Formally, the following conditions must hold:

1. The geometries must have the same dimension.

2. The geometries must have some but not all points in common.

3. The intersection of the geometries must have the same dimension as the
geometries themselves.
package geos
import "C"
import (
	"unsafe"
	"github.com/peterstace/simplefeatures/geom"
)
func Equals(a, b geom.Geometry) (bool, error) {
	result, err := binaryOpB(a, b, func(h C.GEOSContextHandle_t, a, b *C.GEOSGeometry) C.char {
		return C.GEOSEquals_r(h, a, b)
	})
	return result, wrap(err, "executing GEOSEquals_r")
}
func Disjoint(a, b geom.Geometry) (bool, error) {
	result, err := binaryOpB(a, b, func(h C.GEOSContextHandle_t, a, b *C.GEOSGeometry) C.char {
		return C.GEOSDisjoint_r(h, a, b)
	})
	return result, wrap(err, "executing GEOSDisjoint_r")
}
func Touches(a, b geom.Geometry) (bool, error) {
	result, err := binaryOpB(a, b, func(h C.GEOSContextHandle_t, a, b *C.GEOSGeometry) C.char {
		return C.GEOSTouches_r(h, a, b)
	})
	return result, wrap(err, "executing GEOSTouches_r")
}
func Contains(a, b geom.Geometry) (bool, error) {
	result, err := binaryOpB(a, b, func(h C.GEOSContextHandle_t, a, b *C.GEOSGeometry) C.char {
		return C.GEOSContains_r(h, a, b)
	})
	return result, wrap(err, "executing GEOSContains_r")
}
func Covers(a, b geom.Geometry) (bool, error) {
	result, err := binaryOpB(a, b, func(h C.GEOSContextHandle_t, a, b *C.GEOSGeometry) C.char {
		return C.GEOSCovers_r(h, a, b)
	})
	return result, wrap(err, "executing GEOSCovers_r")
}
func Intersects(a, b geom.Geometry) (bool, error) {
	result, err := binaryOpB(a, b, func(h C.GEOSContextHandle_t, a, b *C.GEOSGeometry) C.char {
		return C.GEOSIntersects_r(h, a, b)
	})
	return result, wrap(err, "executing GEOSIntersects_r")
}
func Within(a, b geom.Geometry) (bool, error) {
	result, err := binaryOpB(a, b, func(h C.GEOSContextHandle_t, a, b *C.GEOSGeometry) C.char {
		return C.GEOSWithin_r(h, a, b)
	})
	return result, wrap(err, "executing GEOSWithin_r")
}
func CoveredBy(a, b geom.Geometry) (bool, error) {
	result, err := binaryOpB(a, b, func(h C.GEOSContextHandle_t, a, b *C.GEOSGeometry) C.char {
		return C.GEOSCoveredBy_r(h, a, b)
	})
	return result, wrap(err, "executing GEOSCoveredBy_r")
}
func Crosses(a, b geom.Geometry) (bool, error) {
	result, err := binaryOpB(a, b, func(h C.GEOSContextHandle_t, a, b *C.GEOSGeometry) C.char {
		return C.GEOSCrosses_r(h, a, b)
	})
	return result, wrap(err, "executing GEOSCrosses_r")
}
func Relate(g1, g2 geom.Geometry) (string, error) {
	var result string
	err := binaryOpE(g1, g2, func(h *handle, gh1, gh2 *C.GEOSGeometry) error {
		cstr := C.GEOSRelate_r(h.context, gh1, gh2)
		if cstr == nil {
			return wrap(h.err(), "executing GEOSRelate_r")
		}
		defer C.GEOSFree_r(h.context, unsafe.Pointer(cstr))
		result = C.GoString(cstr)
		return nil
	})
	return result, err
}