PostGIS 3.0.6dev-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 1652 of file rt_band.c.

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}
#define FALSE
Definition dbfopen.c:168
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
#define FLT_NEQ(x, y)
Definition librtcore.h:2234
#define RASTER_DEBUG(level, msg)
Definition librtcore.h:295
struct rt_pixel_t * rt_pixel
Definition librtcore.h:147
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
@ ES_NONE
Definition librtcore.h:180
void * rtrealloc(void *mem, size_t size)
Definition rt_context.c:179
int count
Definition genraster.py:57
pixel
Definition pixval.py:91
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

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: