Surfer 7 Grid File Format
Surfer 7 grid files .GRD use a tag-based binary format to allow for future enhancements. Each section is preceded by a tag structure, which indicates the type and size of the following data. If a program does not understand or want a particular type of data, it can read the associated tag and quickly skip to the next section. In general, sections can appear in any order except for the first, which must be a Header section.
Data types used in Surfer 7 grid files:
Type |
Description |
long |
32 bit signed integer |
double |
64 bit double precision floating point value |
Each section is preceded by a tag structure with the following format:
Element |
Type |
Description |
Id |
long |
The type of data in the following section. See the next table for a list of valid values. |
Size |
long |
The number of bytes in the section (not including this tag). Skipping this many bytes after reading the tag will align the file pointer on the next tag. |
Tag ID Values
Tag Id values. The 0x prefix indicates a hexadecimal value:
Id |
Description |
0x42525344 |
Header section – must be the first section within the file. |
0x44495247 |
Grid section – describes a 2D matrix of Z values. |
0x41544144 |
Data section – contains a variable amount of data. The size of the data section is given by the Size field in the tag structure. |
0x49544c46 |
Fault Info section – describes the fault traces used when creating the grid. |
Header Section
The Header section must be the first section in the file and has the following format:
Element |
Type |
Description |
Version |
long |
Version number of the file format. Can be set to 1 or 2 |
If the version field is 1, then any value >= BlankValue will be assigned the NoData value using Surfer’s NoData value, 1.70141e+038.
If the version field is 2, then any value == BlankValue will be assigned the NoData value using Surfer’s NoData value, 1.70141e+038.
Grid Section
The Grid section consists of a header that describes a 2D matrix of values, followed by the matrix itself. This section encapsulates all of the data that was traditionally referred to as a grid:
Element |
Type |
Description |
nRow |
long |
number of rows in the grid |
nCol |
long |
number of columns in the grid |
xLL |
double |
X coordinate of the lower left corner of the grid |
yLL |
double |
Y coordinate of the lower left corner of the grid |
xSize |
double |
spacing between adjacent nodes in the X direction (between columns) |
ySize |
double |
spacing between adjacent nodes in the Y direction (between rows) |
zlo |
double |
minimum Z value of the grid. NoData nodes are not included in the minimum. |
zhi |
double |
maximum Z value of the grid. NoData nodes are not included in the maximum. Note that if all nodes are NoData nodes, the zlo=zhi= 1.70141e38. |
BlankValue |
double |
nodes are assigned NoData if greater than or equal to this value. NoData values appear as 1.70141e38. |
Data Section
A Data section containing the 2D matrix of values (doubles) must immediately follow a Grid section. Within the Data section, the grid is stored in row-major order, with the lowest row (minimum Y) first
Fault Info Section
A Fault Info section describes the fault geometry used to create the grid. Fault Info sections have the following format:
Element |
Type |
Description |
nTraces |
long |
number of fault traces (polylines) |
nVertices |
long |
total number of vertices in all the traces |
data section |
variable-sized data block consisting of an array of Trace structures immediately followed by the array of vertices |
Data Section
A Data section containing an array of Trace structures and an array of Vertex structures must immediately follow a Fault Info section. The number of Trace structures in the array is nTraces, and the number ofVertexstructures is
Trace Structure
Element |
Type |
Description |
iFirst |
long |
0-based index into the vertex array for the first vertex of this trace |
nPts |
long |
number of vertices in this trace |
Vertex Structure
Element |
Type |
Description |
x |
double |
X coordinate of the vertex |
y |
double |
Y coordinate of the vertex |
Example
The following example illustrates the layout for a 5 row by 10 column grid:
Element |
Type |
Description |
0x42525344 |
long |
Tag: Id for Header section |
4 |
long |
Tag: Size of Header section |
1 |
long |
Header Section: Version |
0x44495247 |
long |
Tag: ID indicating a grid section |
72 |
long |
Tag: Length in bytes of the grid section |
5 |
long |
Grid Section: nRow |
10 |
long |
Grid Section: nCol |
0.0 |
double |
Grid Section: xLL |
0.0 |
double |
Grid Section: yLL |
1.0 |
double |
Grid Section: xSize |
1.75 |
double |
Grid Section: ySize |
25.0 |
double |
Grid Section: zMin |
101.6 |
double |
Grid Section: zMax |
0.0 |
double |
Grid Section: Rotation |
1.70141e38 |
double |
Grid Section: BlankValue |
0x41544144 |
long |
Tag: ID indicating a data section |
400 |
long |
Tag: Length in bytes of the data section (5 rows x 10 columns x 8 bytes per double) |
Z11, Z12, … |
double |
Data Section: First (lowest) row of matrix. 10 doubles |
Z21, Z22, … |
double |
Data Section: Second row of matrix. 10 doubles |
Z31, Z32, … |
double |
Data Section: Third row of matrix. 10 doubles |
Z41, Z42, … |
double |
Data Section: Fourth row of matrix. 10 doubles |
Z51, Z52, … |
double |
Data Section: Fifth row of matrix. 10 doubles |