3
#include "raster3d_intern.h"
5
/*--------------------------------------------------------------------------*/
7
/* the standard g3d file format is used to store the mask values. a NULL-value
8
is stored for values which are masked out and a "0." is stored for values
9
which are not masked out. to improve compression, the precision is set to
10
0 and RLE encoding is used.
13
/*--------------------------------------------------------------------------*/
15
static int Rast3d_maskMapExistsVar = 0;
16
static RASTER3D_Map *Rast3d_maskMap;
18
/*--------------------------------------------------------------------------*/
19
static void dummy(void)
25
static float RASTER3D_MASKNUMmaskValue;
27
/* Call to dummy() to match void return type of Rast3d_set_null_value() */
28
#define RASTER3D_MASKNUM(map,Xmask,Ymask,Zmask,VALUEmask,TYPEmask) \
30
(RASTER3D_MASKNUMmaskValue = Rast3d_getMaskFloat (map, Xmask, Ymask, Zmask), \
31
((Rast3d_is_null_value_num (&RASTER3D_MASKNUMmaskValue, FCELL_TYPE)) ? \
32
Rast3d_set_null_value (VALUEmask, 1, TYPEmask) : dummy()))
34
/*--------------------------------------------------------------------------*/
36
int Rast3d_mask_close()
38
/* No Idea if this is correct return value */
39
if (!Rast3d_maskMapExistsVar)
42
Rast3d_maskMapExistsVar = 0;
44
if (!Rast3d_close(Rast3d_maskMap)) {
45
Rast3d_error("Rast3d_mask_close: error closing mask");
53
/*--------------------------------------------------------------------------*/
59
* Returns 1 if the 3d mask file exists.
64
int Rast3d_mask_file_exists(void)
66
return G_find_file_misc(RASTER3D_DIRECTORY, RASTER3D_CELL_ELEMENT, RASTER3D_MASK_MAP, G_mapset()) != NULL;
69
/*--------------------------------------------------------------------------*/
71
static int maskOpenOldCacheDefault = RASTER3D_USE_CACHE_DEFAULT;
73
int Rast3d_mask_open_old(void)
75
RASTER3D_Region region;
77
/* No Idea if this is correct return value */
78
if (Rast3d_maskMapExistsVar)
81
Rast3d_maskMapExistsVar = Rast3d_mask_file_exists();
83
if (!Rast3d_maskMapExistsVar)
86
if ((Rast3d_maskMap = Rast3d_open_cell_old(RASTER3D_MASK_MAP, G_mapset(),
87
RASTER3D_DEFAULT_WINDOW, FCELL_TYPE,
88
maskOpenOldCacheDefault))
90
Rast3d_error("Rast3d_mask_open_old: cannot open mask");
95
Rast3d_get_region_struct_map(Rast3d_maskMap, ®ion);
96
Rast3d_set_window_map(Rast3d_maskMap, ®ion);
101
/*--------------------------------------------------------------------------*/
103
static float Rast3d_getMaskFloat(RASTER3D_Map * map, int x, int y, int z)
105
double north, east, top;
108
north = ((double)map->window.rows - y - 0.5) / (double)map->window.rows *
109
(map->window.north - map->window.south) + map->window.south;
110
east = ((double)x + 0.5) / (double)map->window.cols *
111
(map->window.east - map->window.west) + map->window.west;
112
top = ((double)z + 0.5) / (double)map->window.depths *
113
(map->window.top - map->window.bottom) + map->window.bottom;
115
Rast3d_get_region_value(Rast3d_maskMap, north, east, top, &value, FCELL_TYPE);
119
/*--------------------------------------------------------------------------*/
125
* This function should be used to adjust the cache size used for the
126
* 3d-mask. First the open 3d-mask is closed and then opened again with
127
* a cache size as specified with <em>cache</em>.
130
* \return 1 ... if successful
134
int Rast3d_mask_reopen(int cache)
138
if (Rast3d_maskMapExistsVar)
139
if (!Rast3d_mask_close()) {
140
Rast3d_error("Rast3d_mask_reopen: error closing mask");
145
tmp = maskOpenOldCacheDefault;
146
maskOpenOldCacheDefault = cache;
148
if (!Rast3d_mask_open_old()) {
149
Rast3d_error("Rast3d_mask_reopen: error opening mask");
154
maskOpenOldCacheDefault = tmp;
158
/*--------------------------------------------------------------------------*/
164
* Returns 1 if the cell with cell-coordinates <em>(x, y, z)</em> is masked
165
* out. Returns 0 otherwise.
173
int Rast3d_is_masked(RASTER3D_Map * map, int x, int y, int z)
175
if (!Rast3d_maskMapExistsVar)
178
RASTER3D_MASKNUMmaskValue = Rast3d_getMaskFloat(map, x, y, z);
179
return (Rast3d_is_null_value_num(&RASTER3D_MASKNUMmaskValue, FCELL_TYPE));
182
/*--------------------------------------------------------------------------*/
188
* Replaces the value stored in <em>value</em> with the NULL-value if
189
* <em>Rast3d_is_masked (x, y, z)</em> returns 1. Does nothing otherwise.
190
* <em>value</em> is assumed to be of<em>type</em>.
200
void Rast3d_mask_num(RASTER3D_Map * map, int x, int y, int z, void *value, int type)
202
if (!Rast3d_maskMapExistsVar)
204
RASTER3D_MASKNUM(map, x, y, z, value, type);
207
/*--------------------------------------------------------------------------*/
213
* Same as <em>Rast3d_mask_num (x, y, z, value, FCELL_TYPE)</em>.
222
void Rast3d_mask_float(RASTER3D_Map * map, int x, int y, int z, float *value)
224
if (!Rast3d_maskMapExistsVar)
226
RASTER3D_MASKNUM(map, x, y, z, value, FCELL_TYPE);
229
/*--------------------------------------------------------------------------*/
235
* Same as <em>Rast3d_mask_num (x, y, z, value, DCELL_TYPE)</em>.
244
void Rast3d_mask_double(RASTER3D_Map * map, int x, int y, int z, double *value)
246
if (!Rast3d_maskMapExistsVar)
248
RASTER3D_MASKNUM(map, x, y, z, value, DCELL_TYPE);
251
/*--------------------------------------------------------------------------*/
257
* Replaces the values stored in <em>tile</em> (with <em>tileIndex</em>) for
258
* which <em>Rast3d_is_masked</em> returns 1 with NULL-values. Does not change
259
* the remaining values. The values are assumed to be of <em>type</em>.
260
* Whether replacement is performed or not only depends on location of the
261
* cells of the tile and not on the status of the mask for <em>map</em>
262
* (i.e. turned on or off).
271
void Rast3d_mask_tile(RASTER3D_Map * map, int tileIndex, void *tile, int type)
273
int nofNum, rows, cols, depths, xRedundant, yRedundant, zRedundant;
274
int x, y, z, xLength, yLength, dx, dy, dz, length;
276
if (!Rast3d_maskMapExistsVar)
279
nofNum = Rast3d_compute_clipped_tile_dimensions(map, tileIndex,
280
&rows, &cols, &depths,
281
&xRedundant, &yRedundant,
283
Rast3d_tile_index_origin(map, tileIndex, &x, &y, &z);
285
if (nofNum == map->tileSize) {
287
/* BEGIN OF ORIGINAL CODE */
289
* Rast3d_get_tile_dimensions_map (map, &rows, &cols, &depths);
292
/* BEGIN OF MY CODE */
293
Rast3d_get_tile_dimensions_map(map, &cols, &rows, &depths);
295
xRedundant = yRedundant = 0;
301
length = Rast3d_length(type);
302
xLength = xRedundant * length;
303
yLength = map->tileX * yRedundant * length;
305
for (dz = z; dz < depths; dz++) {
306
for (dy = y; dy < rows; dy++) {
307
for (dx = x; dx < cols; dx++) {
308
RASTER3D_MASKNUM(map, dx, dy, dz, tile, type);
318
/*--------------------------------------------------------------------------*/
324
* Turns on the mask for <em>map</em>. Do
325
* not invoke this function after the first tile has been read since the result
326
* might be inconsistent cell-values.
332
void Rast3d_mask_on(RASTER3D_Map * map)
341
* Turns off the mask for <em>map</em>.
342
* This is the default. Do not invoke this function after the first tile has
343
* been read since the result might be inconsistent cell-values.
349
void Rast3d_mask_off(RASTER3D_Map * map)
358
* Returns 1 if the mask for <em>map</em>
359
* is turned on. Returns 0 otherwise.
365
int Rast3d_mask_is_on(RASTER3D_Map * map)
374
* Returns 1 if the mask for <em>map</em> is turned off. Returns 0 otherwise.
380
int Rast3d_mask_is_off(RASTER3D_Map * map)
382
return !map->useMask;
389
* Returns the name of the 3d mask file.
394
const char *Rast3d_mask_file(void)
396
return RASTER3D_MASK_MAP;
403
* Returns 1 if the 3d mask is loaded.
408
int Rast3d_mask_map_exists(void)
410
return Rast3d_maskMapExistsVar;