static void test_lwgeom_node(void) { #if POSTGIS_GEOS_VERSION >= 33 LWGEOM *in, *out; const char *wkt; char *tmp; /* Because i don't trust that much prior tests... ;) */ cu_error_msg_reset(); wkt = "LINESTRING(0 0,5 5, 10 0)"; in = lwgeom_from_wkt(wkt, LW_PARSER_CHECK_NONE); out = lwgeom_node(in); /* printf("%s\n", lwgeom_to_ewkt(out)); */ CU_ASSERT(lwgeom_same(in, out)); lwgeom_free(out); lwgeom_free(in); wkt = "MULTILINESTRING((0 0,0 5),(10 0, -10 5))"; in = lwgeom_from_wkt(wkt, LW_PARSER_CHECK_NONE); out = lwgeom_node(in); tmp = lwgeom_to_ewkt(out); CU_ASSERT_STRING_EQUAL("MULTILINESTRING((0 2.5,-10 5),(0 0,0 2.5),(0 2.5,0 5),(10 0,0 2.5))", tmp) lwfree(tmp); lwgeom_free(out); lwgeom_free(in); wkt = "MULTILINESTRING((0 0,5 5,10 0, 11 0, 20 0),(10 0, 12 0, 22 0))"; in = lwgeom_from_wkt(wkt, LW_PARSER_CHECK_NONE); out = lwgeom_node(in); tmp = lwgeom_to_ewkt(out); printf("%s\n", tmp); CU_ASSERT_STRING_EQUAL("MULTILINESTRING((0 0,5 5,10 0),(10 0,11 0,12 0,20 0),(20 0,22 0))", tmp); lwfree(tmp); lwgeom_free(out); lwgeom_free(in); wkt = "MULTILINESTRING((0 0,5 5,10 0, 11 0, 20 0),(22 0, 12 0, 10 0),(0 5, 5 0))"; in = lwgeom_from_wkt(wkt, LW_PARSER_CHECK_NONE); out = lwgeom_node(in); tmp = lwgeom_to_ewkt(out); printf("%s\n", tmp); CU_ASSERT_STRING_EQUAL( "MULTILINESTRING((0 0,2.5 2.5),(0 5,2.5 2.5),(22 0,20 0),(20 0,12 0,11 0,10 0),(10 0,5 5,2.5 2.5),(2.5 2.5,5 0))", tmp); lwfree(tmp); lwgeom_free(out); lwgeom_free(in); #endif /* POSTGIS_GEOS_VERSION >= 33 */ }
/** @brief check for same geometry composition * */ char lwcollection_same(const LWCOLLECTION *c1, const LWCOLLECTION *c2) { uint32_t i; LWDEBUG(2, "lwcollection_same called"); if ( c1->type != c2->type ) return LW_FALSE; if ( c1->ngeoms != c2->ngeoms ) return LW_FALSE; for ( i = 0; i < c1->ngeoms; i++ ) { if ( ! lwgeom_same(c1->geoms[i], c2->geoms[i]) ) return LW_FALSE; } /* Former method allowed out-of-order equality between collections hit = lwalloc(sizeof(uint32_t)*c1->ngeoms); memset(hit, 0, sizeof(uint32_t)*c1->ngeoms); for (i=0; i<c1->ngeoms; i++) { char found=0; for (j=0; j<c2->ngeoms; j++) { if ( hit[j] ) continue; if ( lwgeom_same(c1->geoms[i], c2->geoms[j]) ) { hit[j] = 1; found=1; break; } } if ( ! found ) return LW_FALSE; } */ return LW_TRUE; }