Skip to content

Commit

Permalink
Make gdal polygonize behave consistently
Browse files Browse the repository at this point in the history
across all GDAL versions (behavior changed in GDAL 3.7)
Closes #5366 for PostGIS 3.0.10
  • Loading branch information
robe2 committed Jun 22, 2023
1 parent 9c9e56a commit f7d9515
Showing 1 changed file with 51 additions and 128 deletions.
179 changes: 51 additions & 128 deletions raster/test/cunit/cu_gdal.c
Expand Up @@ -155,43 +155,29 @@ static void test_gdal_polygonize() {
int i;
rt_raster rt;
int nPols = 0;
double total_area = 0;
double total_val = 0;
rt_geomval gv = NULL;
LWGEOM *gexpected, *gobserved;
LWGEOM *gobserved;
//char *wkt = NULL;
gexpected = lwgeom_from_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))",
LW_PARSER_CHECK_NONE);

rt = fillRasterToPolygonize(1, -1.0);
CU_ASSERT(rt_raster_has_band(rt, 0));

nPols = 0;
gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);
CU_ASSERT_DOUBLE_EQUAL(nPols, 4, FLT_EPSILON);
total_area = 0; total_val = 0;
for (i = 0; i < nPols; i++) {
total_val += gv[i].val;
gobserved = (LWGEOM *) gv[i].geom;
total_area += lwgeom_area(gobserved);
lwgeom_free((LWGEOM *) gv[i].geom);
}
printf("total area, total val, nPols = %f, %f, %i\n", total_area, total_val, nPols);
CU_ASSERT_DOUBLE_EQUAL(total_val, 1.8 + 0.0 + 2.8 + 0, FLT_EPSILON);
CU_ASSERT_DOUBLE_EQUAL(total_area, 81, FLT_EPSILON);

CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);

gobserved = (LWGEOM *)gv[0].geom;

CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
gobserved = (LWGEOM *)gv[1].geom;
gexpected = lwgeom_from_wkt("POLYGON((3 3,3 6,6 6,6 3,3 3))", LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON );

CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON);
gobserved = (LWGEOM *)gv[2].geom;
gexpected = lwgeom_from_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))",
LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

gobserved = (LWGEOM *)gv[3].geom;
gexpected = lwgeom_from_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))",
LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
rtdealloc(gv);
cu_free_raster(rt);

Expand All @@ -203,40 +189,19 @@ static void test_gdal_polygonize() {

nPols = 0;
gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);

/*
CU_ASSERT_DOUBLE_EQUAL(nPols, 4, FLT_EPSILON);
total_area = 0; total_val = 0;
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);
total_val += gv[i].val;
gobserved = (LWGEOM *) gv[i].geom;
total_area += lwgeom_area(gobserved);
lwgeom_free((LWGEOM *) gv[i].geom);
}
*/
printf("total area, total_val, polys = %f, %f, %i\n", total_area, total_val, nPols);
CU_ASSERT_DOUBLE_EQUAL(total_val, 4.6, FLT_EPSILON);
CU_ASSERT_DOUBLE_EQUAL(total_area, 81, FLT_EPSILON);


CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
gobserved = (LWGEOM *)gv[1].geom;
gexpected = lwgeom_from_wkt("POLYGON((3 3,3 6,6 6,6 3,3 3))", LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), 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);
gobserved = (LWGEOM *)gv[2].geom;
gexpected = lwgeom_from_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))",
LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), 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);
gobserved = (LWGEOM *)gv[3].geom;
gexpected = lwgeom_from_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))",
LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
rtdealloc(gv);
cu_free_raster(rt);

Expand All @@ -248,33 +213,19 @@ static void test_gdal_polygonize() {

nPols = 0;
gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);

/*
CU_ASSERT_DOUBLE_EQUAL(nPols, 4, FLT_EPSILON);
total_area = 0; total_val = 0;
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);
total_val += gv[i].val;
gobserved = (LWGEOM *) gv[i].geom;
total_area += lwgeom_area(gobserved);
lwgeom_free((LWGEOM *) gv[i].geom);
}
*/

CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
gobserved = (LWGEOM *)gv[3].geom;
gexpected = lwgeom_from_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))",
LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

gobserved = (LWGEOM *)gv[0].geom;
gexpected = lwgeom_from_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))", LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
gobserved = (LWGEOM *)gv[1].geom;
gexpected = lwgeom_from_wkt("POLYGON((3 3,3 6,6 6,6 3,3 3))", LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);
printf("total area, total_val, polys = %f, %f, %i\n", total_area, total_val, nPols);
CU_ASSERT_DOUBLE_EQUAL(total_val, 4.6, FLT_EPSILON);
CU_ASSERT_DOUBLE_EQUAL(total_area, 81, FLT_EPSILON);

for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
rtdealloc(gv);
cu_free_raster(rt);

Expand All @@ -286,26 +237,19 @@ static void test_gdal_polygonize() {
nPols = 0;
gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);

/*
CU_ASSERT_DOUBLE_EQUAL(nPols, 2, FLT_EPSILON);
total_area = 0; total_val = 0;
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);
total_val += gv[i].val;
gobserved = (LWGEOM *) gv[i].geom;
total_area += lwgeom_area(gobserved);
lwgeom_free((LWGEOM *) gv[i].geom);
}
*/

CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);
gobserved = (LWGEOM *)gv[0].geom;
gexpected = lwgeom_from_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))", LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 2.8, FLT_EPSILON);
gobserved = (LWGEOM *)gv[1].geom;
gexpected = lwgeom_from_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))",
LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);
printf("total area, total_val, polys = %f, %f, %i\n", total_area, total_val, nPols);
CU_ASSERT_DOUBLE_EQUAL(total_val, 4.6, FLT_EPSILON);
CU_ASSERT_DOUBLE_EQUAL(total_area, 28, FLT_EPSILON);

for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
rtdealloc(gv);
cu_free_raster(rt);

Expand All @@ -317,39 +261,18 @@ static void test_gdal_polygonize() {
nPols = 0;
gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);

/*
CU_ASSERT_DOUBLE_EQUAL(nPols, 4, FLT_EPSILON);
total_area = 0; total_val = 0;
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);
total_val += gv[i].val;
gobserved = (LWGEOM *) gv[i].geom;
total_area += lwgeom_area(gobserved);
lwgeom_free((LWGEOM *) gv[i].geom);
}
*/

CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);
gobserved = (LWGEOM *)gv[0].geom;
gexpected = lwgeom_from_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))", LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
gobserved = (LWGEOM *)gv[1].geom;
gexpected = lwgeom_from_wkt("POLYGON((3 3,3 6,6 6,6 3,3 3))", LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON);
gobserved = (LWGEOM *)gv[2].geom;
gexpected = lwgeom_from_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))",
LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
gobserved = (LWGEOM *)gv[3].geom;
gexpected = lwgeom_from_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))",
LW_PARSER_CHECK_NONE);
CU_ASSERT_DOUBLE_EQUAL(lwgeom_area(gobserved), lwgeom_area(gexpected), FLT_EPSILON);

for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
printf("total area, total_val, polys = %f, %f, %i\n", total_area, total_val, nPols);
CU_ASSERT_DOUBLE_EQUAL(total_val, 1.8 + 0.0 + 2.8 + 0.0, FLT_EPSILON);
CU_ASSERT_DOUBLE_EQUAL(total_area, 81, FLT_EPSILON);
rtdealloc(gv);
cu_free_raster(rt);
}
Expand Down

0 comments on commit f7d9515

Please sign in to comment.