25#include "CUnit/Basic.h"
38 CU_ASSERT(drv != NULL);
40 for (i = 0; i < size; i++) {
41 CU_ASSERT(strlen(drv[i].short_name));
52 char srs[] =
"PROJCS[\"unnamed\",GEOGCS[\"unnamed ellipse\",DATUM[\"unknown\",SPHEROID[\"unnamed\",6370997,0]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Lambert_Azimuthal_Equal_Area\"],PARAMETER[\"latitude_of_center\",45],PARAMETER[\"longitude_of_center\",-100],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1],AUTHORITY[\"EPSG\",\"2163\"]]";
53 const char wkb_hex[] =
"010300000001000000050000000000000080841ec100000000600122410000000080841ec100000000804f22410000000040e81dc100000000804f22410000000040e81dc100000000600122410000000080841ec10000000060012241";
54 const char *pos = wkb_hex;
55 unsigned char *wkb = NULL;
59 double scale_y = -100;
64 double nodata[] = {0};
65 uint8_t nodata_mask[] = {1};
68 wkb_len = (int) ceil(((
double) strlen(wkb_hex)) / 2);
69 wkb = (
unsigned char *)
rtalloc(
sizeof(
unsigned char) * wkb_len);
70 for (i = 0; i < wkb_len; i++) {
72 sscanf(pos,
"%2x", &b);
73 wkb[i] = (
unsigned char)b;
91 CU_ASSERT(raster != NULL);
113 band =
cu_add_band(raster, pixtype, hasnodata, nodataval);
114 CU_ASSERT(band != NULL);
159 double total_area = 0;
160 double total_val = 0;
170 CU_ASSERT_DOUBLE_EQUAL(nPols, 4, FLT_EPSILON);
171 total_area = 0; total_val = 0;
172 for (i = 0; i < nPols; i++) {
173 total_val += gv[i].
val;
174 gobserved = (
LWGEOM *) gv[i].geom;
178 printf(
"total area, total val, nPols = %f, %f, %i\n", total_area, total_val, nPols);
179 CU_ASSERT_DOUBLE_EQUAL(total_val, 1.8 + 0.0 + 2.8 + 0, FLT_EPSILON);
180 CU_ASSERT_DOUBLE_EQUAL(total_area, 81, FLT_EPSILON);
193 CU_ASSERT_DOUBLE_EQUAL(nPols, 4, FLT_EPSILON);
194 total_area = 0; total_val = 0;
195 for (i = 0; i < nPols; i++) {
196 total_val += gv[i].
val;
197 gobserved = (
LWGEOM *) gv[i].geom;
201 printf(
"total area, total_val, polys = %f, %f, %i\n", total_area, total_val, nPols);
202 CU_ASSERT_DOUBLE_EQUAL(total_val, 4.6, FLT_EPSILON);
203 CU_ASSERT_DOUBLE_EQUAL(total_area, 81, FLT_EPSILON);
217 CU_ASSERT_DOUBLE_EQUAL(nPols, 4, FLT_EPSILON);
218 total_area = 0; total_val = 0;
219 for (i = 0; i < nPols; i++) {
220 total_val += gv[i].
val;
221 gobserved = (
LWGEOM *) gv[i].geom;
226 printf(
"total area, total_val, polys = %f, %f, %i\n", total_area, total_val, nPols);
227 CU_ASSERT_DOUBLE_EQUAL(total_val, 4.6, FLT_EPSILON);
228 CU_ASSERT_DOUBLE_EQUAL(total_area, 81, FLT_EPSILON);
241 CU_ASSERT_DOUBLE_EQUAL(nPols, 2, FLT_EPSILON);
242 total_area = 0; total_val = 0;
243 for (i = 0; i < nPols; i++) {
244 total_val += gv[i].
val;
245 gobserved = (
LWGEOM *) gv[i].geom;
250 printf(
"total area, total_val, polys = %f, %f, %i\n", total_area, total_val, nPols);
251 CU_ASSERT_DOUBLE_EQUAL(total_val, 4.6, FLT_EPSILON);
252 CU_ASSERT_DOUBLE_EQUAL(total_area, 28, FLT_EPSILON);
265 CU_ASSERT_DOUBLE_EQUAL(nPols, 4, FLT_EPSILON);
266 total_area = 0; total_val = 0;
267 for (i = 0; i < nPols; i++) {
268 total_val += gv[i].
val;
269 gobserved = (
LWGEOM *) gv[i].geom;
274 printf(
"total area, total_val, polys = %f, %f, %i\n", total_area, total_val, nPols);
275 CU_ASSERT_DOUBLE_EQUAL(total_val, 1.8 + 0.0 + 2.8 + 0.0, FLT_EPSILON);
276 CU_ASSERT_DOUBLE_EQUAL(total_area, 81, FLT_EPSILON);
289 CU_ASSERT(rt != NULL);
296 CU_ASSERT_PTR_NULL(gv);
297 CU_ASSERT_EQUAL(nPols, 0);
309 uint32_t width = 100;
311 uint32_t height = 100;
312 char srs[] =
"PROJCS[\"unnamed\",GEOGCS[\"unnamed ellipse\",DATUM[\"unknown\",SPHEROID[\"unnamed\",6370997,0]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Lambert_Azimuthal_Equal_Area\"],PARAMETER[\"latitude_of_center\",45],PARAMETER[\"longitude_of_center\",-100],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1],AUTHORITY[\"EPSG\",\"2163\"]]";
315 uint8_t *gdal = NULL;
318 CU_ASSERT(raster != NULL);
321 CU_ASSERT(band != NULL);
326 for (x = 0; x < width; x++) {
327 for (y = 0; y < height; y++) {
328 rt_band_set_pixel(band, x, y, (((
double) x * y) + (x + y) + (x + y * x)) / (x + y + 1), NULL);
343 if (gdal) CPLFree(gdal);
348 CU_ASSERT(raster != NULL);
351 CU_ASSERT(band != NULL);
356 for (x = 0; x < width; x++) {
357 for (y = 0; y < height; y++) {
369 if (gdal) CPLFree(gdal);
372 CU_ASSERT(gdal == NULL);
383 const uint32_t width = 100;
384 const uint32_t height = 100;
388 double values[width][height];
392 GDALDriverH gddrv = NULL;
394 GDALDatasetH gdds = NULL;
397 CU_ASSERT(raster != NULL);
400 CU_ASSERT(band != NULL);
402 for (x = 0; x < width; x++) {
403 for (y = 0; y < height; y++) {
404 values[x][y] = (((double) x * y) + (x + y) + (x + y * x)) / (x + y + 1);
410 CU_ASSERT(gddrv != NULL);
411 CU_ASSERT(gdds != NULL);
412 CU_ASSERT_EQUAL((uint32_t)GDALGetRasterXSize(gdds), width);
413 CU_ASSERT_EQUAL((uint32_t)GDALGetRasterYSize(gdds), height);
416 CU_ASSERT(rast != NULL);
420 CU_ASSERT(band != NULL);
422 for (x = 0; x < width; x++) {
423 for (y = 0; y < height; y++) {
426 CU_ASSERT_DOUBLE_EQUAL(value, values[x][y], DBL_EPSILON);
430 if (destroy && gddrv) {
431 GDALDeregisterDriver(gddrv);
432 GDALDestroyDriver(gddrv);
442 CU_ASSERT(raster != NULL);
446 CU_ASSERT(band != NULL);
449 for (x = 0; x < width; x++) {
450 for (y = 0; y < height; y++) {
459 CU_ASSERT(gddrv != NULL);
460 CU_ASSERT(gdds != NULL);
461 CU_ASSERT_EQUAL((uint32_t)GDALGetRasterXSize(gdds), width);
462 CU_ASSERT_EQUAL((uint32_t)GDALGetRasterYSize(gdds), height);
465 CU_ASSERT(rast != NULL);
469 CU_ASSERT(band != NULL);
470#if POSTGIS_GDAL_VERSION < 30700
475 for (x = 0; x < width; x++) {
476 for (y = 0; y < height; y++) {
478#if POSTGIS_GDAL_VERSION < 30700
479 CU_ASSERT_DOUBLE_EQUAL(value, values[x][y], 1.);
480 CU_ASSERT_DOUBLE_EQUAL(value, values[x][y], DBL_EPSILON);
483 CU_ASSERT_DOUBLE_EQUAL(value, values[x][y], DBL_EPSILON);
487 if (destroy && gddrv) {
488 GDALDeregisterDriver(gddrv);
489 GDALDestroyDriver(gddrv);
507 uint32_t width = 100;
509 uint32_t height = 100;
512 char src_srs[] =
"PROJCS[\"unnamed\",GEOGCS[\"unnamed ellipse\",DATUM[\"unknown\",SPHEROID[\"unnamed\",6370997,0]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Lambert_Azimuthal_Equal_Area\"],PARAMETER[\"latitude_of_center\",45],PARAMETER[\"longitude_of_center\",-100],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1],AUTHORITY[\"EPSG\",\"2163\"]]";
514 char dst_srs[] =
"PROJCS[\"NAD83 / California Albers\",GEOGCS[\"NAD83\",DATUM[\"North_American_Datum_1983\",SPHEROID[\"GRS 1980\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"7019\"]],AUTHORITY[\"EPSG\",\"6269\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4269\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],PROJECTION[\"Albers_Conic_Equal_Area\"],PARAMETER[\"standard_parallel_1\",34],PARAMETER[\"standard_parallel_2\",40.5],PARAMETER[\"latitude_of_center\",0],PARAMETER[\"longitude_of_center\",-120],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",-4000000],AUTHORITY[\"EPSG\",\"3310\"],AXIS[\"X\",EAST],AXIS[\"Y\",NORTH]]";
517 CU_ASSERT(raster != NULL);
520 CU_ASSERT(band != NULL);
525 for (x = 0; x < width; x++) {
526 for (y = 0; y < height; y++) {
527 rt_band_set_pixel(band, x, y, (((
double) x * y) + (x + y) + (x + y * x)) / (x + y + 1), NULL);
539 GRA_NearestNeighbour, -1
541 CU_ASSERT(rast != NULL);
547 CU_ASSERT(band != NULL);
551 CU_ASSERT_DOUBLE_EQUAL(value, 0., DBL_EPSILON);
554 CU_ASSERT_DOUBLE_EQUAL(value, 0., DBL_EPSILON);
561 const char *filename = POSTGIS_TOP_SRC_DIR
"/raster/test/regress/loader/Projected.tif";
563 GDALDatasetH hDS_in = NULL;
566 int band_count_in, band_count_out, i;
574 double max_err = 0.125;
575 GDALResampleAlg alg = GRA_NearestNeighbour;
577 const char *src_srs =
"EPSG:4326";
578 const char *dst_srs =
"EPSG:3857";
582 hDS_in = GDALOpen(filename, GA_ReadOnly);
583 CU_ASSERT(hDS_in != NULL);
587 CU_ASSERT(rast_in != NULL);
598 CU_ASSERT(rast_out != NULL);
602 CU_ASSERT_EQUAL(band_count_in, band_count_out);
604 for (i = 0; i < band_count_in; i++) {
605 double tolerance = 0.1;
610 CU_ASSERT(band_in != NULL);
611 CU_ASSERT(band_out != NULL);
616 CU_ASSERT_DOUBLE_EQUAL(stats_in->
min, stats_out->
min, fabs(stats_in->
min) * tolerance);
617 CU_ASSERT_DOUBLE_EQUAL(stats_in->
max, stats_out->
max, fabs(stats_in->
max) * tolerance);
618 CU_ASSERT_DOUBLE_EQUAL(stats_in->
mean, stats_out->
mean, fabs(stats_in->
mean) * tolerance);
630 CU_pSuite suite = CU_add_suite(
"gdal", NULL, NULL);
static rt_raster fillRasterToPolygonize(int hasnodata, double nodataval)
static void test_gdal_warp_preserves_data(void)
static void test_gdal_warp()
static void test_gdal_rasterize()
static void test_gdal_to_raster()
static void test_raster_to_gdal()
void gdal_suite_setup(void)
static void test_gdal_drivers()
static void test_gdal_configured()
static void test_gdal_polygonize()
static void test_gdal_polygonize_interrupt(void)
#define PG_ADD_TEST(suite, testfunc)
void lwgeom_request_interrupt(void)
Request interruption of any running code.
void lwgeom_cancel_interrupt(void)
Cancel any interruption request.
void lwgeom_free(LWGEOM *geom)
double lwgeom_area(const LWGEOM *geom)
void * rtalloc(size_t size)
Wrappers used for managing memory.
uint16_t rt_band_get_width(rt_band band)
Return width of this band.
double rt_raster_get_x_offset(rt_raster raster)
Get raster x offset, in projection units.
int rt_util_gdal_configured(void)
rt_gdaldriver rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t cancc)
Returns a set of available GDAL drivers.
void rt_raster_set_scale(rt_raster raster, double scaleX, double scaleY)
Set scale in projection units.
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
uint8_t * rt_raster_to_gdal(rt_raster raster, const char *srs, char *format, char **options, uint64_t *gdalsize)
Return formatted GDAL raster from raster.
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
rt_raster rt_raster_new(uint32_t width, uint32_t height)
Construct a raster with given dimensions.
int rt_raster_has_band(rt_raster raster, int nband)
Return TRUE if the raster has a band of this number.
rt_raster rt_raster_from_gdal_dataset(GDALDatasetH ds)
Return a raster from a GDAL dataset.
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...
int rt_band_check_is_nodata(rt_band band)
Returns TRUE if the band is only nodata values.
rt_errorstate rt_band_set_pixel(rt_band band, int x, int y, double val, int *converted)
Set single pixel's value.
rt_raster rt_raster_gdal_rasterize(const unsigned char *wkb, uint32_t wkb_len, const char *srs, uint32_t num_bands, rt_pixtype *pixtype, double *init, double *value, double *nodata, uint8_t *hasnodata, int *width, int *height, double *scale_x, double *scale_y, double *ul_xw, double *ul_yw, double *grid_xw, double *grid_yw, double *skew_x, double *skew_y, char **options)
Return a raster of the provided geometry.
uint16_t rt_raster_get_num_bands(rt_raster raster)
struct rt_gdaldriver_t * rt_gdaldriver
uint16_t rt_raster_get_height(rt_raster raster)
rt_errorstate rt_band_get_nodata(rt_band band, double *nodata)
Get NODATA value.
rt_pixtype rt_band_get_pixtype(rt_band band)
Return pixeltype of this band.
uint16_t rt_raster_get_width(rt_raster raster)
void rtdealloc(void *mem)
rt_raster rt_raster_gdal_warp(rt_raster raster, const char *src_srs, const char *dst_srs, double *scale_x, double *scale_y, int *width, int *height, double *ul_xw, double *ul_yw, double *grid_xw, double *grid_yw, double *skew_x, double *skew_y, GDALResampleAlg resample_alg, double max_err)
Return a warped raster using GDAL Warp API.
GDALDatasetH rt_raster_to_gdal_mem(rt_raster raster, const char *srs, uint32_t *bandNums, int *excludeNodataValues, int count, GDALDriverH *rtn_drv, int *destroy_rtn_drv)
Return GDAL dataset using GDAL MEM driver from raster.
void rt_raster_set_offsets(rt_raster raster, double x, double y)
Set insertion points in projection units.
rt_bandstats rt_band_get_summary_stats(rt_band band, int exclude_nodata_value, double sample, int inc_vals, uint64_t *cK, double *cM, double *cQ)
Compute summary statistics for a band.
uint16_t rt_band_get_height(rt_band band)
Return height of this band.
double rt_raster_get_y_offset(rt_raster raster)
Get raster y offset, in projection units.
rt_band rt_raster_get_band(rt_raster raster, int bandNum)
Return Nth band, or NULL if unavailable.
rt_band cu_add_band(rt_raster raster, rt_pixtype pixtype, int hasnodata, double nodataval)
void cu_free_raster(rt_raster raster)