PostGIS 3.6.2dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ rt_band_load_offline_data()

rt_errorstate rt_band_load_offline_data ( rt_band  band)

Load offline band's data.

Loaded data is internally owned and should not be released by the caller. Data will be released when band is destroyed with rt_band_destroy().

Parameters
band: the band who's data to get
Returns
ES_NONE if success, ES_ERROR if failure

Definition at line 580 of file rt_band.c.

580 {
581 GDALDatasetH hdsSrc = NULL;
582 int nband = 0;
583 VRTDatasetH hdsDst = NULL;
584 VRTSourcedRasterBandH hbandDst = NULL;
585 double ogt[6] = {0};
586 double offset[2] = {0};
587
588 rt_raster _rast = NULL;
589 rt_band _band = NULL;
590 int aligned = 0;
591 int err = ES_NONE;
592
593 assert(band != NULL);
594 assert(band->raster != NULL);
595
596 if (!band->offline) {
597 rterror("rt_band_load_offline_data: Band is not offline");
598 return ES_ERROR;
599 }
600 else if (!strlen(band->data.offline.path)) {
601 rterror("rt_band_load_offline_data: Offline band does not a have a specified file");
602 return ES_ERROR;
603 }
604
605 /* offline_data is disabled */
607 rterror("rt_band_load_offline_data: Access to offline bands disabled");
608 return ES_ERROR;
609 }
610
612 hdsSrc = rt_util_gdal_open(band->data.offline.path, GA_ReadOnly, 1);
613 if (hdsSrc == NULL) {
614 rterror("rt_band_load_offline_data: Cannot open offline raster: %s", band->data.offline.path);
615 return ES_ERROR;
616 }
617
618 /* # of bands */
619 nband = GDALGetRasterCount(hdsSrc);
620 if (!nband) {
621 rterror("rt_band_load_offline_data: No bands found in offline raster: %s", band->data.offline.path);
622 GDALClose(hdsSrc);
623 return ES_ERROR;
624 }
625 /* bandNum is 0-based */
626 else if (band->data.offline.bandNum + 1 > nband) {
627 rterror("rt_band_load_offline_data: Specified band %d not found in offline raster: %s", band->data.offline.bandNum, band->data.offline.path);
628 GDALClose(hdsSrc);
629 return ES_ERROR;
630 }
631
632 /* get offline raster's geotransform */
633 if (GDALGetGeoTransform(hdsSrc, ogt) != CE_None) {
634 RASTER_DEBUG(4, "Using default geotransform matrix (0, 1, 0, 0, 0, -1)");
635 ogt[0] = 0;
636 ogt[1] = 1;
637 ogt[2] = 0;
638 ogt[3] = 0;
639 ogt[4] = 0;
640 ogt[5] = -1;
641 }
642 RASTER_DEBUGF(3, "Offline geotransform (%f, %f, %f, %f, %f, %f)",
643 ogt[0], ogt[1], ogt[2], ogt[3], ogt[4], ogt[5]);
644
645 /* are rasters aligned? */
646 _rast = rt_raster_new(1, 1);
648 rt_raster_set_srid(_rast, band->raster->srid);
649 err = rt_raster_same_alignment(band->raster, _rast, &aligned, NULL);
650 rt_raster_destroy(_rast);
651
652 if (err != ES_NONE) {
653 rterror("rt_band_load_offline_data: Could not test alignment of in-db representation of out-db raster");
654 GDALClose(hdsSrc);
655 return ES_ERROR;
656 }
657 else if (!aligned) {
658 rtwarn("The in-db representation of the out-db raster is not aligned. Band data may be incorrect");
659 }
660
661 /* get offsets */
663 band->raster,
664 ogt[0], ogt[3],
665 &(offset[0]), &(offset[1]),
666 NULL
667 );
668
669 RASTER_DEBUGF(4, "offsets: (%f, %f)", offset[0], offset[1]);
670
671 /* create VRT dataset */
672 hdsDst = VRTCreate(band->width, band->height);
673 GDALSetGeoTransform(hdsDst, ogt);
674 /*
675 GDALSetDescription(hdsDst, "/tmp/offline.vrt");
676 */
677
678 /* add band as simple sources */
679 GDALAddBand(hdsDst, rt_util_pixtype_to_gdal_datatype(band->pixtype), NULL);
680 hbandDst = (VRTSourcedRasterBandH) GDALGetRasterBand(hdsDst, 1);
681
682 if (band->hasnodata)
683 GDALSetRasterNoDataValue(hbandDst, band->nodataval);
684
685 VRTAddSimpleSource(
686 hbandDst, GDALGetRasterBand(hdsSrc, band->data.offline.bandNum + 1),
687 fabs(offset[0]), fabs(offset[1]),
688 band->width, band->height,
689 0, 0,
690 band->width, band->height,
691 "near", VRT_NODATA_UNSET
692 );
693
694 /* make sure VRT reflects all changes */
695 VRTFlushCache(hdsDst);
696
697 /* convert VRT dataset to rt_raster */
698 _rast = rt_raster_from_gdal_dataset(hdsDst);
699
700 GDALClose(hdsDst);
701 GDALClose(hdsSrc);
702 /*
703 {
704 FILE *fp;
705 fp = fopen("/tmp/gdal_open_files.log", "w");
706 GDALDumpOpenDatasets(fp);
707 fclose(fp);
708 }
709 */
710
711 if (_rast == NULL) {
712 rterror("rt_band_load_offline_data: Cannot load data from offline raster: %s", band->data.offline.path);
713 return ES_ERROR;
714 }
715
716 _band = rt_raster_get_band(_rast, 0);
717 if (_band == NULL) {
718 rterror("rt_band_load_offline_data: Cannot load data from offline raster: %s", band->data.offline.path);
719 rt_raster_destroy(_rast);
720 return ES_ERROR;
721 }
722
723 /* band->data.offline.mem not NULL, free first */
724 if (band->data.offline.mem != NULL) {
725 rtdealloc(band->data.offline.mem);
726 band->data.offline.mem = NULL;
727 }
728
729 band->data.offline.mem = _band->data.mem;
730
731 rtdealloc(_band); /* cannot use rt_band_destroy */
732 rt_raster_destroy(_rast);
733
734 return ES_NONE;
735}
void rterror(const char *fmt,...) __attribute__((format(printf
Wrappers used for reporting errors and info.
#define RASTER_DEBUG(level, msg)
Definition librtcore.h:302
int rt_util_gdal_register_all(int force_register_all)
Definition rt_util.c:347
#define RASTER_DEBUGF(level, msg,...)
Definition librtcore.h:306
void rt_raster_set_geotransform_matrix(rt_raster raster, double *gt)
Set raster's geotransform using 6-element array.
Definition rt_raster.c:609
void void void rtwarn(const char *fmt,...) __attribute__((format(printf
rt_errorstate rt_raster_geopoint_to_cell(rt_raster raster, double xw, double yw, double *xr, double *yr, double *igt)
Convert an xw, yw map point to a xr, yr raster point.
Definition rt_raster.c:686
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
Definition rt_raster.c:86
rt_raster rt_raster_new(uint32_t width, uint32_t height)
Construct a raster with given dimensions.
Definition rt_raster.c:52
GDALDataType rt_util_pixtype_to_gdal_datatype(rt_pixtype pt)
Convert rt_pixtype to GDALDataType.
Definition rt_util.c:124
rt_raster rt_raster_from_gdal_dataset(GDALDatasetH ds)
Return a raster from a GDAL dataset.
Definition rt_raster.c:2175
GDALDatasetH rt_util_gdal_open(const char *fn, GDALAccess fn_access, int shared)
Definition rt_util.c:394
@ ES_NONE
Definition librtcore.h:182
@ ES_ERROR
Definition librtcore.h:183
void rt_raster_set_srid(rt_raster raster, int32_t srid)
Set raster's SRID.
Definition rt_raster.c:367
void rtdealloc(void *mem)
Definition rt_context.c:206
rt_errorstate rt_raster_same_alignment(rt_raster rast1, rt_raster rast2, int *aligned, char **reason)
rt_band rt_raster_get_band(rt_raster raster, int bandNum)
Return Nth band, or NULL if unavailable.
Definition rt_raster.c:385
nband
Definition pixval.py:54
bool enable_outdb_rasters
Definition rt_band.c:568
union rt_band_t::@12 data
void * mem
Definition librtcore.h:2517

References rt_band_t::data, enable_outdb_rasters, ES_ERROR, ES_NONE, rt_band_t::mem, RASTER_DEBUG, RASTER_DEBUGF, rt_raster_destroy(), rt_raster_from_gdal_dataset(), rt_raster_geopoint_to_cell(), rt_raster_get_band(), rt_raster_new(), rt_raster_same_alignment(), rt_raster_set_geotransform_matrix(), rt_raster_set_srid(), rt_util_gdal_open(), rt_util_gdal_register_all(), rt_util_pixtype_to_gdal_datatype(), rtdealloc(), rterror(), and rtwarn().

Referenced by rt_band_get_data(), and test_band_metadata().

Here is the call graph for this function:
Here is the caller graph for this function: