/*! * \brief This function writes a null value to the N_array_3d data at position col, row, depth * * The null value will be automatically set to the array type. * * \param data N_array_3d * * \param col int * \param row int * \param depth int * \return void * */ void N_put_array_3d_value_null(N_array_3d * data, int col, int row, int depth) { G_debug(6, "N_put_array_3d_value_null: put null value to array at pos [%i][%i][%i]", depth, row, col); if (data->offset == 0) { if (data->type == FCELL_TYPE && data->fcell_array != NULL) { Rast3d_set_null_value((void *) &(data-> fcell_array[depth * (data->rows_intern * data->cols_intern) + row * data->cols_intern + col]), 1, FCELL_TYPE); } else if (data->type == DCELL_TYPE && data->dcell_array != NULL) { Rast3d_set_null_value((void *) &(data-> dcell_array[depth * (data->rows_intern * data->cols_intern) + row * data->cols_intern + col]), 1, DCELL_TYPE); } } else { if (data->type == FCELL_TYPE && data->fcell_array != NULL) { Rast3d_set_null_value((void *) &(data-> fcell_array[(depth + data->offset) * (data->rows_intern * data->cols_intern) + (row + data-> offset) * data->cols_intern + (col + data-> offset)]), 1, FCELL_TYPE); } else if (data->type == DCELL_TYPE && data->dcell_array != NULL) { Rast3d_set_null_value((void *) &(data-> dcell_array[(depth + data->offset) * (data->rows_intern * data->cols_intern) + (row + data-> offset) * data->cols_intern + (col + data-> offset)]), 1, DCELL_TYPE); } } return; }
int Rast3d_copy_from_xdr(int nofNum, void *dst) { int i; if (useXdr == RASTER3D_NO_XDR) { Rast3d_copy_values(xdrTmp, 0, type, dst, 0, dstType, nofNum); xdrTmp = G_incr_void_ptr(xdrTmp, nofNum * Rast3d_extern_length(type)); return 1; } for (i = 0; i < nofNum; i++, dst = G_incr_void_ptr(dst, eltLength)) { if (Rast3d_is_xdr_null_num(xdrTmp, isFloat)) { Rast3d_set_null_value(dst, 1, dstType); if (!xdr_setpos(xdrs, xdr_getpos(xdrs) + externLength)) { Rast3d_error("Rast3d_copy_from_xdr: positioning xdr failed"); return 0; } } else { if (type == dstType) { if (xdrFun(xdrs, dst) < 0) { Rast3d_error("Rast3d_copy_from_xdr: reading xdr failed"); return 0; } } else { if (xdrFun(xdrs, tmp) < 0) { Rast3d_error("Rast3d_copy_from_xdr: reading xdr failed"); return 0; } if (type == FCELL_TYPE) *((double *)dst) = (double)*((float *)tmp); else *((float *)dst) = (float)*((double *)tmp); } } xdrTmp = G_incr_void_ptr(xdrTmp, externLength); } return 1; }
static void makeMask(char *name, d_Mask * maskRules) { void *map, *mask; RASTER3D_Region region; int tileX, tileY, tileZ, x, y, z, cacheSize; double value; float floatNull; cacheSize = Rast3d_cache_size_encode(RASTER3D_USE_CACHE_XY, 1); if (NULL == G_find_raster3d(name, "")) Rast3d_fatal_error(_("3D raster map <%s> not found"), name); map = Rast3d_open_cell_old(name, G_mapset(), RASTER3D_DEFAULT_WINDOW, DCELL_TYPE, cacheSize); if (map == NULL) Rast3d_fatal_error(_("Unable to open 3D raster map <%s>"), name); Rast3d_get_region_struct_map(map, ®ion); Rast3d_get_tile_dimensions_map(map, &tileX, &tileY, &tileZ); mask = Rast3d_open_new_param(Rast3d_mask_file(), FCELL_TYPE, cacheSize, ®ion, FCELL_TYPE, RASTER3D_COMPRESSION, 0, tileX, tileY, tileZ); if (mask == NULL) Rast3d_fatal_error(_("Unable to open 3D raster mask file")); Rast3d_min_unlocked(map, RASTER3D_USE_CACHE_X); Rast3d_autolock_on(map); Rast3d_unlock_all(map); Rast3d_min_unlocked(mask, RASTER3D_USE_CACHE_X); Rast3d_autolock_on(mask); Rast3d_unlock_all(mask); Rast3d_set_null_value(&floatNull, 1, FCELL_TYPE); for (z = 0; z < region.depths; z++) { if ((z % tileZ) == 0) { Rast3d_unlock_all(map); Rast3d_unlock_all(mask); } for (y = 0; y < region.rows; y++) /* We count from north to south in the cube coordinate system */ for (x = 0; x < region.cols; x++) { value = Rast3d_get_double_region(map, x, y, z); if (Rast3d_mask_d_select((DCELL *) & value, maskRules)) Rast3d_put_float(mask, x, y, z, (float)floatNull); /* mask-out value */ else Rast3d_put_float(mask, x, y, z, (float)0.0); /* not mask-out value */ } if ((z % tileZ) == 0) { if (!Rast3d_flush_tiles_in_cube (mask, 0, 0, MAX(0, z - tileZ), region.rows - 1, region.cols - 1, z)) Rast3d_fatal_error(_("makeMask: error flushing tiles in cube")); } } if (!Rast3d_flush_all_tiles(mask)) Rast3d_fatal_error(_("makeMask: error flushing all tiles")); Rast3d_autolock_off(map); Rast3d_unlock_all(map); Rast3d_autolock_off(mask); Rast3d_unlock_all(mask); if (!Rast3d_close(mask)) Rast3d_fatal_error(_("Unable to close 3D raster mask file")); if (!Rast3d_close(map)) Rast3d_fatal_error(_("Unable to close raster map <%s>"), name); }
static void bin_to_raster3d(char *null, int map_type, int is_integer, int is_signed, int bytes, int byte_swap, int row_swap, int depth_swap) { int x, y, z; int col, row, depth; DCELL value; FCELL fvalue; DCELL null_value; int tileX, tileY, tileZ; if (null) null_value = atof(null); Rast3d_get_tile_dimensions_map(map, &tileX, &tileY, &tileZ); Rast3d_min_unlocked(map, RASTER3D_USE_CACHE_X); Rast3d_autolock_on(map); Rast3d_unlock_all(map); G_message(_("Loading %s data with %i bytes ... (%dx%dx%d)"), (is_integer? "integer":"floating point "), bytes, region.cols, region.rows, region.depths); for (z = 0; z < region.depths; z++) { G_percent(z, region.depths, 1); if ((z % tileZ) == 0) Rast3d_unlock_all(map); for (y = 0; y < region.rows; y++) {/* go south to north */ for (x = 0; x < region.cols; x++) { /* From west to east */ col = x; /* The default is to read rows from north to south */ row = y; /* From bottom to the top */ depth = z; /* Read rows as from south to north */ if (row_swap) row = region.rows - y - 1; /* Read XY layer from top to bottom */ if (depth_swap) depth = region.depths - z - 1; /* Read value from binary file */ read_cell(&value, is_integer, is_signed, bytes, byte_swap); /* Write value to the 3D raster map */ if (map_type == DCELL_TYPE) { if (null && value == null_value) Rast3d_set_null_value(&value, 1, DCELL_TYPE); Rast3d_put_double(map, col, row, depth, value); } else { fvalue = (FCELL) value; if (null && value == null_value) Rast3d_set_null_value(&fvalue, 1, FCELL_TYPE); Rast3d_put_double(map, col, row, depth, fvalue); } } } } if (!Rast3d_flush_all_tiles(map)) G_fatal_error(_("Error flushing tiles")); Rast3d_autolock_off(map); Rast3d_unlock_all(map); G_percent(1, 1, 1); }
int OUTGR() { void *cf1, *cf2, *cf3, *cf4, *cf5, *cf6, *cf7; int read_val; FCELL *cell; float *data; int i, iarc, cnt; int bmask = 1; int x, y; float value; if ((cellinp != NULL) && (cellout != NULL)) { cell = Rast_allocate_f_buf(); for (i = 0; i < nsizr; i++) { /* seek to the right row */ G_fseek (Tmp_fd_cell, ((off_t)(nsizr - 1 - i) * nsizc * sizeof(FCELL)), 0); fread(cell, sizeof(FCELL), nsizc, Tmp_fd_cell); Rast_put_f_row(fdcout, cell); } } /*** Initialize output g3d region ***/ current_region.bottom = z_orig_in; current_region.top = nsizl * tb_res_in + z_orig_in; if (!(data = (float *)G_malloc(sizeof(float) * nsizr * nsizc * nsizl))) { clean(); G_fatal_error(_("Out of memory")); } /*** Write elevation results ***/ if (outz != NULL) { cf1 = Rast3d_open_new_opt_tile_size(outz, RASTER3D_USE_CACHE_DEFAULT, ¤t_region, FCELL_TYPE, 32); if (cf1 == NULL) { clean(); G_fatal_error(_("Unable to open %s for writing"), outz); } /* seek to the beginning */ G_fseek(Tmp_fd_z, 0L, 0); /* Read data in from temp file */ read_val = fread(data, sizeof(float), nsizr * nsizc * nsizl, Tmp_fd_z); if (read_val < 0) { clean(); G_fatal_error(_("Unable to read data from temp file")); } cnt = 0; for (iarc = 0; iarc < nsizl; iarc++) { for (y = nsizr - 1; y >= 0; y--) { /* changed by AV */ for (x = 0; x < nsizc; x++) { if (maskmap != NULL) bmask = BM_get(bitmask, x, nsizr - y - 1); else bmask = 1; value = data[cnt]; if (!bmask) Rast3d_set_null_value(&value, 1, FCELL_TYPE); if (Rast3d_put_float(cf1, x, y, iarc, value) == 0) { clean(); G_fatal_error( _("Error writing cell (%d,%d,%d) with value %f"), x, y, iarc, value); } cnt++; } } } /* Close the file */ if (Rast3d_close(cf1) == 0) { clean(); G_fatal_error(_("Error closing output file %s"), outz); } else G_message(_("3D raster map <%s> created"), outz); } /*** Write out the gradient results ***/ if (gradient != NULL) { cf2 = Rast3d_open_new_opt_tile_size(gradient, RASTER3D_USE_CACHE_DEFAULT, ¤t_region, FCELL_TYPE, 32); if (cf2 == NULL) { clean(); G_fatal_error(_("Unable to open %s for writing"), gradient); } /* seek to the beginning */ G_fseek(Tmp_fd_dx, 0L, 0); /* Read data in from temp file */ read_val = fread(data, sizeof(float), nsizr * nsizc * nsizl, Tmp_fd_dx); if (read_val < 0) { clean(); G_fatal_error(_("Unable to read data from temp file")); } cnt = 0; for (iarc = 0; iarc < nsizl; iarc++) { for (y = nsizr - 1; y >= 0; y--) { /* changed by AV */ for (x = 0; x < nsizc; x++) { if (maskmap != NULL) bmask = BM_get(bitmask, x, nsizr - y - 1); else bmask = 1; value = data[cnt]; if (!bmask) Rast3d_set_null_value(&value, 1, FCELL_TYPE); if (Rast3d_put_float(cf2, x, y, iarc, value) == 0) { clean(); G_fatal_error( _("Error writing cell (%d,%d,%d) with value %f"), x, y, iarc, value); } cnt++; } } } /* Close the file */ if (Rast3d_close(cf2) == 0) { clean(); G_fatal_error(_("Error closing output file %s"), gradient); } else G_message(_("3D raster map <%s> created"), gradient); } /*** Write out aspect1 results ***/ if (aspect1 != NULL) { cf3 = Rast3d_open_new_opt_tile_size(aspect1, RASTER3D_USE_CACHE_DEFAULT, ¤t_region, FCELL_TYPE, 32); if (cf3 == NULL) { clean(); G_fatal_error(_("Unable to open %s for writing"), aspect1); } /* seek to the beginning */ G_fseek(Tmp_fd_dy, 0L, 0); /* Read data in from temp file */ read_val = fread(data, sizeof(float), nsizr * nsizc * nsizl, Tmp_fd_dy); if (read_val < 0) { clean(); G_fatal_error(_("Unable to read data from temp file")); } cnt = 0; for (iarc = 0; iarc < nsizl; iarc++) { for (y = nsizr - 1; y >= 0; y--) { /* changed by AV */ for (x = 0; x < nsizc; x++) { if (maskmap != NULL) bmask = BM_get(bitmask, x, nsizr - y - 1); else bmask = 1; value = data[cnt] * 180 / M_PI; if (!bmask) Rast3d_set_null_value(&value, 1, FCELL_TYPE); if (Rast3d_put_float(cf3, x, y, iarc, value) == 0) { clean(); G_fatal_error( _("Error writing cell (%d,%d,%d) with value %f"), x, y, iarc, value); } cnt++; } } } /* Close the file */ if (Rast3d_close(cf3) == 0) { clean(); G_fatal_error(_("Error closing output file %s"), aspect1); } else G_message(_("3D raster map <%s> created"), aspect1); } /*** Write out aspect2 results ***/ if (aspect2 != NULL) { cf4 = Rast3d_open_new_opt_tile_size(aspect2, RASTER3D_USE_CACHE_DEFAULT, ¤t_region, FCELL_TYPE, 32); if (cf4 == NULL) { clean(); G_fatal_error(_("Unable to open %s for writing"), aspect2); } /* seek to the beginning */ G_fseek(Tmp_fd_dz, 0L, 0); /* Read data in from temp file */ read_val = fread(data, sizeof(float), nsizr * nsizc * nsizl, Tmp_fd_dz); if (read_val < 0) { clean(); G_fatal_error(_("Unable to read data from temp file")); } cnt = 0; for (iarc = 0; iarc < nsizl; iarc++) { for (y = nsizr - 1; y >= 0; y--) { /* changed by AV */ for (x = 0; x < nsizc; x++) { if (maskmap != NULL) bmask = BM_get(bitmask, x, nsizr - y - 1); else bmask = 1; value = data[cnt] * 180 / M_PI; if (!bmask) Rast3d_set_null_value(&value, 1, FCELL_TYPE); if (Rast3d_put_float(cf4, x, y, iarc, value) == 0) { clean(); G_fatal_error( _("Error writing cell (%d,%d,%d) with value %f"), x, y, iarc, value); } cnt++; } } } /* Close the file */ if (Rast3d_close(cf4) == 0) { clean(); G_fatal_error(_("Error closing output file %s"), aspect2); } else G_message(_("3D raster map <%s> created"), aspect2); } /*** Write out ncurv results ***/ if (ncurv != NULL) { cf5 = Rast3d_open_new_opt_tile_size(ncurv, RASTER3D_USE_CACHE_DEFAULT, ¤t_region, FCELL_TYPE, 32); if (cf5 == NULL) { clean(); G_fatal_error(_("Unable to open %s for writing"), ncurv); } /* seek to the beginning */ G_fseek(Tmp_fd_xx, 0L, 0); /* Read data in from temp file */ read_val = fread(data, sizeof(float), nsizr * nsizc * nsizl, Tmp_fd_xx); if (read_val < 0) { clean(); G_fatal_error(_("Unable to read data from temp file")); } cnt = 0; for (iarc = 0; iarc < nsizl; iarc++) { for (y = nsizr - 1; y >= 0; y--) { /* changed by AV */ for (x = 0; x < nsizc; x++) { if (maskmap != NULL) bmask = BM_get(bitmask, x, nsizr - y - 1); else bmask = 1; value = data[cnt]; if (!bmask) Rast3d_set_null_value(&value, 1, FCELL_TYPE); if (Rast3d_put_float(cf5, x, y, iarc, value) == 0) { clean(); G_fatal_error( _("Error writing cell (%d,%d,%d) with value %f"), x, y, iarc, value); } cnt++; } } } /* Close the file */ if (Rast3d_close(cf5) == 0) { clean(); G_fatal_error(_("Error closing output file %s"), ncurv); } else G_message(_("3D raster map <%s> created"), ncurv); } /*** Write out gcurv results ***/ if (gcurv != NULL) { cf6 = Rast3d_open_new_opt_tile_size(gcurv, RASTER3D_USE_CACHE_DEFAULT, ¤t_region, FCELL_TYPE, 32); if (cf6 == NULL) { clean(); G_fatal_error(_("Unable to open %s for writing"), gcurv); } /* seek to the beginning */ G_fseek(Tmp_fd_yy, 0L, 0); /* Read data in from temp file */ read_val = fread(data, sizeof(float), nsizr * nsizc * nsizl, Tmp_fd_yy); if (read_val < 0) { clean(); G_fatal_error(_("Unable to read data from temp file")); } cnt = 0; for (iarc = 0; iarc < nsizl; iarc++) { for (y = nsizr - 1; y >= 0; y--) { /* changed by AV */ for (x = 0; x < nsizc; x++) { if (maskmap != NULL) bmask = BM_get(bitmask, x, nsizr - y - 1); else bmask = 1; value = data[cnt]; if (!bmask) Rast3d_set_null_value(&value, 1, FCELL_TYPE); if (Rast3d_put_float(cf6, x, y, iarc, value) == 0) { clean(); G_fatal_error( _("Error writing cell (%d,%d,%d) with value %f"), x, y, iarc, value); } cnt++; } } } /* Close the file */ if (Rast3d_close(cf6) == 0) { clean(); G_fatal_error(_("Error closing output file %s"), gcurv); } else G_message(_("3D raster map <%s> created"), gcurv); } /*** Write mcurv results ***/ if (mcurv != NULL) { cf7 = Rast3d_open_new_opt_tile_size(mcurv, RASTER3D_USE_CACHE_DEFAULT, ¤t_region, FCELL_TYPE, 32); if (cf7 == NULL) { clean(); G_fatal_error(_("Unable to open %s for writing"), mcurv); } /* seek to the beginning */ G_fseek(Tmp_fd_xy, 0L, 0); /* Read data in from temp file */ read_val = fread(data, sizeof(float), nsizr * nsizc * nsizl, Tmp_fd_xy); if (read_val < 0) { clean(); G_fatal_error(_("Unable to read data from temp file")); } cnt = 0; for (iarc = 0; iarc < nsizl; iarc++) { for (y = nsizr - 1; y >= 0; y--) { /* changed by AV */ for (x = 0; x < nsizc; x++) { if (maskmap != NULL) bmask = BM_get(bitmask, x, nsizr - y - 1); else bmask = 1; value = data[cnt]; if (!bmask) Rast3d_set_null_value(&value, 1, FCELL_TYPE); if (Rast3d_put_float(cf7, x, y, iarc, value) == 0) { clean(); G_fatal_error( _("Error writing cell (%d,%d,%d) with value %f"), x, y, iarc, value); } cnt++; } } } /* Close the file */ if (Rast3d_close(cf7) == 0) { clean(); G_fatal_error(_("Error closing output file %s"), mcurv); } else G_message(_("3D raster map <%s> created"), mcurv); } G_free(data); return 1; }
void asciiToG3d(FILE * fp, RASTER3D_Region * region, int convertNull, char *nullValue) { int x, y, z; int col, row, depth; double value; char buff[256]; int tileX, tileY, tileZ; Rast3d_get_tile_dimensions_map(map, &tileX, &tileY, &tileZ); Rast3d_min_unlocked(map, RASTER3D_USE_CACHE_X); Rast3d_autolock_on(map); Rast3d_unlock_all(map); G_message(_("Loading data ... (%dx%dx%d)"), region->cols, region->rows, region->depths); G_debug(3, "asciiToG3d: writing the 3D raster map, with rows %i cols %i depths %i", region->rows, region->cols, region->depths); for (z = 0; z < region->depths; z++) { G_percent(z, region->depths, 1); if ((z % tileZ) == 0) Rast3d_unlock_all(map); for (y = 0; y < region->rows; y++) /* go south to north */ for (x = 0; x < region->cols; x++) { /* From west to east */ col = x; /* The default is to read rows from north to south */ row = y; /* From bottom to the top */ depth = z; /* Read rows as from south to north */ if (rowOrder == ROW_ORDER_SOUTH_TO_NORTH) row = region->rows - y - 1; /* Read XY layer from top to bottom */ if (depthOrder == DEPTH_ORDER_TOP_TO_BOTTOM) depth = region->depths - z - 1; if (fscanf(fp, "%s", buff) != 1) { if (feof(fp)) G_warning(_("End of file reached while still loading data.")); G_debug(3, "missing data at col=%d row=%d depth=%d last_value=[%.4f]", x + 1, y + 1, z + 1, value); fatalError("asciiToG3d: read failed"); } /* Check for null value */ if (convertNull && strncmp(buff, nullValue, strlen(nullValue)) == 0) { Rast3d_set_null_value(&value, 1, DCELL_TYPE); } else { if (sscanf(buff, "%lf", &value) != 1) { G_warning(_("Invalid value detected")); G_debug(1, "invalid value at col=%d row=%d depth=%d last_value=[%s]", x + 1, y + 1, z + 1, buff); fatalError("asciiToG3d: read failed"); } } /* Write the data */ Rast3d_put_double(map, col, row, depth, value); } } if (fscanf(fp, "%lf", &value) == 1) { G_warning(_("Data exists in input file after fully importing " "expected data. [%.4f ...]"), value); } if (!Rast3d_flush_all_tiles(map)) fatalError("asciiTog3d: error flushing tiles"); Rast3d_autolock_off(map); Rast3d_unlock_all(map); G_percent(1, 1, 1); }
static void modifyNull(char *name, d_Mask * maskRules, int changeNull, double newNullVal) { void *map, *mapOut; RASTER3D_Region region; int tileX, tileY, tileZ, x, y, z; double value; int doCompress, doLzw, doRle, precision; int cacheSize; cacheSize = Rast3d_cache_size_encode(RASTER3D_USE_CACHE_XY, 1); if (NULL == G_find_raster3d(name, "")) Rast3d_fatal_error(_("3D raster map <%s> not found"), name); fprintf(stderr, "name %s Mapset %s \n", name, G_mapset()); map = Rast3d_open_cell_old(name, G_mapset(), RASTER3D_DEFAULT_WINDOW, DCELL_TYPE, cacheSize); if (map == NULL) Rast3d_fatal_error(_("Unable to open 3D raster map <%s>"), name); Rast3d_get_region_struct_map(map, ®ion); Rast3d_get_tile_dimensions_map(map, &tileX, &tileY, &tileZ); Rast3d_get_compression_mode(&doCompress, &doLzw, &doRle, &precision); mapOut = Rast3d_open_new_param(name, DCELL_TYPE, RASTER3D_USE_CACHE_XY, ®ion, Rast3d_file_type_map(map), doLzw, doRle, Rast3d_tile_precision_map(map), tileX, tileY, tileZ); if (mapOut == NULL) Rast3d_fatal_error(_("modifyNull: error opening tmp file")); Rast3d_min_unlocked(map, RASTER3D_USE_CACHE_X); Rast3d_autolock_on(map); Rast3d_unlock_all(map); Rast3d_min_unlocked(mapOut, RASTER3D_USE_CACHE_X); Rast3d_autolock_on(mapOut); Rast3d_unlock_all(mapOut); for (z = 0; z < region.depths; z++) { if ((z % tileZ) == 0) { Rast3d_unlock_all(map); Rast3d_unlock_all(mapOut); } for (y = 0; y < region.rows; y++) for (x = 0; x < region.cols; x++) { value = Rast3d_get_double_region(map, x, y, z); if (Rast3d_is_null_value_num(&value, DCELL_TYPE)) { if (changeNull) { value = newNullVal; } } else if (Rast3d_mask_d_select((DCELL *) & value, maskRules)) { Rast3d_set_null_value(&value, 1, DCELL_TYPE); } Rast3d_put_double(mapOut, x, y, z, value); } if ((z % tileZ) == 0) { if (!Rast3d_flush_tiles_in_cube (mapOut, 0, 0, MAX(0, z - tileZ), region.rows - 1, region.cols - 1, z)) Rast3d_fatal_error(_("modifyNull: error flushing tiles in cube")); } } if (!Rast3d_flush_all_tiles(mapOut)) Rast3d_fatal_error(_("modifyNull: error flushing all tiles")); Rast3d_autolock_off(map); Rast3d_unlock_all(map); Rast3d_autolock_off(mapOut); Rast3d_unlock_all(mapOut); if (!Rast3d_close(map)) Rast3d_fatal_error(_("Unable to close raster map")); if (!Rast3d_close(mapOut)) Rast3d_fatal_error(_("modifyNull: Unable to close tmp file")); }