int hasnodata = FALSE;
double nodataval = 0;
bool keepnodata = FALSE;
+ bool hasnosetval = FALSE;
+ bool nosetvalisnull = FALSE;
+ double nosetval = 0;
int rtn = 0;
double val = 0;
pfree(elements);
pfree(nulls);
}
+ /* hasnosetvalue and nosetvalue */
+ else if (!PG_ARGISNULL(6) & PG_GETARG_BOOL(6)) {
+ hasnosetval = TRUE;
+ if (PG_ARGISNULL(7))
+ nosetvalisnull = TRUE;
+ else
+ nosetval = PG_GETARG_FLOAT8(7);
+ }
#if POSTGIS_DEBUG_LEVEL > 0
for (i = 0; i < numpixval; i++) {
#endif
/* keepnodata flag */
- if (!PG_ARGISNULL(6))
- keepnodata = PG_GETARG_BOOL(6);
+ if (!PG_ARGISNULL(8))
+ keepnodata = PG_GETARG_BOOL(8);
/* get band */
band = rt_raster_get_band(raster, nband - 1);
/* noset = true, skip */
if (pixval[i].noset)
continue;
+ /* check against nosetval */
+ else if (hasnosetval) {
+ /* pixel = NULL AND nosetval = NULL */
+ if (pixval[i].nodata && nosetvalisnull)
+ continue;
+ /* pixel value = nosetval */
+ else if (!pixval[i].nodata && !nosetvalisnull && FLT_EQ(pixval[i].value, nosetval))
+ continue;
+ }
/* if pixel is outside bounds, skip */
if (
-----------------------------------------------------------------------
-- ST_SetValues (set one or more pixels to a one or more values)
-----------------------------------------------------------------------
-CREATE OR REPLACE FUNCTION st_setvalues(
+CREATE OR REPLACE FUNCTION _st_setvalues(
rast raster, nband integer,
x integer, y integer,
newvalueset double precision[][],
noset boolean[][] DEFAULT NULL,
+ hasnosetvalue boolean DEFAULT FALSE,
+ nosetvalue double precision DEFAULT NULL,
keepnodata boolean DEFAULT FALSE
)
RETURNS raster
AS 'MODULE_PATHNAME', 'RASTER_setPixelValuesArray'
LANGUAGE 'c' IMMUTABLE;
+CREATE OR REPLACE FUNCTION st_setvalues(
+ rast raster, nband integer,
+ x integer, y integer,
+ newvalueset double precision[][],
+ noset boolean[][] DEFAULT NULL,
+ keepnodata boolean DEFAULT FALSE
+)
+ RETURNS raster
+ AS $$ SELECT _st_setvalues($1, $2, $3, $4, $5, $6, FALSE, NULL, $7) $$
+ LANGUAGE 'sql' IMMUTABLE;
+
+CREATE OR REPLACE FUNCTION st_setvalues(
+ rast raster, nband integer,
+ x integer, y integer,
+ newvalueset double precision[][],
+ nosetvalue double precision,
+ keepnodata boolean DEFAULT FALSE
+)
+ RETURNS raster
+ AS $$ SELECT _st_setvalues($1, $2, $3, $4, $5, NULL, TRUE, $6, $7) $$
+ LANGUAGE 'sql' IMMUTABLE;
+
-- cannot be STRICT as newvalue can be NULL
CREATE OR REPLACE FUNCTION st_setvalues(
rast raster, nband integer,
RAISE EXCEPTION 'Values for width and height must be greater than zero';
RETURN NULL;
END IF;
- RETURN st_setvalues($1, $2, $3, $4, array_fill($7, ARRAY[$6, $5]::int[]), NULL, $8);
+ RETURN _st_setvalues($1, $2, $3, $4, array_fill($7, ARRAY[$6, $5]::int[]), NULL, FALSE, NULL, $8);
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
RAISE EXCEPTION 'Values for width and height must be greater than zero';
RETURN NULL;
END IF;
- RETURN st_setvalues($1, 1, $2, $3, array_fill($6, ARRAY[$5, $4]::int[]), NULL, $7);
+ RETURN _st_setvalues($1, 1, $2, $3, array_fill($6, ARRAY[$5, $4]::int[]), NULL, FALSE, NULL, $7);
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
FROM raster_setvalues_rast
));
+INSERT INTO raster_setvalues_out VALUES (
+ 31, (
+ SELECT ST_SetValues(
+ rast, 1, 1, 1,
+ ARRAY[-1, 31, -1]::double precision[],
+ -1::double precision
+ )
+ FROM raster_setvalues_rast
+));
+
+INSERT INTO raster_setvalues_out VALUES (
+ 32, (
+ SELECT ST_SetValues(
+ rast, 1, 1, 1,
+ ARRAY[[-1, 32, -1], [32, -1, 32]]::double precision[],
+ -1::double precision
+ )
+ FROM raster_setvalues_rast
+));
+
+INSERT INTO raster_setvalues_out VALUES (
+ 33, (
+ SELECT ST_SetValues(
+ rast, 1, 1, 1,
+ ARRAY[[NULL, 33, NULL], [33, NULL, 33]]::double precision[],
+ NULL::double precision
+ )
+ FROM raster_setvalues_rast
+));
+
SELECT
rid,
(poly).x,