void Rast3d_coord2tile_index(RASTER3D_Map * map, int x, int y, int z, int *tileIndex, int *offset) { int xTile, yTile, zTile, xOffs, yOffs, zOffs; Rast3d_coord2tile_coord(map, x, y, z, &xTile, &yTile, &zTile, &xOffs, &yOffs, &zOffs); *tileIndex = Rast3d_tile2tile_index(map, xTile, yTile, zTile); *offset = zOffs * map->tileXY + yOffs * map->tileX + xOffs; }
void Rast3d_retile(void *map, const char *nameOut, int tileX, int tileY, int tileZ) { void *map2; double value; int x, y, z, saveType; int rows, cols, depths, typeIntern; int xTile, yTile, zTile; int xOffs, yOffs, zOffs, prev; int tileXsave, tileYsave, tileZsave; RASTER3D_Region region; if (!Rast3d_tile_use_cache_map(map)) { retileNocache(map, nameOut, tileX, tileY, tileZ); return; } saveType = Rast3d_get_file_type(); Rast3d_set_file_type(Rast3d_file_type_map(map)); Rast3d_get_tile_dimension(&tileXsave, &tileYsave, &tileZsave); Rast3d_set_tile_dimension(tileX, tileY, tileZ); typeIntern = Rast3d_tile_type_map(map); Rast3d_get_region_struct_map(map, ®ion); map2 = Rast3d_open_cell_new(nameOut, typeIntern, RASTER3D_USE_CACHE_DEFAULT, ®ion); if (map2 == NULL) Rast3d_fatal_error("Rast3d_retile: error in Rast3d_open_cell_new"); Rast3d_set_file_type(saveType); Rast3d_set_tile_dimension(tileXsave, tileYsave, tileZsave); Rast3d_coord2tile_coord(map2, 0, 0, 0, &xTile, &yTile, &zTile, &xOffs, &yOffs, &zOffs); prev = zTile; x = 0; y = 0; Rast3d_get_coords_map(map, &rows, &cols, &depths); for (z = 0; z < depths; z++) { G_percent(z, depths, 1); Rast3d_coord2tile_coord(map2, x, y, z, &xTile, &yTile, &zTile, &xOffs, &yOffs, &zOffs); if (zTile > prev) { if (!Rast3d_flush_all_tiles(map2)) Rast3d_fatal_error("Rast3d_retile: error in Rast3d_flush_all_tiles"); prev++; } for (y = 0; y < rows; y++) for (x = 0; x < cols; x++) { Rast3d_get_value_region(map, x, y, z, &value, typeIntern); if (!Rast3d_put_value(map2, x, y, z, &value, typeIntern)) Rast3d_fatal_error("Rast3d_retile: error in Rast3d_put_value"); } } G_percent(1, 1, 1); if (!Rast3d_flush_all_tiles(map2)) Rast3d_fatal_error("Rast3d_retile: error in Rast3d_flush_all_tiles"); if (!Rast3d_close(map2)) Rast3d_fatal_error("Rast3d_retile: error in Rast3d_close"); }
int Rast3d_flush_tiles_in_cube(RASTER3D_Map * map, int xMin, int yMin, int zMin, int xMax, int yMax, int zMax) { int xTileMin, yTileMin, zTileMin, xTileMax, yTileMax, zTileMax; int xOffs, yOffs, zOffs; int regionMaxX, regionMaxY, regionMaxZ; if (!map->useCache) Rast3d_fatal_error ("Rast3d_flush_tiles_in_cube: function invalid in non-cache mode"); /*AV*/ /*BEGIN OF ORIGINAL CODE */ /* * Rast3d_get_coords_map (map, ®ionMaxX, ®ionMaxY, ®ionMaxZ); */ /*AV*/ /* BEGIN OF MY CODE */ Rast3d_get_coords_map(map, ®ionMaxY, ®ionMaxX, ®ionMaxZ); /* END OF MY CODE */ if ((xMin < 0) && (xMax < 0)) Rast3d_fatal_error("Rast3d_flush_tiles_in_cube: coordinate out of Range"); if ((xMin >= regionMaxX) && (xMax >= regionMaxX)) Rast3d_fatal_error("Rast3d_flush_tiles_in_cube: coordinate out of Range"); xMin = MIN(MAX(0, xMin), regionMaxX - 1); if ((yMin < 0) && (yMax < 0)) Rast3d_fatal_error("Rast3d_flush_tiles_in_cube: coordinate out of Range"); if ((yMin >= regionMaxY) && (yMax >= regionMaxY)) Rast3d_fatal_error("Rast3d_flush_tiles_in_cube: coordinate out of Range"); yMin = MIN(MAX(0, yMin), regionMaxY - 1); if ((zMin < 0) && (zMax < 0)) Rast3d_fatal_error("Rast3d_flush_tiles_in_cube: coordinate out of Range"); if ((zMin >= regionMaxZ) && (zMax >= regionMaxZ)) Rast3d_fatal_error("Rast3d_flush_tiles_in_cube: coordinate out of Range"); zMin = MIN(MAX(0, zMin), regionMaxZ - 1); Rast3d_coord2tile_coord(map, xMin, yMin, zMin, &xTileMin, &yTileMin, &zTileMin, &xOffs, &yOffs, &zOffs); if (xOffs != 0) xTileMin++; if (yOffs != 0) yTileMin++; if (zOffs != 0) zTileMin++; Rast3d_coord2tile_coord(map, xMax + 1, yMax + 1, zMax + 1, &xTileMax, &yTileMax, &zTileMax, &xOffs, &yOffs, &zOffs); xTileMax--; yTileMax--; zTileMax--; if (!Rast3d_flush_tile_cube(map, xTileMin, yTileMin, zTileMin, xTileMax, yTileMax, zTileMax)) { Rast3d_error("Rast3d_flush_tiles_in_cube: error in Rast3d_flush_tile_cube"); return 0; } return 1; }