PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ RASTER_mapAlgebraExpr()

Datum RASTER_mapAlgebraExpr ( PG_FUNCTION_ARGS  )

Create a new empty raster with having the same georeference as the provided raster

If this new raster is empty (width = 0 OR height = 0) then there is nothing to compute and we return it right now

Check if the raster has the required band. Otherwise, return a raster without band

We set the initial value of the future band to nodata value. If nodata value is null, then the raster will be initialized to rt_band_get_min_value but all the values should be recomputed anyway

Set the new pixeltype

Optimization: If a nodataval is provided, use it for newinitialvalue. Then, we can initialize the raster with this value and skip the computation of nodata values one by one in the main computing loop

Optimization: If the raster is only filled with nodata values return right now a raster filled with the newinitialvalue TODO: Call rt_band_check_isnodata instead?

Optimization: If expression resume to 'RAST' and hasnodataval is zero, we can just return the band from the original raster

Optimization: If expression resume to a constant (it does not contain [rast)

Compute the new value, set it and we will return after creating the new raster

Create the raster receiving all the computed values. Initialize it to the new initial value

Optimization: If expression is NULL, or all the pixels could be set in one step, return the initialized raster now

We compute a value only for the withdata value pixel since the nodata value has already been set by the first optimization

Definition at line 4413 of file rtpg_mapalgebra.c.

4414 {
4415  rt_pgraster *pgraster = NULL;
4416  rt_pgraster *pgrtn = NULL;
4417  rt_raster raster = NULL;
4418  rt_raster newrast = NULL;
4419  rt_band band = NULL;
4420  rt_band newband = NULL;
4421  int x, y, nband, width, height;
4422  double r;
4423  double newnodatavalue = 0.0;
4424  double newinitialvalue = 0.0;
4425  double newval = 0.0;
4426  char *newexpr = NULL;
4427  char *initexpr = NULL;
4428  char *expression = NULL;
4429  int hasnodataval = 0;
4430  double nodataval = 0.;
4431  rt_pixtype newpixeltype;
4432  int skipcomputation = 0;
4433  int len = 0;
4434  const int argkwcount = 3;
4435  enum KEYWORDS { kVAL=0, kX=1, kY=2 };
4436  char *argkw[] = {"[rast]", "[rast.x]", "[rast.y]"};
4437  Oid argkwtypes[] = { FLOAT8OID, INT4OID, INT4OID };
4438  int argcount = 0;
4439  Oid argtype[] = { FLOAT8OID, INT4OID, INT4OID };
4440  uint8_t argpos[3] = {0};
4441  char place[12];
4442  int idx = 0;
4443  int ret = -1;
4444  TupleDesc tupdesc;
4445  SPIPlanPtr spi_plan = NULL;
4446  SPITupleTable * tuptable = NULL;
4447  HeapTuple tuple;
4448  char * strFromText = NULL;
4449  Datum *values = NULL;
4450  Datum datum = (Datum)NULL;
4451  char *nulls = NULL;
4452  bool isnull = FALSE;
4453  int i = 0;
4454  int j = 0;
4455 
4456  POSTGIS_RT_DEBUG(2, "RASTER_mapAlgebraExpr: Starting...");
4457 
4458  /* Check raster */
4459  if (PG_ARGISNULL(0)) {
4460  elog(NOTICE, "Raster is NULL. Returning NULL");
4461  PG_RETURN_NULL();
4462  }
4463 
4464 
4465  /* Deserialize raster */
4466  pgraster = (rt_pgraster *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
4467  raster = rt_raster_deserialize(pgraster, FALSE);
4468  if (NULL == raster) {
4469  PG_FREE_IF_COPY(pgraster, 0);
4470  elog(ERROR, "RASTER_mapAlgebraExpr: Could not deserialize raster");
4471  PG_RETURN_NULL();
4472  }
4473 
4474  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: Getting arguments...");
4475 
4476  if (PG_ARGISNULL(1))
4477  nband = 1;
4478  else
4479  nband = PG_GETARG_INT32(1);
4480 
4481  if (nband < 1)
4482  nband = 1;
4483 
4484 
4485  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: Creating new empty raster...");
4486 
4491  width = rt_raster_get_width(raster);
4492  height = rt_raster_get_height(raster);
4493 
4494  newrast = rt_raster_new(width, height);
4495 
4496  if ( NULL == newrast ) {
4497  PG_FREE_IF_COPY(pgraster, 0);
4498  elog(ERROR, "RASTER_mapAlgebraExpr: Could not create a new raster");
4499  PG_RETURN_NULL();
4500  }
4501 
4502  rt_raster_set_scale(newrast,
4505 
4506  rt_raster_set_offsets(newrast,
4509 
4510  rt_raster_set_skews(newrast,
4513 
4515 
4516 
4521  if (rt_raster_is_empty(newrast))
4522  {
4523  elog(NOTICE, "Raster is empty. Returning an empty raster");
4525  PG_FREE_IF_COPY(pgraster, 0);
4526 
4527  pgrtn = rt_raster_serialize(newrast);
4528  rt_raster_destroy(newrast);
4529  if (NULL == pgrtn) {
4530 
4531  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4532  PG_RETURN_NULL();
4533  }
4534 
4535  SET_VARSIZE(pgrtn, pgrtn->size);
4536  PG_RETURN_POINTER(pgrtn);
4537  }
4538 
4539 
4540  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: Getting raster band %d...", nband);
4541 
4546  if (!rt_raster_has_band(raster, nband - 1)) {
4547  elog(NOTICE, "Raster does not have the required band. Returning a raster "
4548  "without a band");
4550  PG_FREE_IF_COPY(pgraster, 0);
4551 
4552  pgrtn = rt_raster_serialize(newrast);
4553  rt_raster_destroy(newrast);
4554  if (NULL == pgrtn) {
4555  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4556  PG_RETURN_NULL();
4557  }
4558 
4559  SET_VARSIZE(pgrtn, pgrtn->size);
4560  PG_RETURN_POINTER(pgrtn);
4561  }
4562 
4563  /* Get the raster band */
4565  if ( NULL == band ) {
4566  elog(NOTICE, "Could not get the required band. Returning a raster "
4567  "without a band");
4569  PG_FREE_IF_COPY(pgraster, 0);
4570 
4571  pgrtn = rt_raster_serialize(newrast);
4572  rt_raster_destroy(newrast);
4573  if (NULL == pgrtn) {
4574  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4575  PG_RETURN_NULL();
4576  }
4577 
4578  SET_VARSIZE(pgrtn, pgrtn->size);
4579  PG_RETURN_POINTER(pgrtn);
4580  }
4581 
4582  /*
4583  * Get NODATA value
4584  */
4585  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: Getting NODATA value for band...");
4586 
4588  rt_band_get_nodata(band, &newnodatavalue);
4589  }
4590 
4591  else {
4592  newnodatavalue = rt_band_get_min_value(band);
4593  }
4594 
4595  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: NODATA value for band: = %f",
4596  newnodatavalue);
4597 
4603  newinitialvalue = newnodatavalue;
4604 
4608  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: Setting pixeltype...");
4609 
4610  if (PG_ARGISNULL(2)) {
4611  newpixeltype = rt_band_get_pixtype(band);
4612  }
4613 
4614  else {
4615  strFromText = text_to_cstring(PG_GETARG_TEXT_P(2));
4616  newpixeltype = rt_pixtype_index_from_name(strFromText);
4617  pfree(strFromText);
4618  if (newpixeltype == PT_END)
4619  newpixeltype = rt_band_get_pixtype(band);
4620  }
4621 
4622  if (newpixeltype == PT_END) {
4623  PG_FREE_IF_COPY(pgraster, 0);
4624  elog(ERROR, "RASTER_mapAlgebraExpr: Invalid pixeltype");
4625  PG_RETURN_NULL();
4626  }
4627 
4628  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: Pixeltype set to %s",
4629  rt_pixtype_name(newpixeltype));
4630 
4631 
4632  /* Construct expression for raster values */
4633  if (!PG_ARGISNULL(3)) {
4634  expression = text_to_cstring(PG_GETARG_TEXT_P(3));
4635  len = strlen("SELECT (") + strlen(expression) + strlen(")::double precision");
4636  initexpr = (char *)palloc(len + 1);
4637 
4638  memcpy(initexpr, "SELECT (", strlen("SELECT ("));
4639  memcpy(initexpr + strlen("SELECT ("), expression, strlen(expression));
4640  memcpy(initexpr + strlen("SELECT (") + strlen(expression), ")::double precision", strlen(")::double precision"));
4641  initexpr[len] = '\0';
4642 
4643  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: Expression is %s", initexpr);
4644 
4645  /* We don't need this memory */
4646  /*
4647  pfree(expression);
4648  expression = NULL;
4649  */
4650  }
4651 
4652 
4653 
4659  if (!PG_ARGISNULL(4)) {
4660  hasnodataval = 1;
4661  nodataval = PG_GETARG_FLOAT8(4);
4662  newinitialvalue = nodataval;
4663 
4664  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: new initial value = %f",
4665  newinitialvalue);
4666  }
4667  else
4668  hasnodataval = 0;
4669 
4670 
4671 
4678 
4679  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: Band is a nodata band, returning "
4680  "a raster filled with nodata");
4681 
4682  ret = rt_raster_generate_new_band(newrast, newpixeltype,
4683  newinitialvalue, TRUE, newnodatavalue, 0);
4684 
4685  /* Free memory */
4686  if (initexpr)
4687  pfree(initexpr);
4689  PG_FREE_IF_COPY(pgraster, 0);
4690 
4691  /* Serialize created raster */
4692  pgrtn = rt_raster_serialize(newrast);
4693  rt_raster_destroy(newrast);
4694  if (NULL == pgrtn) {
4695  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4696  PG_RETURN_NULL();
4697  }
4698 
4699  SET_VARSIZE(pgrtn, pgrtn->size);
4700  PG_RETURN_POINTER(pgrtn);
4701  }
4702 
4703 
4708  if (initexpr != NULL && ( !strcmp(initexpr, "SELECT [rast]") || !strcmp(initexpr, "SELECT [rast.val]") ) && !hasnodataval) {
4709 
4710  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: Expression resumes to RAST. "
4711  "Returning raster with band %d from original raster", nband);
4712 
4713  POSTGIS_RT_DEBUGF(4, "RASTER_mapAlgebraExpr: New raster has %d bands",
4714  rt_raster_get_num_bands(newrast));
4715 
4716  rt_raster_copy_band(newrast, raster, nband - 1, 0);
4717 
4718  POSTGIS_RT_DEBUGF(4, "RASTER_mapAlgebraExpr: New raster now has %d bands",
4719  rt_raster_get_num_bands(newrast));
4720 
4721  pfree(initexpr);
4723  PG_FREE_IF_COPY(pgraster, 0);
4724 
4725  /* Serialize created raster */
4726  pgrtn = rt_raster_serialize(newrast);
4727  rt_raster_destroy(newrast);
4728  if (NULL == pgrtn) {
4729  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4730  PG_RETURN_NULL();
4731  }
4732 
4733  SET_VARSIZE(pgrtn, pgrtn->size);
4734  PG_RETURN_POINTER(pgrtn);
4735  }
4736 
4741  if (initexpr != NULL && strstr(initexpr, "[rast") == NULL) {
4742  ret = SPI_connect();
4743  if (ret != SPI_OK_CONNECT) {
4744  PG_FREE_IF_COPY(pgraster, 0);
4745  elog(ERROR, "RASTER_mapAlgebraExpr: Could not connect to the SPI manager");
4746  PG_RETURN_NULL();
4747  };
4748 
4749  /* Execute the expresion into newval */
4750  ret = SPI_execute(initexpr, FALSE, 0);
4751 
4752  if (ret != SPI_OK_SELECT || SPI_tuptable == NULL || SPI_processed != 1) {
4753 
4754  /* Free memory allocated out of the current context */
4755  if (SPI_tuptable)
4756  SPI_freetuptable(tuptable);
4757  PG_FREE_IF_COPY(pgraster, 0);
4758 
4759  SPI_finish();
4760  elog(ERROR, "RASTER_mapAlgebraExpr: Invalid construction for expression");
4761  PG_RETURN_NULL();
4762  }
4763 
4764  tupdesc = SPI_tuptable->tupdesc;
4765  tuptable = SPI_tuptable;
4766 
4767  tuple = tuptable->vals[0];
4768  newexpr = SPI_getvalue(tuple, tupdesc, 1);
4769  if ( ! newexpr ) {
4770  POSTGIS_RT_DEBUG(3, "Constant expression evaluated to NULL, keeping initvalue");
4771  newval = newinitialvalue;
4772  } else {
4773  newval = atof(newexpr);
4774  }
4775 
4776  SPI_freetuptable(tuptable);
4777 
4778  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: New raster value = %f",
4779  newval);
4780 
4781  SPI_finish();
4782 
4783  skipcomputation = 1;
4784 
4789  if (!hasnodataval) {
4790  newinitialvalue = newval;
4791  skipcomputation = 2;
4792  }
4793 
4794  /* Return the new raster as it will be before computing pixel by pixel */
4795  else if (FLT_NEQ(newval, newinitialvalue)) {
4796  skipcomputation = 2;
4797  }
4798  }
4799 
4804  ret = rt_raster_generate_new_band(newrast, newpixeltype,
4805  newinitialvalue, TRUE, newnodatavalue, 0);
4806 
4811  /*if (initexpr == NULL || skipcomputation == 2) {*/
4812  if (expression == NULL || skipcomputation == 2) {
4813 
4814  /* Free memory */
4815  if (initexpr)
4816  pfree(initexpr);
4818  PG_FREE_IF_COPY(pgraster, 0);
4819 
4820  /* Serialize created raster */
4821  pgrtn = rt_raster_serialize(newrast);
4822  rt_raster_destroy(newrast);
4823  if (NULL == pgrtn) {
4824  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4825  PG_RETURN_NULL();
4826  }
4827 
4828  SET_VARSIZE(pgrtn, pgrtn->size);
4829  PG_RETURN_POINTER(pgrtn);
4830  }
4831 
4832  RASTER_DEBUG(3, "RASTER_mapAlgebraExpr: Creating new raster band...");
4833 
4834  /* Get the new raster band */
4835  newband = rt_raster_get_band(newrast, 0);
4836  if ( NULL == newband ) {
4837  elog(NOTICE, "Could not modify band for new raster. Returning new "
4838  "raster with the original band");
4839 
4840  if (initexpr)
4841  pfree(initexpr);
4843  PG_FREE_IF_COPY(pgraster, 0);
4844 
4845  /* Serialize created raster */
4846  pgrtn = rt_raster_serialize(newrast);
4847  rt_raster_destroy(newrast);
4848  if (NULL == pgrtn) {
4849  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4850  PG_RETURN_NULL();
4851  }
4852 
4853  SET_VARSIZE(pgrtn, pgrtn->size);
4854  PG_RETURN_POINTER(pgrtn);
4855  }
4856 
4857  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: Main computing loop (%d x %d)",
4858  width, height);
4859 
4860  if (initexpr != NULL) {
4861  /* Convert [rast.val] to [rast] */
4862  newexpr = rtpg_strreplace(initexpr, "[rast.val]", "[rast]", NULL);
4863  pfree(initexpr); initexpr=newexpr;
4864 
4865  sprintf(place,"$1");
4866  for (i = 0, j = 1; i < argkwcount; i++) {
4867  len = 0;
4868  newexpr = rtpg_strreplace(initexpr, argkw[i], place, &len);
4869  pfree(initexpr); initexpr=newexpr;
4870  if (len > 0) {
4871  argtype[argcount] = argkwtypes[i];
4872  argcount++;
4873  argpos[i] = j++;
4874 
4875  sprintf(place, "$%d", j);
4876  }
4877  else {
4878  argpos[i] = 0;
4879  }
4880  }
4881 
4882  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: initexpr = %s", initexpr);
4883 
4884  /* define values */
4885  values = (Datum *) palloc(sizeof(Datum) * argcount);
4886  if (values == NULL) {
4887 
4888  SPI_finish();
4889 
4891  PG_FREE_IF_COPY(pgraster, 0);
4892  rt_raster_destroy(newrast);
4893 
4894  elog(ERROR, "RASTER_mapAlgebraExpr: Could not allocate memory for value parameters of prepared statement");
4895  PG_RETURN_NULL();
4896  }
4897 
4898  /* define nulls */
4899  nulls = (char *)palloc(argcount);
4900  if (nulls == NULL) {
4901 
4902  SPI_finish();
4903 
4905  PG_FREE_IF_COPY(pgraster, 0);
4906  rt_raster_destroy(newrast);
4907 
4908  elog(ERROR, "RASTER_mapAlgebraExpr: Could not allocate memory for null parameters of prepared statement");
4909  PG_RETURN_NULL();
4910  }
4911 
4912  /* Connect to SPI and prepare the expression */
4913  ret = SPI_connect();
4914  if (ret != SPI_OK_CONNECT) {
4915 
4916  if (initexpr)
4917  pfree(initexpr);
4919  PG_FREE_IF_COPY(pgraster, 0);
4920  rt_raster_destroy(newrast);
4921 
4922  elog(ERROR, "RASTER_mapAlgebraExpr: Could not connect to the SPI manager");
4923  PG_RETURN_NULL();
4924  };
4925 
4926  /* Type of all arguments is FLOAT8OID */
4927  spi_plan = SPI_prepare(initexpr, argcount, argtype);
4928 
4929  if (spi_plan == NULL) {
4930 
4932  PG_FREE_IF_COPY(pgraster, 0);
4933  rt_raster_destroy(newrast);
4934 
4935  SPI_finish();
4936 
4937  pfree(initexpr);
4938 
4939  elog(ERROR, "RASTER_mapAlgebraExpr: Could not prepare expression");
4940  PG_RETURN_NULL();
4941  }
4942  }
4943 
4944  for (x = 0; x < width; x++) {
4945  for(y = 0; y < height; y++) {
4946  ret = rt_band_get_pixel(band, x, y, &r, NULL);
4947 
4952  if (ret == ES_NONE && FLT_NEQ(r, newnodatavalue)) {
4953  if (skipcomputation == 0) {
4954  if (initexpr != NULL) {
4955  /* Reset the null arg flags. */
4956  memset(nulls, 'n', argcount);
4957 
4958  for (i = 0; i < argkwcount; i++) {
4959  idx = argpos[i];
4960  if (idx < 1) continue;
4961  idx--;
4962 
4963  if (i == kX ) {
4964  /* x is 0 based index, but SQL expects 1 based index */
4965  values[idx] = Int32GetDatum(x+1);
4966  nulls[idx] = ' ';
4967  }
4968  else if (i == kY) {
4969  /* y is 0 based index, but SQL expects 1 based index */
4970  values[idx] = Int32GetDatum(y+1);
4971  nulls[idx] = ' ';
4972  }
4973  else if (i == kVAL ) {
4974  values[idx] = Float8GetDatum(r);
4975  nulls[idx] = ' ';
4976  }
4977 
4978  }
4979 
4980  ret = SPI_execute_plan(spi_plan, values, nulls, FALSE, 0);
4981  if (ret != SPI_OK_SELECT || SPI_tuptable == NULL ||
4982  SPI_processed != 1) {
4983  if (SPI_tuptable)
4984  SPI_freetuptable(tuptable);
4985 
4986  SPI_freeplan(spi_plan);
4987  SPI_finish();
4988 
4989  pfree(values);
4990  pfree(nulls);
4991  pfree(initexpr);
4992 
4994  PG_FREE_IF_COPY(pgraster, 0);
4995  rt_raster_destroy(newrast);
4996 
4997  elog(ERROR, "RASTER_mapAlgebraExpr: Error executing prepared plan");
4998 
4999  PG_RETURN_NULL();
5000  }
5001 
5002  tupdesc = SPI_tuptable->tupdesc;
5003  tuptable = SPI_tuptable;
5004 
5005  tuple = tuptable->vals[0];
5006  datum = SPI_getbinval(tuple, tupdesc, 1, &isnull);
5007  if ( SPI_result == SPI_ERROR_NOATTRIBUTE ) {
5008  POSTGIS_RT_DEBUGF(3, "Expression for pixel %d,%d (value %g) errored, skip setting", x+1,y+1,r);
5009  newval = newinitialvalue;
5010  }
5011  else if ( isnull ) {
5012  POSTGIS_RT_DEBUGF(3, "Expression for pixel %d,%d (value %g) evaluated to NULL, skip setting", x+1,y+1,r);
5013  newval = newinitialvalue;
5014  } else {
5015  newval = DatumGetFloat8(datum);
5016  }
5017 
5018  SPI_freetuptable(tuptable);
5019  }
5020 
5021  else
5022  newval = newinitialvalue;
5023 
5024  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: new value = %f",
5025  newval);
5026  }
5027 
5028 
5029  rt_band_set_pixel(newband, x, y, newval, NULL);
5030  }
5031 
5032  }
5033  }
5034 
5035  if (initexpr != NULL) {
5036  SPI_freeplan(spi_plan);
5037  SPI_finish();
5038 
5039  pfree(values);
5040  pfree(nulls);
5041  pfree(initexpr);
5042  }
5043  else {
5044  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: no SPI cleanup");
5045  }
5046 
5047 
5048  /* The newrast band has been modified */
5049 
5050  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: raster modified, serializing it.");
5051  /* Serialize created raster */
5052 
5054  PG_FREE_IF_COPY(pgraster, 0);
5055 
5056  pgrtn = rt_raster_serialize(newrast);
5057  rt_raster_destroy(newrast);
5058  if (NULL == pgrtn)
5059  PG_RETURN_NULL();
5060 
5061  SET_VARSIZE(pgrtn, pgrtn->size);
5062 
5063  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: raster serialized");
5064 
5065 
5066  POSTGIS_RT_DEBUG(4, "RASTER_mapAlgebraExpr: returning raster");
5067 
5068 
5069  PG_RETURN_POINTER(pgrtn);
5070 }
char * r
Definition: cu_in_wkt.c:24
#define TRUE
Definition: dbfopen.c:73
#define FALSE
Definition: dbfopen.c:72
#define FLT_NEQ(x, y)
Definition: librtcore.h:2386
#define RASTER_DEBUG(level, msg)
Definition: librtcore.h:302
int32_t rt_raster_get_srid(rt_raster raster)
Get raster's SRID.
Definition: rt_raster.c:360
double rt_raster_get_x_skew(rt_raster raster)
Get skew about the X axis.
Definition: rt_raster.c:185
double rt_raster_get_x_offset(rt_raster raster)
Get raster x offset, in projection units.
Definition: rt_raster.c:217
int rt_raster_generate_new_band(rt_raster raster, rt_pixtype pixtype, double initialvalue, uint32_t hasnodata, double nodatavalue, int index)
Generate a new inline band and add it to a raster.
Definition: rt_raster.c:489
void rt_raster_set_scale(rt_raster raster, double scaleX, double scaleY)
Set scale in projection units.
Definition: rt_raster.c:141
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
Definition: rt_band.c:674
rt_pixtype rt_pixtype_index_from_name(const char *pixname)
Definition: rt_pixel.c:80
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.
Definition: rt_band.c:1376
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
Definition: rt_raster.c:86
rt_pixtype
Definition: librtcore.h:187
@ PT_END
Definition: librtcore.h:199
void rt_raster_set_skews(rt_raster raster, double skewX, double skewY)
Set skews about the X and Y axis.
Definition: rt_raster.c:172
int rt_band_get_isnodata_flag(rt_band band)
Get isnodata flag value.
Definition: rt_band.c:714
rt_raster rt_raster_new(uint32_t width, uint32_t height)
Construct a raster with given dimensions.
Definition: rt_raster.c:52
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:1375
void * rt_raster_serialize(rt_raster raster)
Return this raster in serialized form.
Definition: rt_serialize.c:521
double rt_raster_get_x_scale(rt_raster raster)
Get scale X in projection units.
Definition: rt_raster.c:154
double rt_band_get_min_value(rt_band band)
Returns the minimal possible value for the band according to the pixel type.
Definition: rt_band.c:1902
rt_errorstate rt_band_set_pixel(rt_band band, int x, int y, double val, int *converted)
Set single pixel's value.
Definition: rt_band.c:974
@ ES_NONE
Definition: librtcore.h:182
uint16_t rt_raster_get_num_bands(rt_raster raster)
Definition: rt_raster.c:376
uint16_t rt_raster_get_height(rt_raster raster)
Definition: rt_raster.c:133
void rt_raster_set_srid(rt_raster raster, int32_t srid)
Set raster's SRID.
Definition: rt_raster.c:367
rt_errorstate rt_band_get_nodata(rt_band band, double *nodata)
Get NODATA value.
Definition: rt_band.c:1887
rt_pixtype rt_band_get_pixtype(rt_band band)
Return pixeltype of this band.
Definition: rt_band.c:631
const char * rt_pixtype_name(rt_pixtype pixtype)
Definition: rt_pixel.c:110
uint16_t rt_raster_get_width(rt_raster raster)
Definition: rt_raster.c:125
int rt_raster_copy_band(rt_raster torast, rt_raster fromrast, int fromindex, int toindex)
Copy one band from one raster to another.
Definition: rt_raster.c:1398
double rt_raster_get_y_scale(rt_raster raster)
Get scale Y in projection units.
Definition: rt_raster.c:163
double rt_raster_get_y_skew(rt_raster raster)
Get skew about the Y axis.
Definition: rt_raster.c:194
void rt_raster_set_offsets(rt_raster raster, double x, double y)
Set insertion points in projection units.
Definition: rt_raster.c:203
rt_raster rt_raster_deserialize(void *serialized, int header_only)
Return a raster from a serialized form.
Definition: rt_serialize.c:725
double rt_raster_get_y_offset(rt_raster raster)
Get raster y offset, in projection units.
Definition: rt_raster.c:226
int rt_raster_is_empty(rt_raster raster)
Return TRUE if the raster is empty.
Definition: rt_raster.c:1362
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:53
raster
Be careful!! Zeros function's input parameter can be a (height x width) array, not (width x height): ...
Definition: rtrowdump.py:121
char * rtpg_strreplace(const char *str, const char *oldstr, const char *newstr, int *count)
Definition: rtpg_internal.c:55
#define POSTGIS_RT_DEBUG(level, msg)
Definition: rtpostgis.h:65
#define POSTGIS_RT_DEBUGF(level, msg,...)
Definition: rtpostgis.h:69
Struct definitions.
Definition: librtcore.h:2403

