return rast;
}
-/**
- * Return a transformed raster using GDALAutoCreateWarpedVRT()
- *
- * @param raster : raster to transform
- * @param src_srs : the raster's coordinate system in OGC WKT or PROJ.4
- * @param dst_srs : the transformed raster's coordinate system
- * @param resample_alg : the resampling algorithm
- * @param max_err : maximum error measured in input pixels permitted
- * (0.0 for exact calculations)
- *
- * @return the transformed raster
- */
-rt_raster
-rt_raster_transform(rt_raster raster, char *src_srs, char *dst_srs,
- GDALResampleAlg resample_alg, double max_err) {
- GDALDriverH src_drv = NULL;
- GDALDatasetH src_ds = NULL;
- GDALWarpOptions *wopts = NULL;
- GDALDatasetH dst_ds = NULL;
-
- rt_raster rast = NULL;
- rt_band band = NULL;
- int i = 0;
- int numBands = 0;
- int hasnodata = 0;
-
- RASTER_DEBUG(3, "starting");
-
- assert(NULL != raster);
- assert(NULL != src_srs);
- assert(NULL != dst_srs);
-
- /*
- max_err must be gte zero
-
- the value 0.125 is the default used in gdalwarp.cpp on line 283
- */
- if (max_err < 0.) max_err = 0.125;
- RASTER_DEBUGF(4, "max_err = %f", max_err);
-
- /* load raster into a GDAL MEM dataset */
- src_ds = rt_raster_to_gdal_mem(raster, src_srs, NULL, 0, &src_drv);
- if (NULL == src_ds) {
- rterror("rt_raster_transform: Unable to convert raster to GDAL MEM format\n");
- if (NULL != src_drv) {
- GDALDeregisterDriver(src_drv);
- GDALDestroyDriver(src_drv);
- }
- return NULL;
- }
- RASTER_DEBUG(3, "raster loaded into GDAL MEM dataset");
-
- /* set nodata mapping */
- RASTER_DEBUG(3, "Setting nodata mapping");
- numBands = rt_raster_get_num_bands(raster);
- wopts = GDALCreateWarpOptions();
- wopts->nBandCount = numBands;
- wopts->padfSrcNoDataReal = (double *) CPLMalloc(numBands * sizeof(double));
- wopts->padfDstNoDataReal = (double *) CPLMalloc(numBands * sizeof(double));
- wopts->padfSrcNoDataImag = (double *) CPLMalloc(numBands * sizeof(double));
- wopts->padfDstNoDataImag = (double *) CPLMalloc(numBands * sizeof(double));
- if (
- NULL == wopts ||
- NULL == wopts->padfSrcNoDataReal ||
- NULL == wopts->padfDstNoDataReal ||
- NULL == wopts->padfSrcNoDataImag ||
- NULL == wopts->padfDstNoDataImag
- ) {
- rterror("rt_raster_transform: Out of memory allocating nodata mapping\n");
- GDALDestroyWarpOptions(wopts);
- GDALClose(src_ds);
- GDALDeregisterDriver(src_drv);
- GDALDestroyDriver(src_drv);
- return NULL;
- }
- for (i = 0; i < numBands; i++) {
- band = rt_raster_get_band(raster, i);
- if (!band) {
- rterror("rt_raster_transform: Unable to process bands for nodata values\n");
- GDALDestroyWarpOptions(wopts);
- GDALClose(src_ds);
- GDALDeregisterDriver(src_drv);
- GDALDestroyDriver(src_drv);
- return NULL;
- }
-
- if (!rt_band_get_hasnodata_flag(band)) {
- /*
- based on line 1004 of gdalwarp.cpp
- the problem is that there is a chance that this number is a legitimate value
- */
- wopts->padfSrcNoDataReal[i] = -123456.789;
- }
- else {
- hasnodata = 1;
- wopts->padfSrcNoDataReal[i] = rt_band_get_nodata(band);
- RASTER_DEBUGF(4, "Added nodata value %f for band %d", wopts->padfSrcNoDataReal[i], i);
- }
-
- wopts->padfDstNoDataReal[i] = wopts->padfSrcNoDataReal[i];
- wopts->padfDstNoDataImag[i] = wopts->padfSrcNoDataImag[i] = 0.0;
- }
- if (!hasnodata) {
- RASTER_DEBUG(3, "No nodata mapping found");
- GDALDestroyWarpOptions(wopts);
- wopts = NULL;
- }
-
- /*
- for now, just use GDALAutoCreateWarpedVRT as it gets the job done
- in the future, it may be better to go down the more flexible but challenging path
- of gdal/apps/gdalwarp.cpp
- */
- RASTER_DEBUG(3, "Reprojecting raster");
- dst_ds = GDALAutoCreateWarpedVRT(
- src_ds,
- NULL, dst_srs,
- resample_alg, max_err,
- wopts
- );
- RASTER_DEBUG(3, "Raster reprojected");
- if (NULL == dst_ds) {
- rterror("rt_raster_transform: Unable to transform raster\n");
- if (hasnodata) GDALDestroyWarpOptions(wopts);
- GDALClose(src_ds);
- GDALDeregisterDriver(src_drv);
- GDALDestroyDriver(src_drv);
- return NULL;
- }
-
- /* convert gdal dataset to raster */
- RASTER_DEBUG(3, "Converting GDAL dataset to raster");
- rast = rt_raster_from_gdal_dataset(dst_ds);
-
- if (hasnodata) GDALDestroyWarpOptions(wopts);
- GDALClose(dst_ds);
- GDALClose(src_ds);
- GDALDeregisterDriver(src_drv);
- GDALDestroyDriver(src_drv);
-
- if (NULL == rast) {
- rterror("rt_raster_transform: Unable to transform raster\n");
- return NULL;
- }
-
- RASTER_DEBUG(3, "done");
-
- return rast;
-}
-
/**
* Return a warped raster using GDAL Warp API
*
deepRelease(raster);
}
-static void testTransform() {
+static void testGDALWarp() {
rt_raster raster;
rt_raster rast;
rt_band band;
}
}
- /*
- rast = rt_raster_transform(
- raster,
- src_srs,
- dst_srs,
- GRA_NearestNeighbour,
- -1
- );
- CHECK(rast);
- CHECK((rt_raster_get_width(rast) == 124));
- CHECK((rt_raster_get_height(rast) == 117));
- CHECK((rt_raster_get_num_bands(rast) != 0));
-
- band = rt_raster_get_band(rast, 0);
- CHECK(band);
-
- CHECK(rt_band_get_hasnodata_flag(band));
- CHECK((fabs(rt_band_get_nodata(band) - 0.) < FLT_EPSILON));
-
- CHECK(rt_band_get_pixel(band, 0, 0, &value) == 0);
- CHECK(fabs(value - 0.) < FLT_EPSILON);
-
- deepRelease(rast);
- */
-
rast = rt_raster_gdal_warp(
raster,
src_srs, dst_srs,
testGDALToRaster();
printf("Successfully tested rt_raster_from_gdal_dataset\n");
- printf("Testing rt_raster_transform\n");
- testTransform();
- printf("Successfully tested rt_raster_transform\n");
+ printf("Testing rt_raster_gdal_warp\n");
+ testGDALWarp();
+ printf("Successfully tested rt_raster_gdal_warp\n");
deepRelease(raster);