PostGIS  2.5.0beta2dev-r@@SVN_REVISION@@

◆ rt_band_get_pixel_of_value()

int rt_band_get_pixel_of_value ( rt_band  band,
int  exclude_nodata_value,
double *  searchset,
int  searchcount,
rt_pixel pixels 
)

Search band for pixel(s) with search values.

Parameters
band: the band to query for minimum and maximum pixel values
exclude_nodata_value: if non-zero, ignore nodata values
searchset: array of values to count
searchcount: the number of search values
pixels: pixels with the search value
Returns
-1 on error, otherwise number of pixels

Definition at line 1652 of file rt_band.c.

References genraster::count, ES_NONE, FALSE, FLT_NEQ, rt_band_t::hasnodata, rt_band_t::height, rt_band_t::isnodata, rt_pixel_t::nodata, pixval::pixel, rt_band_t::pixtype, pixval::pixval, RASTER_DEBUG, rt_band_get_pixel(), rt_pixtype_compare_clamped_values(), rtalloc(), rterror(), rtrealloc(), rt_pixel_t::value, rt_band_t::width, pixval::x, rt_pixel_t::x, pixval::y, and rt_pixel_t::y.

Referenced by RASTER_pixelOfValue(), and test_band_get_pixel_of_value().

1656  {
1657  int x;
1658  int y;
1659  int i;
1660  double pixval;
1661  int err;
1662  int count = 0;
1663  int isnodata = 0;
1664  int isequal = 0;
1665 
1666  rt_pixel pixel = NULL;
1667 
1668  assert(NULL != band);
1669  assert(NULL != pixels);
1670  assert(NULL != searchset && searchcount > 0);
1671 
1672  if (!band->hasnodata)
1673  exclude_nodata_value = FALSE;
1674  /* band is NODATA and exclude_nodata_value = TRUE, nothing to search */
1675  else if (exclude_nodata_value && band->isnodata) {
1676  RASTER_DEBUG(4, "Pixels cannot be searched as band is NODATA and excluding NODATA values");
1677  return 0;
1678  }
1679 
1680  for (x = 0; x < band->width; x++) {
1681  for (y = 0; y < band->height; y++) {
1682  err = rt_band_get_pixel(band, x, y, &pixval, &isnodata);
1683  if (err != ES_NONE) {
1684  rterror("rt_band_get_pixel_of_value: Cannot get band pixel");
1685  return -1;
1686  }
1687  else if (exclude_nodata_value && isnodata)
1688  continue;
1689 
1690  for (i = 0; i < searchcount; i++) {
1691  if (rt_pixtype_compare_clamped_values(band->pixtype, searchset[i], pixval, &isequal) != ES_NONE) {
1692  continue;
1693  }
1694 
1695  if (FLT_NEQ(pixval, searchset[i]) || !isequal)
1696  continue;
1697 
1698  /* match found */
1699  count++;
1700  if (*pixels == NULL)
1701  *pixels = (rt_pixel) rtalloc(sizeof(struct rt_pixel_t) * count);
1702  else
1703  *pixels = (rt_pixel) rtrealloc(*pixels, sizeof(struct rt_pixel_t) * count);
1704  if (*pixels == NULL) {
1705  rterror("rt_band_get_pixel_of_value: Could not allocate memory for pixel(s)");
1706  return -1;
1707  }
1708 
1709  pixel = &((*pixels)[count - 1]);
1710  pixel->x = x;
1711  pixel->y = y;
1712  pixel->nodata = 0;
1713  pixel->value = pixval;
1714  }
1715  }
1716  }
1717 
1718  return count;
1719 }
pixel
Definition: pixval.py:90
struct rt_pixel_t * rt_pixel
Definition: librtcore.h:147
rt_pixtype pixtype
Definition: librtcore.h:2314
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
Definition: rt_context.c:199
void * rtalloc(size_t size)
Wrappers used for managing memory.
Definition: rt_context.c:171
void * rtrealloc(void *mem, size_t size)
Definition: rt_context.c:179
uint16_t height
Definition: librtcore.h:2317
double value
Definition: librtcore.h:2338
#define FLT_NEQ(x, y)
Definition: librtcore.h:2233
int count
Definition: genraster.py:56
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.
Definition: rt_band.c:1221
uint8_t nodata
Definition: librtcore.h:2337
uint16_t width
Definition: librtcore.h:2316
pixval
Definition: pixval.py:93
int32_t isnodata
Definition: librtcore.h:2319
#define FALSE
Definition: dbfopen.c:168
#define RASTER_DEBUG(level, msg)
Definition: librtcore.h:295
int32_t hasnodata
Definition: librtcore.h:2318
rt_errorstate rt_pixtype_compare_clamped_values(rt_pixtype pixtype, double val, double refval, int *isequal)
Test to see if two values are equal when clamped.
Definition: rt_pixel.c:200
Here is the call graph for this function:
Here is the caller graph for this function: