]> granicus.if.org Git - postgis/commitdiff
Addition of mask parameter for ST_MapAlgebra. Merge of pull request 17 from github...
authorBborie Park <bkpark at ucdavis.edu>
Tue, 7 Jan 2014 04:16:00 +0000 (04:16 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Tue, 7 Jan 2014 04:16:00 +0000 (04:16 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@12179 b70326c6-7e19-0410-871a-916f4a2858ee

13 files changed:
NEWS
install-sh
raster/rt_core/librtcore.h
raster/rt_core/rt_mapalgebra.c
raster/rt_core/rt_pixel.c
raster/rt_pg/rtpg_mapalgebra.c
raster/rt_pg/rtpg_pixel.c
raster/rt_pg/rtpostgis.sql.in
raster/test/cunit/cu_band_misc.c
raster/test/cunit/cu_mapalgebra.c
raster/test/regress/Makefile.in
raster/test/regress/rt_mapalgebra_mask.sql [new file with mode: 0644]
raster/test/regress/rt_mapalgebra_mask_expected [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index ed02cf80833e4d6bb087f4d11ff9c42612bcbc7e..f846f7eb350746796100f8be638192b66cebd88f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,11 +14,12 @@ PostGIS 2.2.0
 
  * New Features *
 
-  - #2430, ST_ForceCurve
   - Added missing variants of ST_TPI(), ST_TRI() and ST_Roughness()
   - #1678, Added GUC postgis.gdal.datapath to specify GDAL config
     variable GDAL_DATA
+  - #2341, New mask parameter for ST_MapAlgebra
   - #2397, read encoding info automatically in shapefile loader
+  - #2430, ST_ForceCurve
   - #2565, ST_SummaryStatsAgg()
   - #2567, ST_CountAgg()
 
index 6781b987bdbcbc23efe6bbe1654a1e3637b9af07..a9244eb0786534553fdd9eb0050bb4b172bad0a3 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2011-01-19.21; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -156,6 +156,10 @@ while test $# -ne 0; do
     -s) stripcmd=$stripprog;;
 
     -t) dst_arg=$2
+       # Protect names problematic for `test' and other utilities.
+       case $dst_arg in
+         -* | [=\(\)!]) dst_arg=./$dst_arg;;
+       esac
        shift;;
 
     -T) no_target_directory=true;;
@@ -186,6 +190,10 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
     fi
     shift # arg
     dst_arg=$arg
+    # Protect names problematic for `test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
   done
 fi
 
@@ -200,7 +208,11 @@ if test $# -eq 0; then
 fi
 
 if test -z "$dir_arg"; then
-  trap '(exit $?); exit' 1 2 13 15
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
 
   # Set umask so as not to create temps with too-generous modes.
   # However, 'strip' requires both read and write access to temps.
@@ -228,9 +240,9 @@ fi
 
 for src
 do
-  # Protect names starting with `-'.
+  # Protect names problematic for `test' and other utilities.
   case $src in
-    -*) src=./$src;;
+    -* | [=\(\)!]) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
@@ -252,12 +264,7 @@ do
       echo "$0: no destination specified." >&2
       exit 1
     fi
-
     dst=$dst_arg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst;;
