[postgis-users] POSTGIS DTED...

David Blasby dblasby at refractions.net
Tue May 13 15:06:48 PDT 2003

Jan Hartmann wrote:

> Dave, if you have time, could you give some more information on this 
> CHIP type. I never heard of it.

[PAUL - please add this documentation to the website]

It is fairly simple.  I created it when we did TerrainServer 
 (http://www.refractions.net/terrainserver/) to 3D-ify WMS and mapserver 
webmaps.  Currently our TerrainServer database contains the entire USA 
DEM at 30m, and large chunks at 10m.  We also have the British Columbia 
DEM at 25m.

The CHIP structure looks like this (postgis.h):

typedef struct chiptag
        int     size; //unused (for use by postgresql)

        int     endian_hint;  // the number 1 in the endian of this 

        BOX3D    bvol;
        int      SRID;
        char     future[4];
        float  factor;           //usually 1.0.  Integer values are 
multiplied by this number
                              //to get the actual height value (for 
sub-meter accuracy
                                        //height data).

        int     datatype;        // 1 = float32, 5 = 24bit integer, 6 = 
16bit integer (short)
                                 // 101 = float32 (NDR), 105 = 24bit 
integer (NDR), 106=16bit int (NDR)
        int     height;
        int     width;
        int   compression;      //# 0 = no compression, 1 = differencer
0x80 = new value
0x7F = nodata

                // this is provided for convenience, it should be set to
                //  sizeof(chip) bytes into the struct because the 
serialized form is:
                //    <header><data>
                // NULL when serialized
        void  *data;            // data[0] = bottum left, data[width] = 
1st pixel, 2nd row (uncompressed

So its basically a little header and the actual raser data - as simple 
as can be.

The functions in postgis_chip.c are used to manipulate this structure:

CHIP_in() -- ASCII to internal binary. Required by Postgresql for SQL 
CHIP_out() -- internal binary to  ASCII.  Required by Postgresql for  
SQL representation
CHIP_to_geom() -- creates a polygon based on the bvol of the grid
srid_chip() -- get the SRID of the grid
factor_chip() - get the multiplication factor of the chip
datatype_chip() - get the datatype number of the chip
compression_chip() - get the compression type of the chip
height_chip() - get the height of the chip
width_chip() - get the width of the chip
setsrid_chip() - create a new chip with a new SRID
setfactor_chip() - create a new chip with the factor multiplication 
changed (usefull for changing the units of the data)

The ASCII representation is like the WKB representation - a direct HEX 
dump of a chip.

The functions provided in PostGIS are very simple - its basically a bit 
bucket.  The actual manipulation of the CHIP is usually preformed by an 
external program.

The CHIP doesnt have a direct way of  indexing.  The easiest way to do 
this create a table like this:

CREATE TABLE myRaster (mychip chip, mybox geometry);

Then put all your chips in, and run this to fill in the mybox column:

UPDATE myRaster SET mybox = geometry(mychip);

And build an index:

CREATE INDEX myspatial_index ON myRaster USING GIST mybox 

Then use the mybox column to do index-supported spatial queries.


More information about the postgis-users mailing list