How to know the map type of a GRASS GIS archive file
GRASS GIS provides the r.pack and v.pack modules that we can use to export raster and vector maps, respectively, to archive files in the .pack extension. However, unless we specify the map type explicitly in the output parameter, there is no way to know which type an archive file is for without trying r.pack or v.pack first. These modules will tell us which type the archive file is for. What if we don’t have access to GRASS GIS for whatever reason?
Pack files are actually .tar.gz files, so we can use tar to look into the list of contents in a pack file without uncompressing it.
> tar -tf map.pack # I know it's a map, but is it raster or vector? map/cidx map/coor map/dbln map/head map/hist map/sidx map/topo db.sqlite PROJ_INFO PROJ_UNITS PROJ_EPSG
The above pack file is a vector map because there is
db.sqlite, but checking for
db.sqlite only works when a map is linked to a database. We could use
map/dbln because this metadata file always exists, but we have to pass the map name +
/dbln to tar like this:
> tar -tf map.pack map/dbln # exit code 0 if vector, exit code 2 if raster
Let’s take a look at a raster pack file.
> tar -tf map.pack map/PROJ_EPSG map/PROJ_INFO map/PROJ_UNITS map/cats map/cell map/cell_misc/ map/cell_misc/nullcmpr map/cell_misc/range map/cell_misc/stats map/cellhd map/colr map/hist
Unlike the contents of vector pack files, those of racter pack files are all contained inside a root directory. We can use this fact to simplify our check.
> tar -tf map.pack PROJ_INFO > /dev/null 2>&1 # keep it quiet > echo $? # exit code 0 if vector, exit code 2 if raster
In a shell script,
if tar -tf map.pack PROJ_INFO > /dev/null 2>&1; then echo vector else echo raster fi