retile.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. #include <grass/raster3d.h>
  6. /*---------------------------------------------------------------------------*/
  7. static void
  8. retileNocache(void *map, const char *nameOut, int tileX, int tileY, int tileZ)
  9. {
  10. void *map2;
  11. int x, y, z, saveType, nx, ny, nz;
  12. int typeIntern;
  13. void *data;
  14. int tileXsave, tileYsave, tileZsave;
  15. RASTER3D_Region region;
  16. saveType = Rast3d_get_file_type();
  17. Rast3d_set_file_type(Rast3d_file_type_map(map));
  18. Rast3d_get_tile_dimension(&tileXsave, &tileYsave, &tileZsave);
  19. Rast3d_set_tile_dimension(tileX, tileY, tileZ);
  20. typeIntern = Rast3d_tile_type_map(map);
  21. Rast3d_get_region_struct_map(map, &region);
  22. map2 = Rast3d_open_cell_new(nameOut, typeIntern, RASTER3D_NO_CACHE, &region);
  23. if (map2 == NULL)
  24. Rast3d_fatal_error("Rast3d_retile: error in Rast3d_open_cell_new");
  25. Rast3d_set_file_type(saveType);
  26. Rast3d_set_tile_dimension(tileXsave, tileYsave, tileZsave);
  27. data = Rast3d_alloc_tiles(map2, 1);
  28. if (data == NULL)
  29. Rast3d_fatal_error("Rast3d_retile: error in Rast3d_alloc_tiles");
  30. Rast3d_get_nof_tiles_map(map2, &nx, &ny, &nz);
  31. for (z = 0; z < nz; z++) {
  32. G_percent(z, nz, 1);
  33. for (y = 0; y < ny; y++)
  34. for (x = 0; x < nx; x++) {
  35. Rast3d_get_block(map, x * tileX, y * tileY, z * tileZ,
  36. tileX, tileY, tileZ, data, typeIntern);
  37. if (!Rast3d_write_tile
  38. (map2, Rast3d_tile2tile_index(map2, x, y, z), data,
  39. typeIntern))
  40. Rast3d_fatal_error
  41. ("Rast3d_retileNocache: error in Rast3d_write_tile");
  42. }
  43. }
  44. G_percent(1, 1, 1);
  45. Rast3d_free_tiles(data);
  46. Rast3d_close(map2);
  47. }
  48. /*---------------------------------------------------------------------------*/
  49. /*!
  50. * \brief
  51. *
  52. * Makes a copy of <em>map</em> with name <em>nameOut</em> which has
  53. * tile dimensions <em>tileX</em>, <em>tileY</em>, <em>tileZ</em>.
  54. * The source code can be found in <em>retile.c</em>.
  55. *
  56. * \param map
  57. * \param nameOut
  58. * \param tileX
  59. * \param tileY
  60. * \param tileZ
  61. * \return void
  62. */
  63. void
  64. Rast3d_retile(void *map, const char *nameOut, int tileX, int tileY, int tileZ)
  65. {
  66. void *map2;
  67. double value;
  68. int x, y, z, saveType;
  69. int rows, cols, depths, typeIntern;
  70. int xTile, yTile, zTile;
  71. int xOffs, yOffs, zOffs, prev;
  72. int tileXsave, tileYsave, tileZsave;
  73. RASTER3D_Region region;
  74. if (!Rast3d_tile_use_cache_map(map)) {
  75. retileNocache(map, nameOut, tileX, tileY, tileZ);
  76. return;
  77. }
  78. saveType = Rast3d_get_file_type();
  79. Rast3d_set_file_type(Rast3d_file_type_map(map));
  80. Rast3d_get_tile_dimension(&tileXsave, &tileYsave, &tileZsave);
  81. Rast3d_set_tile_dimension(tileX, tileY, tileZ);
  82. typeIntern = Rast3d_tile_type_map(map);
  83. Rast3d_get_region_struct_map(map, &region);
  84. map2 =
  85. Rast3d_open_cell_new(nameOut, typeIntern, RASTER3D_USE_CACHE_DEFAULT, &region);
  86. if (map2 == NULL)
  87. Rast3d_fatal_error("Rast3d_retile: error in Rast3d_open_cell_new");
  88. Rast3d_set_file_type(saveType);
  89. Rast3d_set_tile_dimension(tileXsave, tileYsave, tileZsave);
  90. Rast3d_coord2tile_coord(map2, 0, 0, 0,
  91. &xTile, &yTile, &zTile, &xOffs, &yOffs, &zOffs);
  92. prev = zTile;
  93. x = 0;
  94. y = 0;
  95. Rast3d_get_coords_map(map, &rows, &cols, &depths);
  96. for (z = 0; z < depths; z++) {
  97. G_percent(z, depths, 1);
  98. Rast3d_coord2tile_coord(map2, x, y, z, &xTile, &yTile, &zTile,
  99. &xOffs, &yOffs, &zOffs);
  100. if (zTile > prev) {
  101. if (!Rast3d_flush_all_tiles(map2))
  102. Rast3d_fatal_error("Rast3d_retile: error in Rast3d_flush_all_tiles");
  103. prev++;
  104. }
  105. for (y = 0; y < rows; y++)
  106. for (x = 0; x < cols; x++) {
  107. Rast3d_get_value_region(map, x, y, z, &value, typeIntern);
  108. if (!Rast3d_put_value(map2, x, y, z, &value, typeIntern))
  109. Rast3d_fatal_error("Rast3d_retile: error in Rast3d_put_value");
  110. }
  111. }
  112. G_percent(1, 1, 1);
  113. if (!Rast3d_flush_all_tiles(map2))
  114. Rast3d_fatal_error("Rast3d_retile: error in Rast3d_flush_all_tiles");
  115. if (!Rast3d_close(map2))
  116. Rast3d_fatal_error("Rast3d_retile: error in Rast3d_close");
  117. }