PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ 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 */
606  if (!enable_outdb_rasters) {
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
band
Definition: ovdump.py:58
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 ovdump::band, rt_band_t::data, enable_outdb_rasters, ES_ERROR, ES_NONE, rt_band_t::mem, pixval::nband, 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: