293 {
294 uint32_t i;
295 uint32_t j;
296 uint32_t dim[2] = {0};
297 double **values = NULL;
298 int **nodatas = NULL;
299 int zero[2] = {0};
300 int _x;
301 int _y;
302
303 assert(npixel != NULL && count > 0);
304 assert(value != NULL);
305 assert(nodata != NULL);
306
307
308 dim[0] = distancex * 2 + 1;
309 dim[1] = distancey * 2 + 1;
311
312
313 if (mask != NULL) {
314 if (dim[0] != mask->
dimx || dim[1] != mask->
dimy) {
315 rterror(
"rt_pixel_set_array: mask dimensions %d x %d do not match given dims %d x %d", mask->
dimx, mask->
dimy, dim[0], dim[1]);
317 }
318
320 rterror(
"rt_pixel_set_array: Invalid mask");
322 }
323
324 }
325
326
327 values =
rtalloc(
sizeof(
double *) * dim[1]);
328 nodatas =
rtalloc(
sizeof(
int *) * dim[1]);
329
330 if (values == NULL || nodatas == NULL) {
331 rterror(
"rt_pixel_set_to_array: Could not allocate memory for 2D array");
333 }
334
335
336 for (i = 0; i < dim[1]; i++) {
337 values[i] =
rtalloc(
sizeof(
double) * dim[0]);
338 nodatas[i] =
rtalloc(
sizeof(
int) * dim[0]);
339
340 if (values[i] == NULL || nodatas[i] == NULL) {
341 rterror(
"rt_pixel_set_to_array: Could not allocate memory for dimension of 2D array");
342
343 if (values[i] == NULL) {
344 for (j = 0; j < i; j++) {
347 }
348 }
349 else {
350 for (j = 0; j <= i; j++) {
352 if (j < i)
354 }
355 }
356
359
361 }
362
363
364 memset(values[i], 0, sizeof(double) * dim[0]);
365
366
367 for (j = 0; j < dim[0]; j++)
368 nodatas[i][j] = 1;
369 }
370
371
372 zero[0] =
x - distancex;
373 zero[1] =
y - distancey;
374
375
376 for (i = 0; i <
count; i++) {
377 if (npixel[i].nodata)
378 continue;
379
380 _x = npixel[i].
x - zero[0];
381 _y = npixel[i].
y - zero[1];
382
383 RASTER_DEBUGF(4,
"absolute x,y: %d x %d", npixel[i].x, npixel[i].y);
385
386
387 if (mask == NULL) {
388 values[_y][_x] = npixel[i].
value;
389 nodatas[_y][_x] = 0;
390 }
391
392 else {
393
395
397 {
398 values[_y][_x] = 0;
399 nodatas[_y][_x] = 1;
400 }
401
402 else {
403 values[_y][_x] = npixel[i].
value;
404 nodatas[_y][_x] = 0;
405 }
406 }
407
408 else {
409
410 if(mask->
nodata[_y][_x] == 1) {
411 values[_y][_x] = 0;
412 nodatas[_y][_x] = 1;
413 }
414
415 else {
416 values[_y][_x] = npixel[i].
value * mask->
values[_y][_x];
417 nodatas[_y][_x] = 0;
418 }
419 }
420 }
421
422 RASTER_DEBUGF(4,
"(x, y, nodata, value) = (%d, %d, %d, %f)", _x, _y, nodatas[_y][_x], values[_y][_x]);
423 }
424
426 *nodata = &(*nodatas);
427 if (dimx != NULL)
428 *dimx = dim[0];
429 if (dimy != NULL)
430 *dimy = dim[1];
431
433}
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
void * rtalloc(size_t size)
Wrappers used for managing memory.
#define RASTER_DEBUGF(level, msg,...)
void rtdealloc(void *mem)