References ovdump::band, ES_NONE, FALSE, FLT_NEQ, pixval::nband, POSTGIS_RT_DEBUG, POSTGIS_RT_DEBUGF, PT_END, r, rtrowdump::raster, RASTER_DEBUG, rt_band_get_hasnodata_flag(), rt_band_get_isnodata_flag(), rt_band_get_min_value(), rt_band_get_nodata(), rt_band_get_pixel(), rt_band_get_pixtype(), rt_band_set_pixel(), rt_pixtype_index_from_name(), rt_pixtype_name(), rt_raster_copy_band(), rt_raster_deserialize(), rt_raster_destroy(), rt_raster_generate_new_band(), rt_raster_get_band(), rt_raster_get_height(), rt_raster_get_num_bands(), rt_raster_get_srid(), rt_raster_get_width(), rt_raster_get_x_offset(), rt_raster_get_x_scale(), rt_raster_get_x_skew(), rt_raster_get_y_offset(), rt_raster_get_y_scale(), rt_raster_get_y_skew(), rt_raster_has_band(), rt_raster_is_empty(), rt_raster_new(), rt_raster_serialize(), rt_raster_set_offsets(), rt_raster_set_scale(), rt_raster_set_skews(), rt_raster_set_srid(), rtpg_strreplace(), rt_raster_serialized_t::size, TRUE, pixval::x, and pixval::y.

Here is the call graph for this function: