static void test_ptarray_insert_point(void) { LWLINE *line; char *wkt; POINT4D p; line = lwgeom_as_lwline(lwgeom_from_text("LINESTRING EMPTY")); p.x = 1; p.y = 1; ptarray_insert_point(line->points, &p, 0); wkt = lwgeom_to_text(lwline_as_lwgeom(line)); CU_ASSERT_STRING_EQUAL(wkt,"LINESTRING(1 1)"); lwfree(wkt); p.x = 2; p.y = 20; ptarray_insert_point(line->points, &p, 0); wkt = lwgeom_to_text(lwline_as_lwgeom(line)); CU_ASSERT_STRING_EQUAL(wkt,"LINESTRING(2 20,1 1)"); lwfree(wkt); p.x = 3; p.y = 30; ptarray_insert_point(line->points, &p, 1); wkt = lwgeom_to_text(lwline_as_lwgeom(line)); CU_ASSERT_STRING_EQUAL(wkt,"LINESTRING(2 20,3 30,1 1)"); lwfree(wkt); p.x = 4; p.y = 40; ptarray_insert_point(line->points, &p, 0); wkt = lwgeom_to_text(lwline_as_lwgeom(line)); CU_ASSERT_STRING_EQUAL(wkt,"LINESTRING(4 40,2 20,3 30,1 1)"); lwfree(wkt); p.x = 5; p.y = 50; ptarray_insert_point(line->points, &p, 4); wkt = lwgeom_to_text(lwline_as_lwgeom(line)); CU_ASSERT_STRING_EQUAL(wkt,"LINESTRING(4 40,2 20,3 30,1 1,5 50)"); lwfree(wkt); lwline_free(line); }
static void test_ptarray_append_point(void) { LWLINE *line; char *wkt; POINT4D p; line = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,1 1)")); p.x = 1; p.y = 1; ptarray_append_point(line->points, &p, LW_TRUE); wkt = lwgeom_to_text(lwline_as_lwgeom(line)); CU_ASSERT_STRING_EQUAL(wkt,"LINESTRING(0 0,1 1,1 1)"); lwfree(wkt); ptarray_append_point(line->points, &p, LW_FALSE); wkt = lwgeom_to_text(lwline_as_lwgeom(line)); CU_ASSERT_STRING_EQUAL(wkt,"LINESTRING(0 0,1 1,1 1)"); lwfree(wkt); lwline_free(line); }
static void test_ptarray_append_ptarray(void) { LWLINE *line1, *line2; int ret; char *wkt; /* Empty first line */ line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING EMPTY")); line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,0 10,5 5)")); ret = ptarray_append_ptarray(line1->points, line2->points, -1); CU_ASSERT(ret == LW_SUCCESS); wkt = lwgeom_to_text(lwline_as_lwgeom(line1)); CU_ASSERT_STRING_EQUAL(wkt, "LINESTRING(0 0,0 10,5 5)"); lwfree(wkt); lwline_free(line2); lwline_free(line1); /* Empty second line */ line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0, 5 5, 6 3)")); line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING EMPTY")); ret = ptarray_append_ptarray(line1->points, line2->points, -1); CU_ASSERT(ret == LW_SUCCESS); wkt = lwgeom_to_text(lwline_as_lwgeom(line1)); CU_ASSERT_STRING_EQUAL(wkt, "LINESTRING(0 0,5 5,6 3)"); lwfree(wkt); lwline_free(line2); lwline_free(line1); /* Both lines empty */ line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING EMPTY")); line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING EMPTY")); ret = ptarray_append_ptarray(line1->points, line2->points, -1); CU_ASSERT(ret == LW_SUCCESS); wkt = lwgeom_to_text(lwline_as_lwgeom(line1)); CU_ASSERT_STRING_EQUAL(wkt, "LINESTRING EMPTY"); lwfree(wkt); lwline_free(line2); lwline_free(line1); /* Sane sewing */ line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 4, 0 0,5 7)")); line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(5 7,12 43, 42 15)")); ret = ptarray_append_ptarray(line1->points, line2->points, 0); CU_ASSERT(ret == LW_SUCCESS); wkt = lwgeom_to_text(lwline_as_lwgeom(line1)); CU_ASSERT_STRING_EQUAL(wkt, "LINESTRING(10 4,0 0,5 7,12 43,42 15)"); lwfree(wkt); lwline_free(line2); lwline_free(line1); /* Untolerated sewing */ line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 4, 0 0,5 7)")); line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(5.5 7,12 43, 42 15)")); ret = ptarray_append_ptarray(line1->points, line2->points, 0); CU_ASSERT(ret == LW_FAILURE); lwline_free(line2); lwline_free(line1); /* Tolerated sewing */ line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 4, 0 0,5 7)")); line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(5.5 7,12 43, 42 15)")); ret = ptarray_append_ptarray(line1->points, line2->points, .7); CU_ASSERT(ret == LW_SUCCESS); wkt = lwgeom_to_text(lwline_as_lwgeom(line1)); CU_ASSERT_STRING_EQUAL(wkt, "LINESTRING(10 4,0 0,5 7,5.5 7,12 43,42 15)"); lwfree(wkt); lwline_free(line2); lwline_free(line1); /* Check user input trust (creates non-simple line */ line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,0 10)")); line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 0,0 10)")); ret = ptarray_append_ptarray(line1->points, line2->points, -1); CU_ASSERT(ret == LW_SUCCESS); wkt = lwgeom_to_text(lwline_as_lwgeom(line1)); CU_ASSERT_STRING_EQUAL(wkt, "LINESTRING(0 0,0 10,0 0,0 10)"); lwfree(wkt); lwline_free(line2); lwline_free(line1); /* Mixed dimensionality is not allowed */ line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 10 0, 10 0 0)")); line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 0,11 0)")); ret = ptarray_append_ptarray(line1->points, line2->points, -1); CU_ASSERT(ret == LW_FAILURE); lwline_free(line2); lwline_free(line1); /* Appending a read-only pointarray is allowed */ line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 10, 10 0)")); line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 0,11 0)")); FLAGS_SET_READONLY(line2->points->flags, 1); ret = ptarray_append_ptarray(line1->points, line2->points, -1); CU_ASSERT(ret == LW_SUCCESS); wkt = lwgeom_to_text(lwline_as_lwgeom(line1)); CU_ASSERT_STRING_EQUAL(wkt, "LINESTRING(0 10,10 0,11 0)"); lwfree(wkt); FLAGS_SET_READONLY(line2->points->flags, 0); /* for lwline_free */ lwline_free(line2); lwline_free(line1); /* Appending to a read-only pointarray is forbidden */ line1 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(0 10, 10 0)")); line2 = lwgeom_as_lwline(lwgeom_from_text("LINESTRING(10 0,11 0)")); FLAGS_SET_READONLY(line1->points->flags, 1); ret = ptarray_append_ptarray(line1->points, line2->points, -1); CU_ASSERT(ret == LW_FAILURE); lwline_free(line2); FLAGS_SET_READONLY(line1->points->flags, 0); /* for lwline_free */ lwline_free(line1); }
static void test_gdal_polygonize() { int i; rt_raster rt; int nPols = 0; rt_geomval gv = NULL; char *wkt = NULL; rt = fillRasterToPolygonize(1, -1.0); CU_ASSERT(rt_raster_has_band(rt, 0)); nPols = 0; gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols); #ifdef GDALFPOLYGONIZE CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON); #else CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 2.0, 1.); #endif wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 1,3 2,2 2,2 3,1 3,1 6,2 6,2 7,3 7,3 8,5 8,5 6,3 6,3 3,4 3,5 3,5 1,3 1))"); rtdealloc(wkt); CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON); wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))"); rtdealloc(wkt); #ifdef GDALFPOLYGONIZE CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON); #else CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 3.0, 1.); #endif wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((5 1,5 3,6 3,6 6,5 6,5 8,6 8,6 7,7 7,7 6,8 6,8 3,7 3,7 2,6 2,6 1,5 1))"); rtdealloc(wkt); CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON); wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((0 0,0 9,9 9,9 0,0 0),(6 7,6 8,3 8,3 7,2 7,2 6,1 6,1 3,2 3,2 2,3 2,3 1,6 1,6 2,7 2,7 3,8 3,8 6,7 6,7 7,6 7))"); rtdealloc(wkt); for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom); rtdealloc(gv); cu_free_raster(rt); /* Second test: NODATA value = 1.8 */ #ifdef GDALFPOLYGONIZE rt = fillRasterToPolygonize(1, 1.8); #else rt = fillRasterToPolygonize(1, 2.0); #endif /* We can check rt_raster_has_band here too */ CU_ASSERT(rt_raster_has_band(rt, 0)); nPols = 0; gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols); /* for (i = 0; i < nPols; i++) { wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom); printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt); rtdealloc(wkt); } */ #ifdef GDALFPOLYGONIZE CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON); wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))"); rtdealloc(wkt); CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON); wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((5 1,5 3,6 3,6 6,5 6,5 8,6 8,6 7,7 7,7 6,8 6,8 3,7 3,7 2,6 2,6 1,5 1))"); rtdealloc(wkt); CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON); wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((0 0,0 9,9 9,9 0,0 0),(6 7,6 8,3 8,3 7,2 7,2 6,1 6,1 3,2 3,2 2,3 2,3 1,6 1,6 2,7 2,7 3,8 3,8 6,7 6,7 7,6 7))"); rtdealloc(wkt); #else CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 0.0, 1.); wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))"); rtdealloc(wkt); CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 3.0, 1.); wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((5 1,5 3,6 3,6 6,5 6,5 8,6 8,6 7,7 7,7 6,8 6,8 3,7 3,7 2,6 2,6 1,5 1))"); rtdealloc(wkt); CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 0.0, 1.); wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((0 0,0 9,9 9,9 0,0 0),(6 7,6 8,3 8,3 7,2 7,2 6,1 6,1 3,2 3,2 2,3 2,3 1,6 1,6 2,7 2,7 3,8 3,8 6,7 6,7 7,6 7))"); rtdealloc(wkt); #endif for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom); rtdealloc(gv); cu_free_raster(rt); /* Third test: NODATA value = 2.8 */ #ifdef GDALFPOLYGONIZE rt = fillRasterToPolygonize(1, 2.8); #else rt = fillRasterToPolygonize(1, 3.0); #endif /* We can check rt_raster_has_band here too */ CU_ASSERT(rt_raster_has_band(rt, 0)); nPols = 0; gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols); /* for (i = 0; i < nPols; i++) { wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom); printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt); rtdealloc(wkt); } */ #ifdef GDALFPOLYGONIZE CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON); CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON); wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((0 0,0 9,9 9,9 0,0 0),(6 7,6 8,3 8,3 7,2 7,2 6,1 6,1 3,2 3,2 2,3 2,3 1,6 1,6 2,7 2,7 3,8 3,8 6,7 6,7 7,6 7))"); rtdealloc(wkt); #else CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 2.0, 1.); CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 0.0, 1.); wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((0 0,0 9,9 9,9 0,0 0),(6 7,6 8,3 8,3 7,2 7,2 6,1 6,1 3,2 3,2 2,3 2,3 1,6 1,6 2,7 2,7 3,8 3,8 6,7 6,7 7,6 7))"); rtdealloc(wkt); #endif wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 1,3 2,2 2,2 3,1 3,1 6,2 6,2 7,3 7,3 8,5 8,5 6,3 6,3 3,4 3,5 3,5 1,3 1))"); rtdealloc(wkt); CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON); wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))"); rtdealloc(wkt); for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom); rtdealloc(gv); cu_free_raster(rt); /* Fourth test: NODATA value = 0 */ rt = fillRasterToPolygonize(1, 0.0); /* We can check rt_raster_has_band here too */ CU_ASSERT(rt_raster_has_band(rt, 0)); nPols = 0; gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols); /* for (i = 0; i < nPols; i++) { wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom); printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt); rtdealloc(wkt); } */ #ifdef GDALFPOLYGONIZE CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON); #else CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 2.0, 1.); #endif wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 1,3 2,2 2,2 3,1 3,1 6,2 6,2 7,3 7,3 8,5 8,5 6,3 6,3 3,4 3,5 3,5 1,3 1))"); rtdealloc(wkt); #ifdef GDALFPOLYGONIZE CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 2.8, FLT_EPSILON); #else CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 3.0, 1.); #endif wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((5 1,5 3,6 3,6 6,5 6,5 8,6 8,6 7,7 7,7 6,8 6,8 3,7 3,7 2,6 2,6 1,5 1))"); rtdealloc(wkt); for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom); rtdealloc(gv); cu_free_raster(rt); /* Last test: There is no NODATA value (all values are valid) */ rt = fillRasterToPolygonize(0, 0.0); /* We can check rt_raster_has_band here too */ CU_ASSERT(rt_raster_has_band(rt, 0)); nPols = 0; gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols); /* for (i = 0; i < nPols; i++) { wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom); printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt); rtdealloc(wkt); } */ #ifdef GDALFPOLYGONIZE CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON); #else CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 2.0, 1.); #endif wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 1,3 2,2 2,2 3,1 3,1 6,2 6,2 7,3 7,3 8,5 8,5 6,3 6,3 3,4 3,5 3,5 1,3 1))"); rtdealloc(wkt); CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON); wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))"); rtdealloc(wkt); #ifdef GDALFPOLYGONIZE CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON); #else CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 3.0, 1.); #endif wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((5 1,5 3,6 3,6 6,5 6,5 8,6 8,6 7,7 7,7 6,8 6,8 3,7 3,7 2,6 2,6 1,5 1))"); rtdealloc(wkt); CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON); wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom); CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((0 0,0 9,9 9,9 0,0 0),(6 7,6 8,3 8,3 7,2 7,2 6,1 6,1 3,2 3,2 2,3 2,3 1,6 1,6 2,7 2,7 3,8 3,8 6,7 6,7 7,6 7))"); rtdealloc(wkt); for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom); rtdealloc(gv); cu_free_raster(rt); }