PostGIS  3.3.9dev-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 4459 of file rtpg_mapalgebra.c.

4460 {
4461  rt_pgraster *pgraster = NULL;
4462  rt_pgraster *pgrtn = NULL;
4463  rt_raster raster = NULL;
4464  rt_raster newrast = NULL;
4465  rt_band band = NULL;
4466  rt_band newband = NULL;
4467  int x, y, nband, width, height;
4468  double r;
4469  double newnodatavalue = 0.0;
4470  double newinitialvalue = 0.0;
4471  double newval = 0.0;
4472  char *newexpr = NULL;
4473  char *initexpr = NULL;
4474  char *expression = NULL;
4475  int hasnodataval = 0;
4476  double nodataval = 0.;
4477  rt_pixtype newpixeltype;
4478  int skipcomputation = 0;
4479  int len = 0;
4480  const int argkwcount = 3;
4481  enum KEYWORDS { kVAL=0, kX=1, kY=2 };
4482  char *argkw[] = {"[rast]", "[rast.x]", "[rast.y]"};
4483  Oid argkwtypes[] = { FLOAT8OID, INT4OID, INT4OID };
4484  int argcount = 0;
4485  Oid argtype[] = { FLOAT8OID, INT4OID, INT4OID };
4486  uint8_t argpos[3] = {0};
4487  char place[12];
4488  int idx = 0;
4489  int ret = -1;
4490  TupleDesc tupdesc;
4491  SPIPlanPtr spi_plan = NULL;
4492  SPITupleTable * tuptable = NULL;
4493  HeapTuple tuple;
4494  char * strFromText = NULL;
4495  Datum *values = NULL;
4496  Datum datum = (Datum)NULL;
4497  char *nulls = NULL;
4498  bool isnull = FALSE;
4499  int i = 0;
4500  int j = 0;
4501 
4502  POSTGIS_RT_DEBUG(2, "RASTER_mapAlgebraExpr: Starting...");
4503 
4504  /* Check raster */
4505  if (PG_ARGISNULL(0)) {
4506  elog(NOTICE, "Raster is NULL. Returning NULL");
4507  PG_RETURN_NULL();
4508  }
4509 
4510 
4511  /* Deserialize raster */
4512  pgraster = (rt_pgraster *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
4513  raster = rt_raster_deserialize(pgraster, FALSE);
4514  if (NULL == raster) {
4515  PG_FREE_IF_COPY(pgraster, 0);
4516  elog(ERROR, "RASTER_mapAlgebraExpr: Could not deserialize raster");
4517  PG_RETURN_NULL();
4518  }
4519 
4520  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: Getting arguments...");
4521 
4522  if (PG_ARGISNULL(1))
4523  nband = 1;
4524  else
4525  nband = PG_GETARG_INT32(1);
4526 
4527  if (nband < 1)
4528  nband = 1;
4529 
4530 
4531  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: Creating new empty raster...");
4532 
4537  width = rt_raster_get_width(raster);
4538  height = rt_raster_get_height(raster);
4539 
4540  newrast = rt_raster_new(width, height);
4541 
4542  if ( NULL == newrast ) {
4543  PG_FREE_IF_COPY(pgraster, 0);
4544  elog(ERROR, "RASTER_mapAlgebraExpr: Could not create a new raster");
4545  PG_RETURN_NULL();
4546  }
4547 
4548  rt_raster_set_scale(newrast,
4551 
4552  rt_raster_set_offsets(newrast,
4555 
4556  rt_raster_set_skews(newrast,
4559 
4561 
4562 
4567  if (rt_raster_is_empty(newrast))
4568  {
4569  elog(NOTICE, "Raster is empty. Returning an empty raster");
4571  PG_FREE_IF_COPY(pgraster, 0);
4572 
4573  pgrtn = rt_raster_serialize(newrast);
4574  rt_raster_destroy(newrast);
4575  if (NULL == pgrtn) {
4576 
4577  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4578  PG_RETURN_NULL();
4579  }
4580 
4581  SET_VARSIZE(pgrtn, pgrtn->size);
4582  PG_RETURN_POINTER(pgrtn);
4583  }
4584 
4585 
4586  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: Getting raster band %d...", nband);
4587 
4592  if (!rt_raster_has_band(raster, nband - 1)) {
4593  elog(NOTICE, "Raster does not have the required band. Returning a raster "
4594  "without a band");
4596  PG_FREE_IF_COPY(pgraster, 0);
4597 
4598  pgrtn = rt_raster_serialize(newrast);
4599  rt_raster_destroy(newrast);
4600  if (NULL == pgrtn) {
4601  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4602  PG_RETURN_NULL();
4603  }
4604 
4605  SET_VARSIZE(pgrtn, pgrtn->size);
4606  PG_RETURN_POINTER(pgrtn);
4607  }
4608 
4609  /* Get the raster band */
4611  if ( NULL == band ) {
4612  elog(NOTICE, "Could not get the required band. Returning a raster "
4613  "without a band");
4615  PG_FREE_IF_COPY(pgraster, 0);
4616 
4617  pgrtn = rt_raster_serialize(newrast);
4618  rt_raster_destroy(newrast);
4619  if (NULL == pgrtn) {
4620  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4621  PG_RETURN_NULL();
4622  }
4623 
4624  SET_VARSIZE(pgrtn, pgrtn->size);
4625  PG_RETURN_POINTER(pgrtn);
4626  }
4627 
4628  /*
4629  * Get NODATA value
4630  */
4631  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: Getting NODATA value for band...");
4632 
4634  rt_band_get_nodata(band, &newnodatavalue);
4635  }
4636 
4637  else {
4638  newnodatavalue = rt_band_get_min_value(band);
4639  }
4640 
4641  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: NODATA value for band: = %f",
4642  newnodatavalue);
4643 
4649  newinitialvalue = newnodatavalue;
4650 
4654  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: Setting pixeltype...");
4655 
4656  if (PG_ARGISNULL(2)) {
4657  newpixeltype = rt_band_get_pixtype(band);
4658  }
4659 
4660  else {
4661  strFromText = text_to_cstring(PG_GETARG_TEXT_P(2));
4662  newpixeltype = rt_pixtype_index_from_name(strFromText);
4663  pfree(strFromText);
4664  if (newpixeltype == PT_END)
4665  newpixeltype = rt_band_get_pixtype(band);
4666  }
4667 
4668  if (newpixeltype == PT_END) {
4669  PG_FREE_IF_COPY(pgraster, 0);
4670  elog(ERROR, "RASTER_mapAlgebraExpr: Invalid pixeltype");
4671  PG_RETURN_NULL();
4672  }
4673 
4674  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: Pixeltype set to %s",
4675  rt_pixtype_name(newpixeltype));
4676 
4677 
4678  /* Construct expression for raster values */
4679  if (!PG_ARGISNULL(3)) {
4680  expression = text_to_cstring(PG_GETARG_TEXT_P(3));
4681  len = strlen("SELECT (") + strlen(expression) + strlen(")::double precision");
4682  initexpr = (char *)palloc(len + 1);
4683 
4684  memcpy(initexpr, "SELECT (", strlen("SELECT ("));
4685  memcpy(initexpr + strlen("SELECT ("), expression, strlen(expression));
4686  memcpy(initexpr + strlen("SELECT (") + strlen(expression), ")::double precision", strlen(")::double precision"));
4687  initexpr[len] = '\0';
4688 
4689  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: Expression is %s", initexpr);
4690 
4691  /* We don't need this memory */
4692  /*
4693  pfree(expression);
4694  expression = NULL;
4695  */
4696  }
4697 
4698 
4699 
4705  if (!PG_ARGISNULL(4)) {
4706  hasnodataval = 1;
4707  nodataval = PG_GETARG_FLOAT8(4);
4708  newinitialvalue = nodataval;
4709 
4710  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: new initial value = %f",
4711  newinitialvalue);
4712  }
4713  else
4714  hasnodataval = 0;
4715 
4716 
4717 
4724 
4725  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: Band is a nodata band, returning "
4726  "a raster filled with nodata");
4727 
4728  ret = rt_raster_generate_new_band(newrast, newpixeltype,
4729  newinitialvalue, TRUE, newnodatavalue, 0);
4730 
4731  /* Free memory */
4732  if (initexpr)
4733  pfree(initexpr);
4735  PG_FREE_IF_COPY(pgraster, 0);
4736 
4737  /* Serialize created raster */
4738  pgrtn = rt_raster_serialize(newrast);
4739  rt_raster_destroy(newrast);
4740  if (NULL == pgrtn) {
4741  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4742  PG_RETURN_NULL();
4743  }
4744 
4745  SET_VARSIZE(pgrtn, pgrtn->size);
4746  PG_RETURN_POINTER(pgrtn);
4747  }
4748 
4749 
4754  if (initexpr != NULL && ( !strcmp(initexpr, "SELECT [rast]") || !strcmp(initexpr, "SELECT [rast.val]") ) && !hasnodataval) {
4755 
4756  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: Expression resumes to RAST. "
4757  "Returning raster with band %d from original raster", nband);
4758 
4759  POSTGIS_RT_DEBUGF(4, "RASTER_mapAlgebraExpr: New raster has %d bands",
4760  rt_raster_get_num_bands(newrast));
4761 
4762  rt_raster_copy_band(newrast, raster, nband - 1, 0);
4763 
4764  POSTGIS_RT_DEBUGF(4, "RASTER_mapAlgebraExpr: New raster now has %d bands",
4765  rt_raster_get_num_bands(newrast));
4766 
4767  pfree(initexpr);
4769  PG_FREE_IF_COPY(pgraster, 0);
4770 
4771  /* Serialize created raster */
4772  pgrtn = rt_raster_serialize(newrast);
4773  rt_raster_destroy(newrast);
4774  if (NULL == pgrtn) {
4775  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4776  PG_RETURN_NULL();
4777  }
4778 
4779  SET_VARSIZE(pgrtn, pgrtn->size);
4780  PG_RETURN_POINTER(pgrtn);
4781  }
4782 
4787  if (initexpr != NULL && strstr(initexpr, "[rast") == NULL) {
4788  ret = SPI_connect();
4789  if (ret != SPI_OK_CONNECT) {
4790  PG_FREE_IF_COPY(pgraster, 0);
4791  elog(ERROR, "RASTER_mapAlgebraExpr: Could not connect to the SPI manager");
4792  PG_RETURN_NULL();
4793  };
4794 
4795  /* Execute the expresion into newval */
4796  ret = SPI_execute(initexpr, FALSE, 0);
4797 
4798  if (ret != SPI_OK_SELECT || SPI_tuptable == NULL || SPI_processed != 1) {
4799 
4800  /* Free memory allocated out of the current context */
4801  if (SPI_tuptable)
4802  SPI_freetuptable(tuptable);
4803  PG_FREE_IF_COPY(pgraster, 0);
4804 
4805  SPI_finish();
4806  elog(ERROR, "RASTER_mapAlgebraExpr: Invalid construction for expression");
4807  PG_RETURN_NULL();
4808  }
4809 
4810  tupdesc = SPI_tuptable->tupdesc;
4811  tuptable = SPI_tuptable;
4812 
4813  tuple = tuptable->vals[0];
4814  newexpr = SPI_getvalue(tuple, tupdesc, 1);
4815  if ( ! newexpr ) {
4816  POSTGIS_RT_DEBUG(3, "Constant expression evaluated to NULL, keeping initvalue");
4817  newval = newinitialvalue;
4818  } else {
4819  newval = atof(newexpr);
4820  }
4821 
4822  SPI_freetuptable(tuptable);
4823 
4824  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: New raster value = %f",
4825  newval);
4826 
4827  SPI_finish();
4828 
4829  skipcomputation = 1;
4830 
4835  if (!hasnodataval) {
4836  newinitialvalue = newval;
4837  skipcomputation = 2;
4838  }
4839 
4840  /* Return the new raster as it will be before computing pixel by pixel */
4841  else if (FLT_NEQ(newval, newinitialvalue)) {
4842  skipcomputation = 2;
4843  }
4844  }
4845 
4850  ret = rt_raster_generate_new_band(newrast, newpixeltype,
4851  newinitialvalue, TRUE, newnodatavalue, 0);
4852 
4857  /*if (initexpr == NULL || skipcomputation == 2) {*/
4858  if (expression == NULL || skipcomputation == 2) {
4859 
4860  /* Free memory */
4861  if (initexpr)
4862  pfree(initexpr);
4864  PG_FREE_IF_COPY(pgraster, 0);
4865 
4866  /* Serialize created raster */
4867  pgrtn = rt_raster_serialize(newrast);
4868  rt_raster_destroy(newrast);
4869  if (NULL == pgrtn) {
4870  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4871  PG_RETURN_NULL();
4872  }
4873 
4874  SET_VARSIZE(pgrtn, pgrtn->size);
4875  PG_RETURN_POINTER(pgrtn);
4876  }
4877 
4878  RASTER_DEBUG(3, "RASTER_mapAlgebraExpr: Creating new raster band...");
4879 
4880  /* Get the new raster band */
4881  newband = rt_raster_get_band(newrast, 0);
4882  if ( NULL == newband ) {
4883  elog(NOTICE, "Could not modify band for new raster. Returning new "
4884  "raster with the original band");
4885 
4886  if (initexpr)
4887  pfree(initexpr);
4889  PG_FREE_IF_COPY(pgraster, 0);
4890 
4891  /* Serialize created raster */
4892  pgrtn = rt_raster_serialize(newrast);
4893  rt_raster_destroy(newrast);
4894  if (NULL == pgrtn) {
4895  elog(ERROR, "RASTER_mapAlgebraExpr: Could not serialize raster");
4896  PG_RETURN_NULL();
4897  }
4898 
4899  SET_VARSIZE(pgrtn, pgrtn->size);
4900  PG_RETURN_POINTER(pgrtn);
4901  }
4902 
4903  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: Main computing loop (%d x %d)",
4904  width, height);
4905 
4906  if (initexpr != NULL) {
4907  /* Convert [rast.val] to [rast] */
4908  newexpr = rtpg_strreplace(initexpr, "[rast.val]", "[rast]", NULL);
4909  pfree(initexpr); initexpr=newexpr;
4910 
4911  sprintf(place,"$1");
4912  for (i = 0, j = 1; i < argkwcount; i++) {
4913  len = 0;
4914  newexpr = rtpg_strreplace(initexpr, argkw[i], place, &len);
4915  pfree(initexpr); initexpr=newexpr;
4916  if (len > 0) {
4917  argtype[argcount] = argkwtypes[i];
4918  argcount++;
4919  argpos[i] = j++;
4920 
4921  sprintf(place, "$%d", j);
4922  }
4923  else {
4924  argpos[i] = 0;
4925  }
4926  }
4927 
4928  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: initexpr = %s", initexpr);
4929 
4930  /* define values */
4931  values = (Datum *) palloc(sizeof(Datum) * argcount);
4932  if (values == NULL) {
4933 
4934  SPI_finish();
4935 
4937  PG_FREE_IF_COPY(pgraster, 0);
4938  rt_raster_destroy(newrast);
4939 
4940  elog(ERROR, "RASTER_mapAlgebraExpr: Could not allocate memory for value parameters of prepared statement");
4941  PG_RETURN_NULL();
4942  }
4943 
4944  /* define nulls */
4945  nulls = (char *)palloc(argcount);
4946  if (nulls == NULL) {
4947 
4948  SPI_finish();
4949 
4951  PG_FREE_IF_COPY(pgraster, 0);
4952  rt_raster_destroy(newrast);
4953 
4954  elog(ERROR, "RASTER_mapAlgebraExpr: Could not allocate memory for null parameters of prepared statement");
4955  PG_RETURN_NULL();
4956  }
4957 
4958  /* Connect to SPI and prepare the expression */
4959  ret = SPI_connect();
4960  if (ret != SPI_OK_CONNECT) {
4961 
4962  if (initexpr)
4963  pfree(initexpr);
4965  PG_FREE_IF_COPY(pgraster, 0);
4966  rt_raster_destroy(newrast);
4967 
4968  elog(ERROR, "RASTER_mapAlgebraExpr: Could not connect to the SPI manager");
4969  PG_RETURN_NULL();
4970  };
4971 
4972  /* Type of all arguments is FLOAT8OID */
4973  spi_plan = SPI_prepare(initexpr, argcount, argtype);
4974 
4975  if (spi_plan == NULL) {
4976 
4978  PG_FREE_IF_COPY(pgraster, 0);
4979  rt_raster_destroy(newrast);
4980 
4981  SPI_finish();
4982 
4983  pfree(initexpr);
4984 
4985  elog(ERROR, "RASTER_mapAlgebraExpr: Could not prepare expression");
4986  PG_RETURN_NULL();
4987  }
4988  }
4989 
4990  for (x = 0; x < width; x++) {
4991  for(y = 0; y < height; y++) {
4992  ret = rt_band_get_pixel(band, x, y, &r, NULL);
4993 
4998  if (ret == ES_NONE && FLT_NEQ(r, newnodatavalue)) {
4999  if (skipcomputation == 0) {
5000  if (initexpr != NULL) {
5001  /* Reset the null arg flags. */
5002  memset(nulls, 'n', argcount);
5003 
5004  for (i = 0; i < argkwcount; i++) {
5005  idx = argpos[i];
5006  if (idx < 1) continue;
5007  idx--;
5008 
5009  if (i == kX ) {
5010  /* x is 0 based index, but SQL expects 1 based index */
5011  values[idx] = Int32GetDatum(x+1);
5012  nulls[idx] = ' ';
5013  }
5014  else if (i == kY) {
5015  /* y is 0 based index, but SQL expects 1 based index */
5016  values[idx] = Int32GetDatum(y+1);
5017  nulls[idx] = ' ';
5018  }
5019  else if (i == kVAL ) {
5020  values[idx] = Float8GetDatum(r);
5021  nulls[idx] = ' ';
5022  }
5023 
5024  }
5025 
5026  ret = SPI_execute_plan(spi_plan, values, nulls, FALSE, 0);
5027  if (ret != SPI_OK_SELECT || SPI_tuptable == NULL ||
5028  SPI_processed != 1) {
5029  if (SPI_tuptable)
5030  SPI_freetuptable(tuptable);
5031 
5032  SPI_freeplan(spi_plan);
5033  SPI_finish();
5034 
5035  pfree(values);
5036  pfree(nulls);
5037  pfree(initexpr);
5038 
5040  PG_FREE_IF_COPY(pgraster, 0);
5041  rt_raster_destroy(newrast);
5042 
5043  elog(ERROR, "RASTER_mapAlgebraExpr: Error executing prepared plan");
5044 
5045  PG_RETURN_NULL();
5046  }
5047 
5048  tupdesc = SPI_tuptable->tupdesc;
5049  tuptable = SPI_tuptable;
5050 
5051  tuple = tuptable->vals[0];
5052  datum = SPI_getbinval(tuple, tupdesc, 1, &isnull);
5053  if ( SPI_result == SPI_ERROR_NOATTRIBUTE ) {
5054  POSTGIS_RT_DEBUGF(3, "Expression for pixel %d,%d (value %g) errored, skip setting", x+1,y+1,r);
5055  newval = newinitialvalue;
5056  }
5057  else if ( isnull ) {
5058  POSTGIS_RT_DEBUGF(3, "Expression for pixel %d,%d (value %g) evaluated to NULL, skip setting", x+1,y+1,r);
5059  newval = newinitialvalue;
5060  } else {
5061  newval = DatumGetFloat8(datum);
5062  }
5063 
5064  SPI_freetuptable(tuptable);
5065  }
5066 
5067  else
5068  newval = newinitialvalue;
5069 
5070  POSTGIS_RT_DEBUGF(3, "RASTER_mapAlgebraExpr: new value = %f",
5071  newval);
5072  }
5073 
5074 
5075  rt_band_set_pixel(newband, x, y, newval, NULL);
5076  }
5077 
5078  }
5079  }
5080 
5081  if (initexpr != NULL) {
5082  SPI_freeplan(spi_plan);
5083  SPI_finish();
5084 
5085  pfree(values);
5086  pfree(nulls);
5087  pfree(initexpr);
5088  }
5089  else {
5090  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: no SPI cleanup");
5091  }
5092 
5093 
5094  /* The newrast band has been modified */
5095 
5096  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: raster modified, serializing it.");
5097  /* Serialize created raster */
5098 
5100  PG_FREE_IF_COPY(pgraster, 0);
5101 
5102  pgrtn = rt_raster_serialize(newrast);
5103  rt_raster_destroy(newrast);
5104  if (NULL == pgrtn)
5105  PG_RETURN_NULL();
5106 
5107  SET_VARSIZE(pgrtn, pgrtn->size);
5108 
5109  POSTGIS_RT_DEBUG(3, "RASTER_mapAlgebraExpr: raster serialized");
5110 
5111 
5112  POSTGIS_RT_DEBUG(4, "RASTER_mapAlgebraExpr: returning raster");
5113 
5114 
5115  PG_RETURN_POINTER(pgrtn);
5116 }
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:2379
#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:69
#define POSTGIS_RT_DEBUGF(level, msg,...)
Definition: rtpostgis.h:73
Struct definitions.
Definition: librtcore.h:2396

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: