PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ 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 1989 of file rt_band.c.

1993 {
1994 int x;
1995 int y;
1996 int i;
1997 double pixval;
1998 int err;
1999 int count = 0;
2000 int isnodata = 0;
2001 int isequal = 0;
2002
2003 rt_pixel pixel = NULL;
2004
2005 assert(NULL != band);
2006 assert(NULL != pixels);
2007 assert(NULL != searchset && searchcount > 0);
2008
2009 if (!band->hasnodata)
2010 exclude_nodata_value = FALSE;
2011 /* band is NODATA and exclude_nodata_value = TRUE, nothing to search */
2012 else if (exclude_nodata_value && band->isnodata) {
2013 RASTER_DEBUG(4, "Pixels cannot be searched as band is NODATA and excluding NODATA values");
2014 return 0;
2015 }
2016
2017 for (x = 0; x < band->width; x++) {
2018 for (y = 0; y < band->height; y++) {
2019 err = rt_band_get_pixel(band, x, y, &pixval, &isnodata);
2020 if (err != ES_NONE) {
2021 rterror("rt_band_get_pixel_of_value: Cannot get band pixel");
2022 return -1;
2023 }
2024 else if (exclude_nodata_value && isnodata)
2025 continue;
2026
2027 for (i = 0; i < searchcount; i++) {
2028 if (rt_pixtype_compare_clamped_values(band->pixtype, searchset[i], pixval, &isequal) != ES_NONE) {
2029 continue;
2030 }
2031
2032 if (FLT_NEQ(pixval, searchset[i]) || !isequal)
2033 continue;
2034
2035 /* match found */
2036 count++;
2037 if (*pixels == NULL)
2038 *pixels = (rt_pixel) rtalloc(sizeof(struct rt_pixel_t) * count);
2039 else
2040 *pixels = (rt_pixel) rtrealloc(*pixels, sizeof(struct rt_pixel_t) * count);
2041 if (*pixels == NULL) {
2042 rterror("rt_band_get_pixel_of_value: Could not allocate memory for pixel(s)");
2043 return -1;
2044 }
2045
2046 pixel = &((*pixels)[count - 1]);
2047 pixel->x = x;
2048 pixel->y = y;
2049 pixel->nodata = 0;
2050 pixel->value = pixval;
2051 }
2052 }
2053 }
2054
2055 return count;
2056}
#define FALSE
Definition dbfopen.c:72
void rterror(const char *fmt,...) __attribute__((format(printf
Wrappers used for reporting errors and info.
void * rtalloc(size_t size)
Wrappers used for managing memory.
Definition rt_context.c:191
#define FLT_NEQ(x, y)
Definition librtcore.h:2435
#define RASTER_DEBUG(level, msg)
Definition librtcore.h:304
struct rt_pixel_t * rt_pixel
Definition librtcore.h:148
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:211
@ ES_NONE
Definition librtcore.h:182
void * rtrealloc(void *mem, size_t size)
Definition rt_context.c:199
int count
Definition genraster.py:57
pixel
Definition pixval.py:94
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.
Definition rt_band.c:1551

References ES_NONE, FALSE, FLT_NEQ, RASTER_DEBUG, rt_band_get_pixel(), rt_pixtype_compare_clamped_values(), rtalloc(), rterror(), and rtrealloc().

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: