GRASS Programmer's Manual
6.4.2(2012)
|
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, ®ion); 00044 00045 map2 = 00046 G3d_openCellNew(nameOut, typeIntern, G3D_USE_CACHE_DEFAULT, ®ion); 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 }