-    esac
 
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
@@ -385,7 +392,7 @@ do
 
       case $dstdir in
        /*) prefix='/';;
-       -*) prefix='./';;
+       [-=\(\)!]*) prefix='./';;
        *)  prefix='';;
       esac
 
@@ -403,7 +410,7 @@ do
 
       for d
       do
-       test -z "$d" && continue
+       test X"$d" = X && continue
 
        prefix=$prefix$d
        if test -d "$prefix"; then
index 8372f762342de1afa4d9afe8693b310fe8da6640..f1c1b96cc764d9e2c66fd32e94ac77bcd7a9374d 100644 (file)
@@ -11,6 +11,7 @@
  * Copyright (C) 2009-2011 Pierre Racine <pierre.racine@sbf.ulaval.ca>
  * Copyright (C) 2009-2011 Mateusz Loskot <mateusz@loskot.net>
  * Copyright (C) 2008-2009 Sandro Santilli <strk@keybit.net>
+ * Copyright (C) 2013 Nathaneil Hunter Clay <clay.nathaniel@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 typedef struct rt_raster_t* rt_raster;
 typedef struct rt_band_t* rt_band;
 typedef struct rt_pixel_t* rt_pixel;
+typedef struct rt_mask_t* rt_mask;
 typedef struct rt_geomval_t* rt_geomval;
 typedef struct rt_bandstats_t* rt_bandstats;
 typedef struct rt_histogram_t* rt_histogram;
@@ -384,6 +386,7 @@ rt_errorstate rt_pixtype_compare_clamped_values(
  *
  * @param npixel : array of rt_pixel objects
  * @param count : number of elements in npixel
+ * @param mask : mask to be respected when returning array
  * @param x : the column of the center pixel (0-based)
  * @param y : the line of the center pixel (0-based)
  * @param distancex : the number of pixels around the specified pixel
@@ -398,7 +401,8 @@ rt_errorstate rt_pixtype_compare_clamped_values(
  * @return ES_NONE on success, ES_ERROR on error
  */
 rt_errorstate rt_pixel_set_to_array(
-       rt_pixel npixel, int count,
+       rt_pixel npixel,int count,
+       rt_mask mask,
        int x, int y,
        uint16_t distancex, uint16_t distancey,
        double ***value,
@@ -1959,6 +1963,7 @@ rt_raster_iterator(
        rt_pixtype pixtype,
        uint8_t hasnodata, double nodataval,
        uint16_t distancex, uint16_t distancey,
+       rt_mask mask,
        void *userarg,
        int (*callback)(
                rt_iterator_arg arg,
@@ -2279,6 +2284,14 @@ struct rt_pixel_t {
        LWGEOM *geom;
 };
 
+struct rt_mask_t {
+  uint16_t dimx;
+  uint16_t dimy;
+  double **values;
+  int **nodata;
+  int weighted; /* 0 if not weighted values 1 if weighted values */
+};
+
 /* polygon as LWPOLY with associated value */
 struct rt_geomval_t {
        LWPOLY *geom;
index e2ab63e9d3ed2894dd1be17db33f09eca98324f4..2f4ef61f8a8ae69140bdb5e351379710d89cd535 100644 (file)
@@ -789,6 +789,7 @@ _rti_iterator_arg_callback_clean(_rti_iterator_arg _param) {
  * along the X axis
  * @param distancey : the number of pixels around the specified pixel
  * along the Y axis
+ * @param mask : the object of mask
  * @param userarg : pointer to any argument that is passed as-is to callback.
  * @param callback : callback function for actual processing of pixel values.
  * @param *rtnraster : return one band raster from iterator process
@@ -815,6 +816,7 @@ rt_raster_iterator(
        rt_pixtype pixtype,
        uint8_t hasnodata, double nodataval,
        uint16_t distancex, uint16_t distancey,
+       rt_mask mask,
        void *userarg,
        int (*callback)(
                rt_iterator_arg arg,
@@ -1347,7 +1349,7 @@ rt_raster_iterator(
 
                                /* convert set of rt_pixel to 2D array */
                                status = rt_pixel_set_to_array(
-                                       npixels, status,
+                                       npixels, status,mask,
                                        x, y,
                                        distancex, distancey,
                                        &(_param->arg->values[i]),
index a380d9911d2b9edb6f18d8b64e923506600c5bdd..85018f643a93b8d6b9c33ae3fc4d78f38bc47849 100644 (file)
@@ -11,6 +11,7 @@
  * Copyright (C) 2009-2011 Pierre Racine <pierre.racine@sbf.ulaval.ca>
  * Copyright (C) 2009-2011 Mateusz Loskot <mateusz@loskot.net>
  * Copyright (C) 2008-2009 Sandro Santilli <strk@keybit.net>
+ * Copyright (C) 2013  Nathaniel Hunter Clay <clay.nathaniel@gmail.com>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -269,6 +270,7 @@ rt_errorstate rt_pixtype_compare_clamped_values(
  *
  * @param npixel : array of rt_pixel objects
  * @param count : number of elements in npixel
+ * @param mask : mask to be respected when retruning array
  * @param x : the column of the center pixel (0-based)
  * @param y : the line of the center pixel (0-based)
  * @param distancex : the number of pixels around the specified pixel
@@ -283,7 +285,7 @@ rt_errorstate rt_pixtype_compare_clamped_values(
  * @return ES_NONE on success, ES_ERROR on error
  */
 rt_errorstate rt_pixel_set_to_array(
-       rt_pixel npixel, int count,
+       rt_pixel npixel, int count, rt_mask mask,
        int x, int y,
        uint16_t distancex, uint16_t distancey,
        double ***value,
@@ -308,6 +310,19 @@ rt_errorstate rt_pixel_set_to_array(
        dim[1] = distancey * 2 + 1;
        RASTER_DEBUGF(4, "dimensions = %d x %d", dim[0], dim[1]);
 
+       /* make sure that the dimx and dimy match mask */
+       if( mask != NULL) {
+         if ( dim[0] != mask-> dimx || dim[1] != mask->dimy ){
+           rterror("rt_pixel_set_array: mask dimentions do not match given dims");
+           return ES_ERROR;
+         }
+         
+         if ( mask->values == NULL || mask->nodata == NULL ) {
+           rterror("rt_pixel_set_array: was not properly setup");
+           return ES_ERROR;
+         }
+
+       }
        /* establish 2D arrays (Y axis) */
        values = rtalloc(sizeof(double *) * dim[1]);
        nodatas = rtalloc(sizeof(int *) * dim[1]);
@@ -368,8 +383,28 @@ rt_errorstate rt_pixel_set_to_array(
                RASTER_DEBUGF(4, "absolute x,y: %d x %d", npixel[i].x, npixel[i].y);
                RASTER_DEBUGF(4, "relative x,y: %d x %d", _x, _y);
 
-               values[_y][_x] = npixel[i].value;
-               nodatas[_y][_x] = 0;
+               if ( mask == NULL ) {
+                 values[_y][_x] = npixel[i].value;
+                 nodatas[_y][_x] = 0;
+               }else{ 
+                 if( mask->weighted == 0 ){
+                   if( FLT_EQ( mask->values[_y][_x],0) || mask->nodata[_y][_x] == 1 ){
+                     values[_y][_x] = 0;
+                     nodatas[_y][_x] = 1;
+                   }else{
+                     values[_y][_x] = npixel[i].value;
+                     nodatas[_y][_x] = 0;
+                   }
+                 }else{
+                   if( mask->nodata[_y][_x] == 1 ){
+                     values[_y][_x] = 0;
+                     nodatas[_y][_x] = 1;
+                   }else{
+                     values[_y][_x] = npixel[i].value * mask->values[_y][_x];
+                     nodatas[_y][_x] = 0;
+                   }
+                 }
+               }
 
                RASTER_DEBUGF(4, "(x, y, nodata, value) = (%d, %d, %d, %f)", _x, _y, nodatas[_y][_x], values[_y][_x]);
        }
index 8b126d744384e999c5caa36bc03e4366edb71bf8..ff20754c07618758486ecc654aa5b55047ffd85c 100644 (file)
@@ -11,6 +11,7 @@
  * Copyright (C) 2009-2011 Pierre Racine <pierre.racine@sbf.ulaval.ca>
  * Copyright (C) 2009-2011 Mateusz Loskot <mateusz@loskot.net>
  * Copyright (C) 2008-2009 Sandro Santilli <strk@keybit.net>
+ * Copyright (C) 2013 Nathaniel Hunter Clay <clay.nathaniel@gmail.com>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -102,6 +103,7 @@ struct rtpg_nmapalgebra_arg_t {
        rt_extenttype extenttype; /* ouput raster's extent type */
        rt_pgraster *pgcextent; /* custom extent of type rt_pgraster */
        rt_raster cextent; /* custom extent of type rt_raster */
+        rt_mask mask; /* mask for the nmapalgebra operation */
 
        rtpg_nmapalgebra_callback_arg   callback;
 };
@@ -133,6 +135,7 @@ static rtpg_nmapalgebra_arg rtpg_nmapalgebra_arg_init() {
        arg->extenttype = ET_INTERSECTION;
        arg->pgcextent = NULL;
        arg->cextent = NULL;
+       arg->mask = NULL;
 
        arg->callback.ufc_noid = InvalidOid;
        arg->callback.ufc_nullcount = 0;
@@ -160,6 +163,8 @@ static void rtpg_nmapalgebra_arg_destroy(rtpg_nmapalgebra_arg arg) {
 
        if (arg->cextent != NULL)
                rt_raster_destroy(arg->cextent);
+       if( arg->mask != NULL )
+         pfree(arg->mask);
 
        pfree(arg);
 }
@@ -209,13 +214,15 @@ static int rtpg_nmapalgebra_rastbandarg_process(rtpg_nmapalgebra_arg arg, ArrayT
        arg->ownsdata = palloc(sizeof(uint8_t) * arg->numraster);
        arg->nband = palloc(sizeof(int) * arg->numraster);
        arg->hasband = palloc(sizeof(uint8_t) * arg->numraster);
+       arg->mask = palloc(sizeof(struct rt_mask_t));
        if (
                arg->pgraster == NULL ||
                arg->raster == NULL ||
                arg->isempty == NULL ||
                arg->ownsdata == NULL ||
                arg->nband == NULL ||
-               arg->hasband == NULL
+               arg->hasband == NULL ||
+               arg->mask == NULL
        ) {
                elog(ERROR, "rtpg_nmapalgebra_rastbandarg_process: Could not allocate memory for processing rastbandarg");
                return 0;
@@ -499,6 +506,19 @@ Datum RASTER_nMapAlgebra(PG_FUNCTION_ARGS)
 {
        rtpg_nmapalgebra_arg arg = NULL;
        rt_iterator itrset;
+       ArrayType *maskArray;
+       Oid etype;
+       Datum *maskElements;
+       bool *maskNulls;
+       int16 typlen;
+       bool typbyval;
+       char typalign;
+       int ndims = 0;
+       int num;
+       int *maskDims;
+       int x,y;
+       
+
        int i = 0;
        int noerr = 0;
        int allnull = 0;
@@ -551,12 +571,17 @@ Datum RASTER_nMapAlgebra(PG_FUNCTION_ARGS)
        }
 
        /* distancex (3) */
-       if (!PG_ARGISNULL(3))
+       if (!PG_ARGISNULL(3)){
                arg->distance[0] = PG_GETARG_INT32(3);
-       /* distancey (4) */
-       if (!PG_ARGISNULL(4))
+       }else{
+               arg->distance[0] = 0;
+       }
+        /* distancey (4) */
+       if (!PG_ARGISNULL(4)){
                arg->distance[1] = PG_GETARG_INT32(4);
-
+       }else{
+               arg->distance[1] = 0;
+       }
        if (arg->distance[0] < 0 || arg->distance[1] < 0) {
                rtpg_nmapalgebra_arg_destroy(arg);
                elog(ERROR, "RASTER_nMapAlgebra: Distance for X and Y axis must be greater than or equal to zero");
@@ -607,6 +632,111 @@ Datum RASTER_nMapAlgebra(PG_FUNCTION_ARGS)
        }
 
        noerr = 1;
+       
+       /* mask (7) */
+
+       if( PG_ARGISNULL(7) ){
+         pfree(arg->mask);
+         arg->mask = NULL;
+       }else{
+       maskArray = PG_GETARG_ARRAYTYPE_P(7);
+       etype = ARR_ELEMTYPE(maskArray);
+       get_typlenbyvalalign(etype,&typlen,&typbyval,&typalign);
+       
+       switch(etype){
+             case FLOAT4OID:
+             case FLOAT8OID:
+               break;
+             default:
+               rtpg_nmapalgebra_arg_destroy(arg);
+               elog(ERROR,"RASTER_nMapAlgerbra: Mask data type must be FLOAT8 or FLOAT4.");
+               PG_RETURN_NULL();
+       }
+
+       ndims = ARR_NDIM(maskArray);
+       
+       if( ndims != 2 ){ 
+         elog(ERROR, "RASTER_nMapAlgerbra: Mask Must be a 2D array.");
+         rtpg_nmapalgebra_arg_destroy(arg);
+         PG_RETURN_NULL();
+       }
+       
+       maskDims = ARR_DIMS(maskArray);
+
+
+       if ( maskDims[0] % 2 == 0 || maskDims[1] % 2 == 0 ){
+         elog(ERROR,"RASTER_nMapAlgerbra: Mask dimenstions must be odd.");
+         rtpg_nmapalgebra_arg_destroy(arg);
+         PG_RETURN_NULL();
+       } 
+       
+       deconstruct_array(
+                         maskArray,
+                         etype,
+                         typlen, typbyval,typalign,
+                         &maskElements,&maskNulls,&num
+                         );
+
+       if (num < 1 || num != (maskDims[0] * maskDims[1])) {
+                if (num) {
+                        pfree(maskElements);
+                        pfree(maskNulls);
+                }
+               elog(ERROR, "RASTER_nMapAlgerbra: Could not deconstruct new values array.");
+                rtpg_nmapalgebra_arg_destroy(arg);
+               PG_RETURN_NULL();
+       }
+
+
+       /* allocate mem for mask array */
+       arg->mask->values = palloc(sizeof(double*)* maskDims[0]);
+       arg->mask->nodata =  palloc(sizeof(int*)*maskDims[0]);
+       for(i = 0; i < maskDims[0]; i++){
+         arg->mask->values[i] = (double*) palloc(sizeof(double) * maskDims[1]);
+         arg->mask->nodata[i] = (int*) palloc(sizeof(int) * maskDims[1]);
+       }
+       /* place values in to mask */
+       i = 0;
+       for( y = 0; y < maskDims[0]; y++ ){
+         for( x = 0; x < maskDims[1]; x++){
+           if(maskNulls[i]){
+             arg->mask->values[y][x] = 0;
+             arg->mask->nodata[y][x] = 1;
+           }else{
+             switch(etype){
+             case FLOAT4OID:
+               arg->mask->values[y][x] = (double) DatumGetFloat4(maskElements[i]);
+               arg->mask->nodata[y][x] = 0;
+               break;
+             case FLOAT8OID:
+               arg->mask->values[y][x] = (double) DatumGetFloat8(maskElements[i]);
+               arg->mask->nodata[y][x] = 0;
+             }
+           }
+           i++;
+         }
+       }
+       /*set mask dimenstions*/ 
+       arg->mask->dimx = maskDims[0];
+       arg->mask->dimy = maskDims[1];
+       if ( maskDims[0] == 1 && maskDims[1] == 1){
+         arg->distance[0] = 0;
+         arg->distance[1] = 0;
+       }else{
+         arg->distance[0] = maskDims[0] % 2;
+         arg->distance[1] = maskDims[1] % 2;
+       }
+       }/*end if else argisnull*/
+
+       /* (8) weighted boolean */
+       if (PG_ARGISNULL(8) || !PG_GETARG_BOOL(8) ){
+         if ( arg->mask != NULL ) 
+           arg->mask->weighted = 0;
+       }else{
+         if(arg->mask !=NULL )
+           arg->mask->weighted = 1;
+       }
+
        /* all rasters are empty, return empty raster */
        if (allempty == arg->numraster) {
                elog(NOTICE, "All input rasters are empty. Returning empty raster");
@@ -678,8 +808,8 @@ Datum RASTER_nMapAlgebra(PG_FUNCTION_ARGS)
                memset(arg->callback.ufc_info.argnull, FALSE, sizeof(bool) * arg->callback.ufl_info.fn_nargs);
 
                /* userargs (7) */
-               if (!PG_ARGISNULL(7))
-                       arg->callback.ufc_info.arg[2] = PG_GETARG_DATUM(7);
+               if (!PG_ARGISNULL(9))
+                       arg->callback.ufc_info.arg[2] = PG_GETARG_DATUM(9);
                else {
                        arg->callback.ufc_info.arg[2] = (Datum) NULL;
                        arg->callback.ufc_info.argnull[2] = TRUE;
@@ -753,6 +883,7 @@ Datum RASTER_nMapAlgebra(PG_FUNCTION_ARGS)
                arg->pixtype,
                arg->hasnodata, arg->nodataval,
                arg->distance[0], arg->distance[1],
+               arg->mask,
                &(arg->callback),
                rtpg_nmapalgebra_callback,
                &raster
@@ -1441,6 +1572,7 @@ Datum RASTER_nMapAlgebraExpr(PG_FUNCTION_ARGS)
                arg->bandarg->pixtype,
                arg->bandarg->hasnodata, arg->bandarg->nodataval,
                0, 0,
+               NULL,
                &(arg->callback),
                rtpg_nmapalgebraexpr_callback,
                &raster
@@ -2424,6 +2556,7 @@ Datum RASTER_union_transfn(PG_FUNCTION_ARGS)
                                        pixtype,
                                        hasnodata, nodataval,
                                        0, 0,
+                                       NULL,
                                        &utype,
                                        rtpg_union_callback,
                                        &_raster
@@ -2516,6 +2649,7 @@ Datum RASTER_union_transfn(PG_FUNCTION_ARGS)
                                        pixtype,
                                        hasnodata, nodataval,
                                        0, 0,
+                                       NULL,
                                        &utype,
                                        rtpg_union_callback,
                                        &_raster
@@ -2630,6 +2764,7 @@ Datum RASTER_union_finalfn(PG_FUNCTION_ARGS)
                                        hasnodata, nodataval,
                                        0, 0,
                                        NULL,
+                                       NULL,
                                        rtpg_union_mean_callback,
                                        &_raster
                                );
@@ -2642,6 +2777,7 @@ Datum RASTER_union_finalfn(PG_FUNCTION_ARGS)
                                        hasnodata, nodataval,
                                        0, 0,
                                        NULL,
+                                       NULL,
                                        rtpg_union_range_callback,
                                        &_raster
                                );
@@ -3189,6 +3325,7 @@ Datum RASTER_clip(PG_FUNCTION_ARGS)
                        hasnodata, nodataval,
                        0, 0,
                        NULL,
+                       NULL,
                        rtpg_clip_callback,
                        &_raster
                );
index 879233898b44fa0b1bf7d30a9644ed523b99bacc..af8a90bfc39759d287be703a84c1c8203a228ad4 100644 (file)
@@ -1541,6 +1541,7 @@ Datum RASTER_setPixelValuesGeomval(PG_FUNCTION_ARGS)
                        pixtype,
                        hasnodata, nodataval,
                        0, 0,
+                       NULL,
                        arg,
                        rtpg_setvalues_geomval_callback,
                        &_raster
@@ -2223,7 +2224,7 @@ Datum RASTER_neighborhood(PG_FUNCTION_ARGS)
        /* convert set of rt_pixel to 2D array */
        /* dim is passed with element 0 being Y-axis and element 1 being X-axis */
        count = rt_pixel_set_to_array(
-               npixels, count,
+               npixels, count, NULL,
                _x, _y,
                distance[0], distance[1],
                &value2D,
index d50ab37e32ade2c4a368e54a32c65f4a5042ab62..b4e0b4e32bac9a58c2f25c54d3d850600f08d913 100644 (file)
@@ -2976,12 +2976,15 @@ CREATE OR REPLACE FUNCTION _st_mapalgebra(
        pixeltype text DEFAULT NULL,
        distancex integer DEFAULT 0, distancey integer DEFAULT 0,
        extenttype text DEFAULT 'INTERSECTION', customextent raster DEFAULT NULL,
+       mask double precision[][] DEFAULT NULL, weighted boolean DEFAULT NULL,
        VARIADIC userargs text[] DEFAULT NULL
 )
        RETURNS raster
        AS 'MODULE_PATHNAME', 'RASTER_nMapAlgebra'
        LANGUAGE 'c' STABLE;
 
+
+
 CREATE OR REPLACE FUNCTION st_mapalgebra(
        rastbandargset rastbandarg[],
        callbackfunc regprocedure,
@@ -2991,7 +2994,7 @@ CREATE OR REPLACE FUNCTION st_mapalgebra(
        VARIADIC userargs text[] DEFAULT NULL
 )
        RETURNS raster
-       AS $$ SELECT _ST_MapAlgebra($1, $2, $3, $6, $7, $4, $5, VARIADIC $8) $$
+       AS $$ SELECT _ST_MapAlgebra($1, $2, $3, $6, $7, $4, $5,NULL::double precision [],NULL::boolean, VARIADIC $8) $$
        LANGUAGE 'sql' STABLE;
 
 CREATE OR REPLACE FUNCTION st_mapalgebra(
@@ -3026,7 +3029,7 @@ CREATE OR REPLACE FUNCTION st_mapalgebra(
                        RETURN NULL;
                END IF;
 
-               RETURN _ST_MapAlgebra(argset, $3, $4, $7, $8, $5, $6, VARIADIC $9);
+               RETURN _ST_MapAlgebra(argset, $3, $4, $7, $8, $5, $6,NULL::double precision [],NULL::boolean, VARIADIC $9);
        END;
        $$ LANGUAGE 'plpgsql' STABLE;
 
@@ -3039,7 +3042,7 @@ CREATE OR REPLACE FUNCTION st_mapalgebra(
        VARIADIC userargs text[] DEFAULT NULL
 )
        RETURNS raster
-       AS $$ SELECT _ST_MapAlgebra(ARRAY[ROW($1, $2)]::rastbandarg[], $3, $4, $7, $8, $5, $6, VARIADIC $9) $$
+       AS $$ SELECT _ST_MapAlgebra(ARRAY[ROW($1, $2)]::rastbandarg[], $3, $4, $7, $8, $5, $6,NULL::double precision [],NULL::boolean, VARIADIC $9) $$
        LANGUAGE 'sql' STABLE;
 
 CREATE OR REPLACE FUNCTION st_mapalgebra(
@@ -3052,9 +3055,22 @@ CREATE OR REPLACE FUNCTION st_mapalgebra(
        VARIADIC userargs text[] DEFAULT NULL
 )
        RETURNS raster
-       AS $$ SELECT _ST_MapAlgebra(ARRAY[ROW($1, $2), ROW($3, $4)]::rastbandarg[], $5, $6, $9, $10, $7, $8, VARIADIC $11) $$
+       AS $$ SELECT _ST_MapAlgebra(ARRAY[ROW($1, $2), ROW($3, $4)]::rastbandarg[], $5, $6, $9, $10, $7, $8,NULL::double precision [],NULL::boolean, VARIADIC $11) $$
        LANGUAGE 'sql' STABLE;
 
+CREATE OR REPLACE FUNCTION st_mapalgebra(
+       rast raster, nband int,
+       callbackfunc regprocedure,
+       mask double precision [][], weighted boolean,
+       pixeltype text DEFAULT NULL,
+       extenttype text DEFAULT 'INTERSECTION', customextent raster DEFAULT NULL,
+       VARIADIC userargs text[] DEFAULT NULL
+)
+       RETURNS raster
+       AS $$
+       select _st_mapalgebra(ARRAY[ROW($1,$2)]::rastbandarg[],$3,$6,NULL::integer,NULL::integer,$7,$8,$4,$5,VARIADIC $9)
+       $$ LANGUAGE 'sql' STABLE;
+
 -----------------------------------------------------------------------
 -- 1 or 2-Raster ST_MapAlgebra with expressions
 -----------------------------------------------------------------------
index 8d06b5c31ec29640b761df337dbbfcf3a40603d9..908ebebced4e6eeefa08126842a3fc030b04b0ff 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "CUnit/Basic.h"
 #include "cu_tester.h"
+#include <math.h>
 
 static void test_band_get_nearest_pixel() {
        rt_raster rast;
@@ -175,7 +176,7 @@ static void test_band_get_nearest_pixel() {
        CU_ASSERT_EQUAL(rtn, 2);
 
        rtn = rt_pixel_set_to_array(
-               npixels, rtn,
+               npixels, rtn, NULL,
                -1, 1, 
                1, 1,
                &value,
@@ -195,7 +196,6 @@ static void test_band_get_nearest_pixel() {
        rtdealloc(nodata);
        rtdealloc(value);
 
-
        /* -2,2 distance 1 */
        rtn = rt_band_get_nearest_pixel(
                band,
@@ -367,10 +367,222 @@ static void test_band_get_pixel_of_value() {
        cu_free_raster(rast);
 }
 
+static void test_pixel_set_to_array(){
+       rt_raster rast;
+       rt_band band;
+       rt_mask mask = NULL;
+       uint32_t x, y;
+       int rtn;
+       const int maxX = 10;
+       const int maxY = 10;
+       int maskX = 3;
+       int maskY = 3;
+       rt_pixel npixels = NULL;
+       int i;
+       double **value;
+       double val;
+       int nod;
+       int **nodata;
+       int dimx;
+       int dimy;
+
+       rast = rt_raster_new(maxX, maxY);
+       CU_ASSERT(rast != NULL);
+
+       band = cu_add_band(rast, PT_32BF, 1, 0);
+       CU_ASSERT(band != NULL);
+
+       for (x = 0; x < maxX; x++) {
+               for (y = 0; y < maxY; y++) {
+                       rtn = rt_band_set_pixel(band, x, y, 1, NULL);
+               }
+       }
+
+
+       rtn = rt_band_get_pixel(band,4,4,&val,&nod);
+       CU_ASSERT_EQUAL(nod,0);
+       CU_ASSERT_DOUBLE_EQUAL(val,1,.01);
+
+       /* set up mask */
+       
+       mask = (rt_mask) rtalloc(sizeof(struct rt_mask_t) );
+       CU_ASSERT(mask != NULL);
+       mask->values = rtalloc(sizeof(double*)*maskY);
+       mask->nodata = rtalloc(sizeof(int*)*maskY);
+       
+       for( i = 0; i < maskY;  i++) {
+         mask->values[i] = rtalloc(sizeof(double) *maskX);
+         mask->nodata[i] = rtalloc(sizeof(int) *maskX);
+       }
+
+       CU_ASSERT(mask->values != NULL);
+       CU_ASSERT(mask->nodata != NULL);
+
+       /* set mask to nodata */
+
+       for(y = 0; y < maskY; y++) {
+         for(x = 0; x < maskX; x++){
+           mask->values[y][x]= 0;
+           mask->nodata[y][x]= 1;
+         }
+       }
+
+       mask->dimx = maskX;
+       mask->dimy = maskY;
+       mask->weighted = 0;
+
+       rtn = rt_band_get_nearest_pixel(
+               band,
+               4,4,
+               1, 1,
+               1,
+               &npixels
+       );
+       
+       CU_ASSERT_EQUAL(rtn,8);
+       
+               rtn = rt_pixel_set_to_array(
+               npixels, rtn, mask,
+               4,4, 
+               1, 1,
+               &value,
+               &nodata,
+               &dimx, &dimy
+       );
+                                 
+       
+       rtdealloc(npixels);
+       CU_ASSERT_EQUAL(rtn, ES_NONE);
+       CU_ASSERT_EQUAL(dimx, 3);
+       CU_ASSERT_EQUAL(dimy, 3);
+       CU_ASSERT_EQUAL(nodata[1][1],1);
+
+       for (x = 0; x < dimx; x++) {
+               rtdealloc(nodata[x]);
+               rtdealloc(value[x]);
+       }
+
+       rtdealloc(nodata);
+       rtdealloc(value);
+       
+       /* set mask to 1 */
+
+       for(y = 0; y < maskY; y++) {
+         for(x = 0; x < maskX; x++){
+           mask->values[y][x]= 1;
+           mask->nodata[y][x]= 0;
+         }
+       }
+
+       mask->dimx = maskX;
+       mask->dimy = maskY;
+       mask->weighted = 0;
+       
+
+       rtn = rt_band_get_nearest_pixel(
+               band,
+               4,4,
+               1, 1,
+               1,
+               &npixels
+       );
+       
+       CU_ASSERT_EQUAL(rtn,8);
+       
+               rtn = rt_pixel_set_to_array(
+               npixels, rtn, mask,
+               4,4, 
+               1, 1,
+               &value,
+               &nodata,
+               &dimx, &dimy
+       );
+                                 
+       
+       rtdealloc(npixels);
+       CU_ASSERT_EQUAL(rtn, ES_NONE);
+       CU_ASSERT_EQUAL(dimx, 3);
+       CU_ASSERT_EQUAL(dimy, 3);
+       CU_ASSERT_NOT_EQUAL(nodata[0][0],1);
+       CU_ASSERT_DOUBLE_EQUAL(value[0][0],1,.01);
+
+       for (x = 0; x < dimx; x++) {
+               rtdealloc(nodata[x]);
+               rtdealloc(value[x]);
+       }
+
+       rtdealloc(nodata);
+       rtdealloc(value);
+
+       /* set mask to 0.5 */
+
+       for(y = 0; y < maskY; y++) {
+         for(x = 0; x < maskX; x++){
+           mask->values[y][x]= 0.5;
+           mask->nodata[y][x]= 0;
+         }
+       }
+
+       mask->dimx = maskX;
+       mask->dimy = maskY;
+       mask->weighted = 1;
+
+       rtn = rt_band_get_nearest_pixel(
+               band,
+               4,4,
+               1, 1,
+               1,
+               &npixels
+       );
+       
+       CU_ASSERT_EQUAL(rtn,8);
+       
+               rtn = rt_pixel_set_to_array(
+               npixels, rtn, mask,
+               4,4, 
+               1, 1,
+               &value,
+               &nodata,
+               &dimx, &dimy
+       );
+                                 
+       
+       rtdealloc(npixels);
+       CU_ASSERT_EQUAL(rtn, ES_NONE);
+       CU_ASSERT_EQUAL(dimx, 3);
+       CU_ASSERT_EQUAL(dimy, 3);
+       CU_ASSERT_NOT_EQUAL(nodata[0][0],1);
+       CU_ASSERT_DOUBLE_EQUAL(value[0][0],0.5,0.1);
+
+       for (x = 0; x < dimx; x++) {
+               rtdealloc(nodata[x]);
+               rtdealloc(value[x]);
+       }
+
+       rtdealloc(nodata);
+       rtdealloc(value);
+
+       for( i = 0; i < maskY;  i++) {
+         rtdealloc(mask->values[i]);
+         rtdealloc(mask->nodata[i]);
+       }
+
+       rtdealloc(mask->values);
+       rtdealloc(mask->nodata);
+       rtdealloc(mask);
+       
+       if (rtn)
+         rtdealloc(npixels);
+       
+       cu_free_raster(rast);
+
+}
+
 /* register tests */
 CU_TestInfo band_misc_tests[] = {
        PG_TEST(test_band_get_nearest_pixel),
        PG_TEST(test_band_get_pixel_of_value),
+       PG_TEST(test_pixel_set_to_array),
        CU_TEST_INFO_NULL
 };
 CU_SuiteInfo band_misc_suite = {"band_misc",  NULL,  NULL, band_misc_tests};
index 149d6817deb29b1a2208619253e61d2f6315502f..8c31d015583f5724f0b03e8f0fd57ee7089a88bc 100644 (file)
@@ -570,6 +570,7 @@ static void test_raster_iterator() {
                PT_32BUI,
                1, 0,
                0, 0,
+               NULL,
                userargs,
                testRasterIterator1_callback,
                &rtn
@@ -599,6 +600,7 @@ static void test_raster_iterator() {
                PT_32BUI,
                1, 0,
                0, 0,
+               NULL,
                userargs,
                testRasterIterator1_callback,
                &rtn
@@ -628,6 +630,7 @@ static void test_raster_iterator() {
                PT_32BUI,
                1, 0,
                0, 0,
+               NULL,
                userargs,
                testRasterIterator2_callback,
                &rtn
@@ -653,6 +656,7 @@ static void test_raster_iterator() {
                PT_32BUI,
                1, 0,
                0, 0,
+               NULL,
                userargs,
                testRasterIterator3_callback,
                &rtn
@@ -678,6 +682,7 @@ static void test_raster_iterator() {
                PT_32BUI,
                1, 0,
                0, 0,
+               NULL,
                userargs,
                testRasterIterator4_callback,
                &rtn
@@ -703,6 +708,7 @@ static void test_raster_iterator() {
                PT_32BUI,
                1, 0,
                0, 0,
+               NULL,
                userargs,
                testRasterIterator5_callback,
                &rtn
@@ -728,6 +734,7 @@ static void test_raster_iterator() {
                PT_32BUI,
                1, 0,
                0, 0,
+               NULL,
                userargs,
                testRasterIterator6_callback,
                &rtn
@@ -757,6 +764,7 @@ static void test_raster_iterator() {
                PT_32BUI,
                1, 0,
                1, 1,
+               NULL,
                userargs,
                testRasterIterator7_callback,
                &rtn
index 747212e895000d88c6745bdf047c648982e1d4c1..c89991b95e095ba1c9ec8280e5c83587bb7c9905 100644 (file)
@@ -121,6 +121,7 @@ TEST_MAPALGEBRA = \
        rt_clip \
        rt_mapalgebra \
        rt_mapalgebra_expr \
+       rt_mapalgebra_mask \
        rt_union \
        rt_invdistweight4ma \
        rt_4ma \
diff --git a/raster/test/regress/rt_mapalgebra_mask.sql b/raster/test/regress/rt_mapalgebra_mask.sql
new file mode 100644 (file)
index 0000000..5436836
--- /dev/null
@@ -0,0 +1,93 @@
+SET client_min_messages TO warning;
+
+DROP TABLE IF EXISTS raster_nmapalgebra_in;
+CREATE TABLE raster_nmapalgebra_mask_in (
+       rid integer,
+       rast raster
+);
+
+INSERT INTO raster_nmapalgebra_mask_in
+       SELECT 0, NULL::raster AS rast UNION ALL
+       SELECT 1, ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0) AS rast UNION ALL
+       SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 1, 0) AS rast UNION ALL
+       SELECT 3, ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 1, -1, 1, -1, 0, 0, 0), 1, '8BUI', 2, 0), 2, '32BF', 20, 0) AS rast UNION ALL
+       SELECT 4, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 1, -1, 1, -1, 0, 0, 0), 1, '8BUI', 2, 0), 2, '32BF', 20, 0), 3, '16BUI', 200, 0) AS rast
+;
+
+CREATE OR REPLACE FUNCTION raster_nmapalgebra_test(
+       value double precision[][][],
+       pos int[][],
+       VARIADIC userargs text[]
+)
+       RETURNS double precision
+       AS $$
+       BEGIN
+               RAISE NOTICE 'value = %', value;
+               RAISE NOTICE 'pos = %', pos;
+               RAISE NOTICE 'userargs = %', userargs;
+
+               IF userargs IS NULL OR array_length(userargs, 1) < 1 THEN
+                       RETURN 255;
+               ELSE
+                       RETURN userargs[array_lower(userargs, 1)];
+               END IF;
+       END;
+       $$ LANGUAGE 'plpgsql' IMMUTABLE;
+
+SET client_min_messages TO notice;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1,1],[1,1],[1,1]]::double precision[],false) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1,1,1],[1,1,1]]::double precision[],false) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]::double precision[],false) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,NULL::double precision[],false) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[NULL]::double precision[],false) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[1]::double precision[],false) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1]]::double precision[],false) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[NULL]]::double precision[],false) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1,1,1],[1,1,1],[1,1,1]]::double precision[],false) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1,0,0],[0,0,0],[0,0,0]]::double precision[],false) from raster_nmapalgebra_mask_in;
+
+
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1,1],[1,1],[1,1]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1,1,1],[1,1,1]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,NULL::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[NULL]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[1]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[NULL]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1,1,1],[1,1,1],[1,1,1]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[1,0,0],[0,0,0],[0,0,0]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[.5,.5],[.5,.5],[.5,.5]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[.5,.5,.5],[.5,.5,.5]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[.5]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[.5]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[.5,.5,.5],[.5,.5,.5],[.5,.5,.5]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+select st_mapalgebra(rast,1,'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,ARRAY[[.5,0,0],[0,0,0],[0,0,0]]::double precision[],true) from raster_nmapalgebra_mask_in;
+
+DROP FUNCTION IF EXISTS raster_nmapalgebra_test(double precision[], int[], text[]);
+DROP TABLE IF EXISTS raster_nmapalgebra_mask_in;
\ No newline at end of file
diff --git a/raster/test/regress/rt_mapalgebra_mask_expected b/raster/test/regress/rt_mapalgebra_mask_expected
new file mode 100644 (file)
index 0000000..ae8869a
--- /dev/null
@@ -0,0 +1,595 @@
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask dimenstions must be odd.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask dimenstions must be odd.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask dimenstions must be odd.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask Must be a 2D array.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask Must be a 2D array.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,1,1},{NULL,1,1}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{1,1,NULL},{1,1,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,1,1},{NULL,1,1},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1,1,NULL},{1,1,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,2,2},{NULL,2,2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{2,2,NULL},{2,2,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,2,2},{NULL,2,2},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2,2,NULL},{2,2,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,2,2},{NULL,2,2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{2,2,NULL},{2,2,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,2,2},{NULL,2,2},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2,2,NULL},{2,2,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2,NULL,NULL},{NULL,NULL,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask dimenstions must be odd.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask dimenstions must be odd.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask Must be a 2D array.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask Must be a 2D array.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,1,1},{NULL,1,1}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{1,1,NULL},{1,1,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,1,1},{NULL,1,1},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1,1,NULL},{1,1,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,2,2},{NULL,2,2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{2,2,NULL},{2,2,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,2,2},{NULL,2,2},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2,2,NULL},{2,2,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,2,2},{NULL,2,2}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{2,2,NULL},{2,2,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,2,2},{NULL,2,2},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2,2,NULL},{2,2,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,0,0},{NULL,0,0}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{0,0,NULL},{0,0,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,0,0},{NULL,0,0},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1,0,NULL},{0,0,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,0,0},{NULL,0,0}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{0,0,NULL},{0,0,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,0,0},{NULL,0,0},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2,0,NULL},{0,0,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,0,0},{NULL,0,0}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{0,0,NULL},{0,0,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,0,0},{NULL,0,0},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{2,0,NULL},{0,0,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask dimenstions must be odd.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask dimenstions must be odd.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+ERROR:  RASTER_nMapAlgerbra: Mask Must be a 2D array.
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{0.5}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{0.5}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{0.5}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{0.5}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,0.5,0.5},{NULL,0.5,0.5}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{0.5,0.5,NULL},{0.5,0.5,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,0.5,0.5},{NULL,0.5,0.5},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{0.5,0.5,NULL},{0.5,0.5,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,1,1},{NULL,1,1}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{1,1,NULL},{1,1,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,1,1},{NULL,1,1},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1,1,NULL},{1,1,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,1,1},{NULL,1,1}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{1,1,NULL},{1,1,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,1,1},{NULL,1,1},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1,1,NULL},{1,1,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+NOTICE:  First argument (nband) of rastbandarg at index 0 is NULL. Assuming NULL raster
+NOTICE:  All input rasters are NULL. Returning NULL
+NOTICE:  All input rasters do not have bands at indicated indexes. Returning empty raster
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,0,0},{NULL,0,0}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{0,0,NULL},{0,0,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,0,0},{NULL,0,0},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{0.5,0,NULL},{0,0,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,0,0},{NULL,0,0}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{0,0,NULL},{0,0,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,0,0},{NULL,0,0},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1,0,NULL},{0,0,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{NULL,0,0},{NULL,0,0}}}
+NOTICE:  pos = [0:1][1:2]={{1,1},{1,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,NULL,NULL},{0,0,NULL},{0,0,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,1},{2,1}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{NULL,0,0},{NULL,0,0},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{1,2},{1,2}}
+NOTICE:  userargs = <NULL>
+NOTICE:  value = {{{1,0,NULL},{0,0,NULL},{NULL,NULL,NULL}}}
+NOTICE:  pos = [0:1][1:2]={{2,2},{2,2}}
+NOTICE:  userargs = <NULL>
+0100000000000000000000F03F000000000000F0BF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+0100000100000000000000F03F000000000000F0BF000000000000000000000000000000000000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF
+0100000100000000000000F03F000000000000F0BF000000000000F03F000000000000F0BF0000000000000000000000000000000000000000020002004400FFFFFFFF