PostGIS  2.5.0dev-r@@SVN_REVISION@@

◆ test_gdal_polygonize()

static void test_gdal_polygonize ( )
static

Definition at line 162 of file cu_gdal.c.

References cu_free_raster(), fillRasterToPolygonize(), lwgeom_free(), lwgeom_to_text(), rtrowdump::rt, rt_raster_gdal_polygonize(), rt_raster_has_band(), rtdealloc(), and TRUE.

Referenced by gdal_suite_setup().

162  {
163  int i;
164  rt_raster rt;
165  int nPols = 0;
166  rt_geomval gv = NULL;
167  char *wkt = NULL;
168 
169  rt = fillRasterToPolygonize(1, -1.0);
170  CU_ASSERT(rt_raster_has_band(rt, 0));
171 
172  nPols = 0;
173  gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);
174 
175 #ifdef GDALFPOLYGONIZE
176  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);
177 #else
178  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 2.0, 1.);
179 #endif
180 
181  wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom);
182  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))");
183  rtdealloc(wkt);
184 
185  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
186  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
187  CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))");
188  rtdealloc(wkt);
189 
190 #ifdef GDALFPOLYGONIZE
191  CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON);
192 #else
193  CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 3.0, 1.);
194 #endif
195 
196  wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom);
197  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))");
198  rtdealloc(wkt);
199 
200  CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
201  wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom);
202  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))");
203  rtdealloc(wkt);
204 
205  for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
206  rtdealloc(gv);
207  cu_free_raster(rt);
208 
209  /* Second test: NODATA value = 1.8 */
210 #ifdef GDALFPOLYGONIZE
211  rt = fillRasterToPolygonize(1, 1.8);
212 #else
213  rt = fillRasterToPolygonize(1, 2.0);
214 #endif
215 
216  /* We can check rt_raster_has_band here too */
217  CU_ASSERT(rt_raster_has_band(rt, 0));
218 
219  nPols = 0;
220  gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);
221 
222  /*
223  for (i = 0; i < nPols; i++) {
224  wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom);
225  printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt);
226  rtdealloc(wkt);
227  }
228  */
229 
230 #ifdef GDALFPOLYGONIZE
231  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
232  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
233  CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))");
234  rtdealloc(wkt);
235 
236  CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON);
237  wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom);
238  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))");
239  rtdealloc(wkt);
240 
241  CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
242  wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom);
243  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))");
244  rtdealloc(wkt);
245 #else
246  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 0.0, 1.);
247  wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom);
248  CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))");
249  rtdealloc(wkt);
250 
251  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 3.0, 1.);
252  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
253  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))");
254  rtdealloc(wkt);
255 
256  CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 0.0, 1.);
257  wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom);
258  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))");
259  rtdealloc(wkt);
260 #endif
261 
262  for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
263  rtdealloc(gv);
264  cu_free_raster(rt);
265 
266  /* Third test: NODATA value = 2.8 */
267 #ifdef GDALFPOLYGONIZE
268  rt = fillRasterToPolygonize(1, 2.8);
269 #else
270  rt = fillRasterToPolygonize(1, 3.0);
271 #endif
272 
273  /* We can check rt_raster_has_band here too */
274  CU_ASSERT(rt_raster_has_band(rt, 0));
275 
276  nPols = 0;
277  gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);
278 
279  /*
280  for (i = 0; i < nPols; i++) {
281  wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom);
282  printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt);
283  rtdealloc(wkt);
284  }
285  */
286 
287 #ifdef GDALFPOLYGONIZE
288  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);
289 
290  CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
291  wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom);
292  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))");
293  rtdealloc(wkt);
294 #else
295  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 2.0, 1.);
296 
297  CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 0.0, 1.);
298  wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom);
299  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))");
300  rtdealloc(wkt);
301 #endif
302 
303  wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom);
304  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))");
305  rtdealloc(wkt);
306 
307  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
308  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
309  CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))");
310  rtdealloc(wkt);
311 
312  for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
313  rtdealloc(gv);
314  cu_free_raster(rt);
315 
316  /* Fourth test: NODATA value = 0 */
317  rt = fillRasterToPolygonize(1, 0.0);
318  /* We can check rt_raster_has_band here too */
319  CU_ASSERT(rt_raster_has_band(rt, 0));
320 
321  nPols = 0;
322  gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);
323 
324  /*
325  for (i = 0; i < nPols; i++) {
326  wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom);
327  printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt);
328  rtdealloc(wkt);
329  }
330  */
331 
332 #ifdef GDALFPOLYGONIZE
333  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);
334 #else
335  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 2.0, 1.);
336 #endif
337 
338  wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom);
339  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))");
340  rtdealloc(wkt);
341 
342 #ifdef GDALFPOLYGONIZE
343  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 2.8, FLT_EPSILON);
344 #else
345  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 3.0, 1.);
346 #endif
347 
348  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
349  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))");
350  rtdealloc(wkt);
351 
352  for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
353  rtdealloc(gv);
354  cu_free_raster(rt);
355 
356  /* Last test: There is no NODATA value (all values are valid) */
357  rt = fillRasterToPolygonize(0, 0.0);
358  /* We can check rt_raster_has_band here too */
359  CU_ASSERT(rt_raster_has_band(rt, 0));
360 
361  nPols = 0;
362  gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);
363 
364  /*
365  for (i = 0; i < nPols; i++) {
366  wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom);
367  printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt);
368  rtdealloc(wkt);
369  }
370  */
371 
372 #ifdef GDALFPOLYGONIZE
373  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);
374 #else
375  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 2.0, 1.);
376 #endif
377 
378  wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom);
379  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))");
380  rtdealloc(wkt);
381 
382  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
383  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
384  CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))");
385  rtdealloc(wkt);
386 
387 #ifdef GDALFPOLYGONIZE
388  CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON);
389 #else
390  CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 3.0, 1.);
391 #endif
392 
393  wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom);
394  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))");
395  rtdealloc(wkt);
396 
397  CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
398  wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom);
399  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))");
400  rtdealloc(wkt);
401 
402  for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
403  rtdealloc(gv);
404  cu_free_raster(rt);
405 }
rt_geomval rt_raster_gdal_polygonize(rt_raster raster, int nband, int exclude_nodata_value, int *pnElements)
Returns a set of "geomval" value, one for each group of pixel sharing the same value for the provided...
Definition: rt_geometry.c:940
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1144
void cu_free_raster(rt_raster raster)
static char * lwgeom_to_text(const LWGEOM *lwgeom)
Definition: cu_gdal.c:100
int rt_raster_has_band(rt_raster raster, int nband)
Return TRUE if the raster has a band of this number.
Definition: rt_raster.c:1351
static rt_raster fillRasterToPolygonize(int hasnodata, double nodataval)
Definition: cu_gdal.c:109
void rtdealloc(void *mem)
Definition: rt_context.c:186
#define TRUE
Definition: dbfopen.c:169
Here is the call graph for this function:
Here is the caller graph for this function: