National Oceanic and
Atmospheric Administration
United States Department of Commerce

Reading ascii data representing a grid

Reading ascii data representing a grid

Question:

How can I read my ASCII data file which lists the longitudes and latitudes of a grid, and the data values?

Explanation:

If the data looks something like this:

 219.0 11.00 -4916.
221.0 11.00 -4872.
223.0 11.00 -4923.
225.0 11.00 -4900.
227.0 11.00 -4818.
219.0 13.00 -4864.
221.0 13.00 -4855.
223.0 13.00 -4832.
225.0 13.00 -4846.
227.0 13.00 -4825.
219.0 15.00 -5010.
221.0 15.00 -4849.
223.0 15.00 -4785.
225.0 15.00 -4815.
227.0 15.00 -4959.

with the columns representing longitude, latitude, variable. If we try just these commands:

yes? FILE/VAR=xpoints,ypoints,bathy myfile.txt
yes? DEFINE AXIS/X/UNITS=degrees_east xpoints
**ERROR: improper grid or axis definition: data for DEFINE AXIS/FROM_VARIABLE is not monotonic

The data in the first two columns represent the 2D grid, so they repeat points. We need a bit more analysis to get the right definitions for the axes.

Solution:

1) If we're just doing one file, and if the grid is regularly-spaced grid, we can just look at the file and define the correct axes:

yes? DEFINE AXIS/X=221:227:2/UNITS=degrees_east xaxis
yes? DEFINE AXIS/Y=11:15:2/UNITS=degrees_north yaxis

(using whatever the true ranges and delta-values are in the file)

yes? ! Define the grid and read, skipping the first two values in each input record.
yes? DEFINE GRID/X=xaxis/Y=yaxis xygrid
yes? FILE/VAR="dummy1,dummy2,bathy" myfile.txt

2) For a more general script, or if the spacing of the grid is noteven, then you'll need to first use the data in the file to define theaxes and then define a grid to read the data field. (Try LIST or PLOTcommands with these different variables to see what we're doing here.)

yes? ! First read just the points defining the grid.

yes? FILE/VAR="xpoints,ypoints" myfile.txt

yes? ! The first N points of the variable xpoints will define the x axis.
yes? ! Let's find where xpoints starts to repeat itself.
yes? ! Where does the first derivative cross zero?

yes? LET xdif = xpoints[I=@DDF]
yes? LET xcross = xdif[I=@EVNT:0]

yes? ! use LIST commands to check what we've done
yes? LIST/I=1:15 xpoints, xdif, xcross
DATA SET: ./myfile.txt
X: 0.5 to 15.5
Column 1: XPOINTS
Column 2: XDIF is XPOINTS[I=@DDF]
Column 3: XCROSS is XDIF[I=@EVNT:0]
XPOINTS XDIF XCROSS
1 / 1: 219.0 2.000 0.000
2 / 2: 221.0 2.000 0.000
3 / 3: 223.0 2.000 0.000
4 / 4: 225.0 2.000 0.000
5 / 5: 227.0 -8.000 1.000
6 / 6: 219.0 2.000 2.000
7 / 7: 221.0 2.000 2.000
8 / 8: 223.0 2.000 2.000
9 / 9: 225.0 2.000 2.000
10 / 10: 227.0 -8.000 3.000
11 / 11: 219.0 2.000 4.000
12 / 12: 221.0 2.000 4.000
13 / 13: 223.0 2.000 4.000
14 / 14: 225.0 2.000 4.000
15 / 15: 227.0 .... 4.000

yes? ! The @LOC tranform tells where the xdif variable crosses 0
yes? ! This is the length of the x axis

yes? LET npts = `xcross[I=@LOC:1]`
!-> DEFINE VARIABLE npts = 5

yes? ! Now use the first npts of the data from the file
yse? ! to define the longitude axis

yes? DEFINE AXIS/X/UNITS=degrees_east xaxis = xpoints[I=1:`npts`]
 !-> DEFINE AXIS/X/UNITS=degrees_east xaxis = xpoints[I=1:5]

yes? ! Now for the y axis we want the first value of ypoints,
yes? ! then one point every `npts` after that

yes? LET total = `ypoints,RETURN=isize` ! total points read from the file
!-> DEFINE VARIABLE total = 15

yes? DEFINE AXIS/Y/UNITS=degrees_north yaxis=ypoints[I=1:`total`:`npts`]
!-> DEFINE AXIS/Y/UNITS=degrees_north yaxis=ypoints[I=1:15:5]


yes? ! Now define the grid and re-open the file to read the variable.

yes? CANCEL DATA myfile.txt

yes? DEFINE GRID/X=xaxis/Y=yaxis xygrid
yes? FILE/VAR="dummy1,dummy2,bathy"/GRID=xygrid myfile.txt