PostGIS  2.4.9dev-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  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);
176 
177  wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom);
178  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))");
179  rtdealloc(wkt);
180 
181  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
182  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
183  CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))");
184  rtdealloc(wkt);
185 
186  CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON);
187 
188  wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom);
189  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))");
190  rtdealloc(wkt);
191 
192  CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
193  wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom);
194  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))");
195  rtdealloc(wkt);
196 
197  for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
198  rtdealloc(gv);
199  cu_free_raster(rt);
200 
201  /* Second test: NODATA value = 1.8 */
202  rt = fillRasterToPolygonize(1, 1.8);
203 
204  /* We can check rt_raster_has_band here too */
205  CU_ASSERT(rt_raster_has_band(rt, 0));
206 
207  nPols = 0;
208  gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);
209 
210  /*
211  for (i = 0; i < nPols; i++) {
212  wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom);
213  printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt);
214  rtdealloc(wkt);
215  }
216  */
217 
218  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
219  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
220  CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))");
221  rtdealloc(wkt);
222 
223  CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON);
224  wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom);
225  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))");
226  rtdealloc(wkt);
227 
228  CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
229  wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom);
230  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))");
231  rtdealloc(wkt);
232 
233  for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
234  rtdealloc(gv);
235  cu_free_raster(rt);
236 
237  /* Third test: NODATA value = 2.8 */
238  rt = fillRasterToPolygonize(1, 2.8);
239 
240  /* We can check rt_raster_has_band here too */
241  CU_ASSERT(rt_raster_has_band(rt, 0));
242 
243  nPols = 0;
244  gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);
245 
246  /*
247  for (i = 0; i < nPols; i++) {
248  wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom);
249  printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt);
250  rtdealloc(wkt);
251  }
252  */
253 
254  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);
255 
256  CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
257  wkt = lwgeom_to_text((const LWGEOM *) gv[3].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 
261  wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom);
262  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))");
263  rtdealloc(wkt);
264 
265  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
266  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
267  CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))");
268  rtdealloc(wkt);
269 
270  for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
271  rtdealloc(gv);
272  cu_free_raster(rt);
273 
274  /* Fourth test: NODATA value = 0 */
275  rt = fillRasterToPolygonize(1, 0.0);
276  /* We can check rt_raster_has_band here too */
277  CU_ASSERT(rt_raster_has_band(rt, 0));
278 
279  nPols = 0;
280  gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);
281 
282  /*
283  for (i = 0; i < nPols; i++) {
284  wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom);
285  printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt);
286  rtdealloc(wkt);
287  }
288  */
289 
290  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);
291 
292  wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom);
293  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))");
294  rtdealloc(wkt);
295 
296  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 2.8, FLT_EPSILON);
297 
298  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
299  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))");
300  rtdealloc(wkt);
301 
302  for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
303  rtdealloc(gv);
304  cu_free_raster(rt);
305 
306  /* Last test: There is no NODATA value (all values are valid) */
307  rt = fillRasterToPolygonize(0, 0.0);
308  /* We can check rt_raster_has_band here too */
309  CU_ASSERT(rt_raster_has_band(rt, 0));
310 
311  nPols = 0;
312  gv = rt_raster_gdal_polygonize(rt, 0, TRUE, &nPols);
313 
314  /*
315  for (i = 0; i < nPols; i++) {
316  wkt = lwgeom_to_text((const LWGEOM *) gv[i].geom);
317  printf("(i, val, geom) = (%d, %f, %s)\n", i, gv[i].val, wkt);
318  rtdealloc(wkt);
319  }
320  */
321 
322  CU_ASSERT_DOUBLE_EQUAL(gv[0].val, 1.8, FLT_EPSILON);
323 
324  wkt = lwgeom_to_text((const LWGEOM *) gv[0].geom);
325  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))");
326  rtdealloc(wkt);
327 
328  CU_ASSERT_DOUBLE_EQUAL(gv[1].val, 0.0, FLT_EPSILON);
329  wkt = lwgeom_to_text((const LWGEOM *) gv[1].geom);
330  CU_ASSERT_STRING_EQUAL(wkt, "POLYGON((3 3,3 6,6 6,6 3,3 3))");
331  rtdealloc(wkt);
332 
333  CU_ASSERT_DOUBLE_EQUAL(gv[2].val, 2.8, FLT_EPSILON);
334 
335  wkt = lwgeom_to_text((const LWGEOM *) gv[2].geom);
336  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))");
337  rtdealloc(wkt);
338 
339  CU_ASSERT_DOUBLE_EQUAL(gv[3].val, 0.0, FLT_EPSILON);
340  wkt = lwgeom_to_text((const LWGEOM *) gv[3].geom);
341  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))");
342  rtdealloc(wkt);
343 
344  for (i = 0; i < nPols; i++) lwgeom_free((LWGEOM *) gv[i].geom);
345  rtdealloc(gv);
346  cu_free_raster(rt);
347 }
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:1099
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: