GRASS Programmer's Manual  6.4.2(2012)
changeprecision.c
Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <sys/types.h>
00004 #include <unistd.h>
00005 #include <grass/G3d.h>
00006 
00007 /*---------------------------------------------------------------------------*/
00008 
00009 
00023 void G3d_changePrecision(void *map, int precision, const char *nameOut)
00024 {
00025     void *map2;
00026     int x, y, z, savePrecision, saveCompression, saveLzw, saveRle;
00027     char *data;
00028     G3D_Region region;
00029     int typeIntern;
00030     int nx, ny, nz;
00031     int tileXsave, tileYsave, tileZsave, tileX, tileY, tileZ, saveType;
00032 
00033     saveType = G3d_getFileType();
00034     /*   G3d_setFileType (G3d_fileTypeMap (map)); */
00035     G3d_getCompressionMode(&saveCompression, &saveLzw, &saveRle,
00036                            &savePrecision);
00037     G3d_setCompressionMode(G3D_COMPRESSION, saveLzw, saveRle, precision);
00038     G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave);
00039     G3d_getTileDimensionsMap(map, &tileX, &tileY, &tileZ);
00040     G3d_setTileDimension(tileX, tileY, tileZ);
00041 
00042     typeIntern = G3d_tileTypeMap(map);
00043     G3d_getRegionStructMap(map, &region);
00044 
00045     map2 =
00046         G3d_openCellNew(nameOut, typeIntern, G3D_USE_CACHE_DEFAULT, &region);
00047     if (map2 == NULL)
00048         G3d_fatalError("G3d_changePrecision: error in G3d_openCellNew");
00049 
00050     G3d_setFileType(saveType);
00051     G3d_setCompressionMode(saveCompression, saveLzw, saveRle, savePrecision);
00052     G3d_setTileDimension(tileXsave, tileYsave, tileZsave);
00053 
00054     data = G3d_allocTiles(map, 1);
00055     if (data == NULL)
00056         G3d_fatalError("G3d_changePrecision: error in G3d_allocTiles");
00057     G3d_getNofTilesMap(map2, &nx, &ny, &nz);
00058 
00059     for (z = 0; z < nz; z++)
00060         for (y = 0; y < ny; y++)
00061             for (x = 0; x < nx; x++) {
00062                 if (!G3d_readTile(map, G3d_tile2tileIndex(map, x, y, z), data,
00063                                   typeIntern))
00064                     G3d_fatalError
00065                         ("G3d_changePrecision: error in G3d_readTile");
00066                 if (!G3d_writeTile
00067                     (map2, G3d_tile2tileIndex(map2, x, y, z), data,
00068                      typeIntern))
00069                     G3d_fatalError
00070                         ("G3d_changePrecision: error in G3d_writeTile");
00071             }
00072 
00073     G3d_freeTiles(data);
00074     if (!G3d_closeCell(map2))
00075         G3d_fatalError("G3d_changePrecision: error in G3d_closeCell");
00076 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines