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

◆ _rti_raster_get_band_perimeter()

static rt_errorstate _rti_raster_get_band_perimeter ( rt_band  band,
uint16_t *  trim 
)
static

Definition at line 39 of file rt_geometry.c.

39 {
40 uint16_t width = 0;
41 uint16_t height = 0;
42 int x = 0;
43 int y = 0;
44 int offset = 0;
45 int done[4] = {0};
46 double value = 0;
47 int nodata = 0;
48
49 assert(band != NULL);
50 assert(band->raster != NULL);
51 assert(trim != NULL);
52
53 memset(trim, 0, sizeof(uint16_t) * 4);
54
55 width = rt_band_get_width(band);
56 height = rt_band_get_height(band);
57
58 /* top */
59 for (y = 0; y < height; y++) {
60 for (offset = 0; offset < 3; offset++) {
61 /* every third pixel */
62 for (x = offset; x < width; x += 3) {
63 if (rt_band_get_pixel(band, x, y, &value, &nodata) != ES_NONE) {
64 rterror("_rti_raster_get_band_perimeter: Could not get band pixel");
65 return ES_ERROR;
66 }
67
68 RASTER_DEBUGF(4, "top (x, y, value, nodata) = (%d, %d, %f, %d)", x, y, value, nodata);
69 if (!nodata) {
70 trim[0] = y;
71 done[0] = 1;
72 break;
73 }
74 }
75
76 if (done[0])
77 break;
78 }
79
80 if (done[0])
81 break;
82 }
83
84 /* right */
85 for (x = width - 1; x >= 0; x--) {
86 for (offset = 0; offset < 3; offset++) {
87 /* every third pixel */
88 for (y = offset; y < height; y += 3) {
89 if (rt_band_get_pixel(band, x, y, &value, &nodata) != ES_NONE) {
90 rterror("_rti_raster_get_band_perimeter: Could not get band pixel");
91 return ES_ERROR;
92 }
93
94 RASTER_DEBUGF(4, "right (x, y, value, nodata) = (%d, %d, %f, %d)", x, y, value, nodata);
95 if (!nodata) {
96 trim[1] = width - (x + 1);
97 done[1] = 1;
98 break;
99 }
100 }
101
102 if (done[1])
103 break;
104 }
105
106 if (done[1])
107 break;
108 }
109
110 /* bottom */
111 for (y = height - 1; y >= 0; y--) {
112 for (offset = 0; offset < 3; offset++) {
113 /* every third pixel */
114 for (x = offset; x < width; x += 3) {
115 if (rt_band_get_pixel(band, x, y, &value, &nodata) != ES_NONE) {
116 rterror("_rti_raster_get_band_perimeter: Could not get band pixel");
117 return ES_ERROR;
118 }
119
120 RASTER_DEBUGF(4, "bottom (x, y, value, nodata) = (%d, %d, %f, %d)", x, y, value, nodata);
121 if (!nodata) {
122 trim[2] = height - (y + 1);
123 done[2] = 1;
124 break;
125 }
126 }
127
128 if (done[2])
129 break;
130 }
131
132 if (done[2])
133 break;
134 }
135
136 /* left */
137 for (x = 0; x < width; x++) {
138 for (offset = 0; offset < 3; offset++) {
139 /* every third pixel */
140 for (y = offset; y < height; y += 3) {
141 if (rt_band_get_pixel(band, x, y, &value, &nodata) != ES_NONE) {
142 rterror("_rti_raster_get_band_perimeter: Could not get band pixel");
143 return ES_ERROR;
144 }
145
146 RASTER_DEBUGF(4, "left (x, , value, nodata) = (%d, %d, %f, %d)", x, y, value, nodata);
147 if (!nodata) {
148 trim[3] = x;
149 done[3] = 1;
150 break;
151 }
152 }
153
154 if (done[3])
155 break;
156 }
157
158 if (done[3])
159 break;
160 }
161
162 RASTER_DEBUGF(4, "trim = (%d, %d, %d, %d)",
163 trim[0], trim[1], trim[2], trim[3]);
164
165 return ES_NONE;
166}
void rterror(const char *fmt,...) __attribute__((format(printf
Wrappers used for reporting errors and info.
uint16_t rt_band_get_width(rt_band band)
Return width of this band.
Definition rt_band.c:791
#define RASTER_DEBUGF(level, msg,...)
Definition librtcore.h:306
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.
Definition rt_band.c:1527
@ ES_NONE
Definition librtcore.h:182
@ ES_ERROR
Definition librtcore.h:183
uint16_t rt_band_get_height(rt_band band)
Return height of this band.
Definition rt_band.c:800
int value
Definition genraster.py:62
static char * trim(const char *input)

References ES_ERROR, ES_NONE, RASTER_DEBUGF, rt_band_get_height(), rt_band_get_pixel(), rt_band_get_width(), rterror(), and trim().

Referenced by rt_raster_get_perimeter().

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