Get nearest pixel(s) with value (not NODATA) to specified pixel.
1715 {
1717 int extent[4] = {0};
1718 int max_extent[4] = {0};
1719 int d0 = 0;
1721 uint32_t _d[2] = {0};
1722 uint32_t i = 0;
1723 uint32_t j = 0;
1724 uint32_t k = 0;
1725 int _max = 0;
1726 int _x = 0;
1727 int _y = 0;
1728 int *_min = NULL;
1730 double minval = 0;
1732 int isnodata = 0;
1733
1734 int inextent = 0;
1735
1736 assert(NULL != band);
1737 assert(NULL != npixels);
1738
1740
1741
1744
1745
1747 d0 = 1;
1748
1751
1752
1753 if (
1754 exclude_nodata_value && (
1755 (x < 0 || x >
band->width) ||
1756 (y < 0 || y >
band->height)
1757 )
1758 ) {
1759
1760 if (d0) {
1761 if (x < 0)
1763 else if (x >
band->width)
1765
1766 if (y < 0)
1768 else if (y >
band->height)
1770
1772 }
1773
1774
1775
1776
1777 else if (
1780 ) {
1781 RASTER_DEBUG(4,
"No nearest pixels possible for provided pixel and distances");
1782 return 0;
1783 }
1784 }
1785
1786
1787 if (!
band->hasnodata)
1788 exclude_nodata_value =
FALSE;
1789
1790 else if (exclude_nodata_value &&
band->isnodata) {
1791 RASTER_DEBUG(4,
"No nearest pixels possible as band is NODATA and excluding NODATA values");
1792 return 0;
1793 }
1794
1795
1796 if (d0) {
1797 int a, b;
1798
1799
1800 a = abs(x);
1801 b = abs(x -
band->width);
1802
1803 if (a > b)
1805 else
1807
1808
1809 a = abs(y);
1810 b = abs(y -
band->height);
1811 if (a > b)
1813 else
1815
1817 }
1818
1819
1823
1824
1826 *npixels = NULL;
1827
1828
1834 max_extent[0], max_extent[1], max_extent[2], max_extent[3]);
1835
1836 _d[0] = 0;
1837 _d[1] = 0;
1838 do {
1839 _d[0]++;
1840 _d[1]++;
1841
1842 extent[0] =
x - (int)_d[0];
1843 extent[1] =
y - (int)_d[1];
1844 extent[2] =
x + (int)_d[0];
1845 extent[3] =
y + (int)_d[1];
1846
1847 RASTER_DEBUGF(4,
"Processing distances: %d x %d", _d[0], _d[1]);
1849 extent[0], extent[1], extent[2], extent[3]);
1850
1851 for (i = 0; i < 2; i++) {
1852
1853
1854 if (i < 1)
1855 _max = extent[2] - extent[0] + 1;
1856
1857 else
1858 _max = extent[3] - extent[1] + 1;
1859 _max = abs(_max);
1860
1861 for (j = 0; j < 2; j++) {
1862
1863 if (i < 1) {
1864 _x = extent[0];
1865 _min = &_x;
1866
1867
1868 if (j < 1)
1869 _y = extent[1];
1870
1871 else
1872 _y = extent[3];
1873 }
1874
1875 else {
1876 _y = extent[1] + 1;
1877 _min = &_y;
1878
1879
1880 if (j < 1) {
1881 _x = extent[0];
1882 _max -= 2;
1883 }
1884
1885 else
1886 _x = extent[2];
1887 }
1888
1890 for (k = 0; k < (uint32_t) _max; k++) {
1891
1892 if (
1893 _x < max_extent[0] || _x > max_extent[2] ||
1894 _y < max_extent[1] || _y > max_extent[3]
1895 ) {
1896 (*_min)++;
1897 continue;
1898 }
1899
1900
1901 if (
1902 (_x < 0 || _x >=
band->width) ||
1903 (_y < 0 || _y >=
band->height)
1904 ) {
1905
1906 if (!
band->hasnodata)
1908
1909 else
1911 RASTER_DEBUGF(4,
"NODATA pixel outside band extent: (x, y, val) = (%d, %d, %f)", _x, _y,
pixval);
1912 inextent = 0;
1913 isnodata = 1;
1914 }
1915 else {
1917 band,
1918 _x, _y,
1920 &isnodata
1922 rterror(
"rt_band_get_nearest_pixel: Could not get pixel value");
1924 return -1;
1925 }
1927 inextent = 1;
1928 }
1929
1930
1931 if (!exclude_nodata_value || (exclude_nodata_value && !isnodata)) {
1932
1933 RASTER_DEBUGF(4,
"Adding pixel to set of nearest pixels: (x, y, val) = (%d, %d, %f)", _x, _y,
pixval);
1935
1936 if (*npixels == NULL)
1938 else
1940 if (*npixels == NULL) {
1941 rterror(
"rt_band_get_nearest_pixel: Could not allocate memory for nearest pixel(s)");
1942 return -1;
1943 }
1944
1945 npixel = &((*npixels)[
count - 1]);
1949
1950
1951 if (!inextent && !
band->hasnodata)
1953 else
1955 }
1956
1957 (*_min)++;
1958 }
1959 }
1960 }
1961
1962
1964 break;
1965 else if (d0 && count)
1966 break;
1967 }
1968 while (1);
1969
1971
1973}
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.
#define RASTER_DEBUG(level, msg)
#define RASTER_DEBUGF(level, msg,...)
double rt_pixtype_get_min_value(rt_pixtype pixtype)
Return minimum value possible for pixel type.
struct rt_pixel_t * rt_pixel
const char * rt_pixtype_name(rt_pixtype pixtype)
void * rtrealloc(void *mem, size_t size)
void rtdealloc(void *mem)
static double distance(double x1, double y1, double x2, double y2)
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.