/* ** Does shape1 equal shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSEquals(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; if(!shape1 || !shape2) return -1; if(!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom) msGEOSShape2Geometry(shape1); g1 = (GEOSGeom) shape1->geometry; if(!g1) return -1; if(!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom) msGEOSShape2Geometry(shape2); g2 = (GEOSGeom) shape2->geometry; if(!g2) return -1; result = GEOSEquals(g1, g2); return ((result==2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSEquals()"); return -1; #endif }
/* Find holes of each face */ static void findFaceHoles(Face** faces, int nfaces) { int i, j, h; /* We sort by envelope area so that we know holes are only * after their shells */ qsort(faces, nfaces, sizeof(Face*), compare_by_envarea); for (i=0; i<nfaces; ++i) { Face* f = faces[i]; int nholes = GEOSGetNumInteriorRings(f->geom); LWDEBUGF(2, "Scanning face %d with env area %g and %d holes", i, f->envarea, nholes); for (h=0; h<nholes; ++h) { const GEOSGeometry *hole = GEOSGetInteriorRingN(f->geom, h); LWDEBUGF(2, "Looking for hole %d/%d of face %d among %d other faces", h+1, nholes, i, nfaces-i-1); for (j=i+1; j<nfaces; ++j) { Face* f2 = faces[j]; if ( f2->parent ) continue; /* hole already assigned */ const GEOSGeometry *f2er = GEOSGetExteriorRing(f2->geom); /* TODO: can be optimized as the ring would have the * same vertices, possibly in different order. * maybe comparing number of points could already be * useful. */ if ( GEOSEquals(f2er, hole) ) { LWDEBUGF(2, "Hole %d/%d of face %d is face %d", h+1, nholes, i, j); f2->parent = f; break; } } } } }
bool operator ==(const GEOSGeomWrapper & a, const GEOSGeomWrapper & b) { if ( a.get() == 0 or b.get() == 0 ) return a.get() and b.get(); return GEOSEquals(a.get(), b.get()); }
void isEqual(GEOSGeom g, const char *exp_wkt) { geom3_ = GEOSGeomFromWKT(exp_wkt); bool eq = GEOSEquals(geom3_, g); if ( ! eq ) { std::printf("EXP: %s\n", exp_wkt); char *obt_wkt = GEOSWKTWriter_write(w_, g); std::printf("OBT: %s\n", obt_wkt); free(obt_wkt); } ensure(eq); }