Get nearest pixel(s) with value (not NODATA) to specified pixel.
1686 {
1688 int extent[4] = {0};
1689 int max_extent[4] = {0};
1690 int d0 = 0;
1692 uint32_t _d[2] = {0};
1693 uint32_t i = 0;
1694 uint32_t j = 0;
1695 uint32_t k = 0;
1696 int _max = 0;
1697 int _x = 0;
1698 int _y = 0;
1699 int *_min = NULL;
1701 double minval = 0;
1703 int isnodata = 0;
1704
1705 int inextent = 0;
1706
1707 assert(NULL != band);
1708 assert(NULL != npixels);
1709
1711
1712
1715
1716
1718 d0 = 1;
1719
1722
1723
1724 if (
1725 exclude_nodata_value && (
1726 (x < 0 || x >
band->width) ||
1727 (y < 0 || y >
band->height)
1728 )
1729 ) {
1730
1731 if (d0) {
1732 if (x < 0)
1734 else if (x >
band->width)
1736
1737 if (y < 0)
1739 else if (y >
band->height)
1741
1743 }
1744
1745
1746
1747
1748 else if (
1751 ) {
1752 RASTER_DEBUG(4,
"No nearest pixels possible for provided pixel and distances");
1753 return 0;
1754 }
1755 }
1756
1757
1758 if (!
band->hasnodata)
1759 exclude_nodata_value =
FALSE;
1760
1761 else if (exclude_nodata_value &&
band->isnodata) {
1762 RASTER_DEBUG(4,
"No nearest pixels possible as band is NODATA and excluding NODATA values");
1763 return 0;
1764 }
1765
1766
1767 if (d0) {
1768 int a, b;
1769
1770
1771 a = abs(x);
1772 b = abs(x -
band->width);
1773
1774 if (a > b)
1776 else
1778
1779
1780 a = abs(y);
1781 b = abs(y -
band->height);
1782 if (a > b)
1784 else
1786
1788 }
1789
1790
1794
1795
1797 *npixels = NULL;
1798
1799
1805 max_extent[0], max_extent[1], max_extent[2], max_extent[3]);
1806
1807 _d[0] = 0;
1808 _d[1] = 0;
1809 do {
1810 _d[0]++;
1811 _d[1]++;
1812
1813 extent[0] =
x - (int)_d[0];
1814 extent[1] =
y - (int)_d[1];
1815 extent[2] =
x + (int)_d[0];
1816 extent[3] =
y + (int)_d[1];
1817
1818 RASTER_DEBUGF(4,
"Processing distances: %d x %d", _d[0], _d[1]);
1820 extent[0], extent[1], extent[2], extent[3]);
1821
1822 for (i = 0; i < 2; i++) {
1823
1824
1825 if (i < 1)
1826 _max = extent[2] - extent[0] + 1;
1827
1828 else
1829 _max = extent[3] - extent[1] + 1;
1830 _max = abs(_max);
1831
1832 for (j = 0; j < 2; j++) {
1833
1834 if (i < 1) {
1835 _x = extent[0];
1836 _min = &_x;
1837
1838
1839 if (j < 1)
1840 _y = extent[1];
1841
1842 else
1843 _y = extent[3];
1844 }
1845
1846 else {
1847 _y = extent[1] + 1;
1848 _min = &_y;
1849
1850
1851 if (j < 1) {
1852 _x = extent[0];
1853 _max -= 2;
1854 }
1855
1856 else
1857 _x = extent[2];
1858 }
1859
1861 for (k = 0; k < (uint32_t) _max; k++) {
1862
1863 if (
1864 _x < max_extent[0] || _x > max_extent[2] ||
1865 _y < max_extent[1] || _y > max_extent[3]
1866 ) {
1867 (*_min)++;
1868 continue;
1869 }
1870
1871
1872 if (
1873 (_x < 0 || _x >=
band->width) ||
1874 (_y < 0 || _y >=
band->height)
1875 ) {
1876
1877 if (!
band->hasnodata)
1879
1880 else
1882 RASTER_DEBUGF(4,
"NODATA pixel outside band extent: (x, y, val) = (%d, %d, %f)", _x, _y,
pixval);
1883 inextent = 0;
1884 isnodata = 1;
1885 }
1886 else {
1888 band,
1889 _x, _y,
1891 &isnodata
1893 rterror(
"rt_band_get_nearest_pixel: Could not get pixel value");
1895 return -1;
1896 }
1898 inextent = 1;
1899 }
1900
1901
1902 if (!exclude_nodata_value || (exclude_nodata_value && !isnodata)) {
1903
1904 RASTER_DEBUGF(4,
"Adding pixel to set of nearest pixels: (x, y, val) = (%d, %d, %f)", _x, _y,
pixval);
1906
1907 if (*npixels == NULL)
1909 else
1911 if (*npixels == NULL) {
1912 rterror(
"rt_band_get_nearest_pixel: Could not allocate memory for nearest pixel(s)");
1913 return -1;
1914 }
1915
1916 npixel = &((*npixels)[
count - 1]);
1920
1921
1922 if (!inextent && !
band->hasnodata)
1924 else
1926 }
1927
1928 (*_min)++;
1929 }
1930 }
1931 }
1932
1933
1935 break;
1936 else if (d0 && count)
1937 break;
1938 }
1939 while (1);
1940
1942
1944}
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.