PostGIS  3.4.0dev-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 1809 of file rt_band.c.

1813  {
1814  int x;
1815  int y;
1816  int i;
1817  double pixval;
1818  int err;
1819  int count = 0;
1820  int isnodata = 0;
1821  int isequal = 0;
1822 
1823  rt_pixel pixel = NULL;
1824 
1825  assert(NULL != band);
1826  assert(NULL != pixels);
1827  assert(NULL != searchset && searchcount > 0);
1828 
1829  if (!band->hasnodata)
1830  exclude_nodata_value = FALSE;
1831  /* band is NODATA and exclude_nodata_value = TRUE, nothing to search */
1832  else if (exclude_nodata_value && band->isnodata) {
1833  RASTER_DEBUG(4, "Pixels cannot be searched as band is NODATA and excluding NODATA values");
1834  return 0;
1835  }
1836 
1837  for (x = 0; x < band->width; x++) {
1838  for (y = 0; y < band->height; y++) {
1839  err = rt_band_get_pixel(band, x, y, &pixval, &isnodata);
1840  if (err != ES_NONE) {
1841  rterror("rt_band_get_pixel_of_value: Cannot get band pixel");
1842  return -1;
1843  }
1844  else if (exclude_nodata_value && isnodata)
1845  continue;
1846 
1847  for (i = 0; i < searchcount; i++) {
1848  if (rt_pixtype_compare_clamped_values(band->pixtype, searchset[i], pixval, &isequal) != ES_NONE) {
1849  continue;
1850  }
1851 
1852  if (FLT_NEQ(pixval, searchset[i]) || !isequal)
1853  continue;
1854 
1855  /* match found */
1856  count++;
1857  if (*pixels == NULL)
1858  *pixels = (rt_pixel) rtalloc(sizeof(struct rt_pixel_t) * count);
1859  else
1860  *pixels = (rt_pixel) rtrealloc(*pixels, sizeof(struct rt_pixel_t) * count);
1861  if (*pixels == NULL) {
1862  rterror("rt_band_get_pixel_of_value: Could not allocate memory for pixel(s)");
1863  return -1;
1864  }
1865 
1866  pixel = &((*pixels)[count - 1]);
1867  pixel->x = x;
1868  pixel->y = y;
1869  pixel->nodata = 0;
1870  pixel->value = pixval;
1871  }
1872  }
1873  }
1874 
1875  return count;
1876 }
#define FALSE
Definition: dbfopen.c:72
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
Definition: rt_context.c:219
void * rtalloc(size_t size)
Wrappers used for managing memory.
Definition: rt_context.c:191
#define FLT_NEQ(x, y)
Definition: librtcore.h:2386
#define RASTER_DEBUG(level, msg)
Definition: librtcore.h:302
struct rt_pixel_t * rt_pixel
Definition: librtcore.h:149
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:202
@ ES_NONE
Definition: librtcore.h:182
void * rtrealloc(void *mem, size_t size)
Definition: rt_context.c:199
int count
Definition: genraster.py:57
band
Definition: ovdump.py:58
pixval
Definition: pixval.py:94
pixel
Definition: pixval.py:91
Definition: pixval.py:1
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

References ovdump::band, genraster::count, ES_NONE, FALSE, FLT_NEQ, pixval::pixel, pixval::pixval, RASTER_DEBUG, rt_band_get_pixel(), rt_pixtype_compare_clamped_values(), rtalloc(), rterror(), rtrealloc(), pixval::x, and pixval::y.

Referenced by RASTER_pixelOfValue(), and test_band_get_pixel_of_value().

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