NCL Website header
NCL Home> Application examples> Miscellaneous || Data files for some examples

Example pages containing: tips | resources | functions/procedures

Subsetting / extracting data based on lat/lon values

Subsetting or extracting your data based on a latitude/longitude region can be done in different ways:

latlon_subset_1.ncl: Data on a rectilinear grid is the easiest to subset, as you can use coordinate subscripting to extract the region of interest.

To find out if your data is on a rectilinear lat/lon grid, use printVarSummary. The output will look something like this:

    Variable: ts
    Type: float
    Total Size: 221184 bytes
                55296 values
    Number of Dimensions: 2
    Dimensions and sizes:[lat | 192] x [lon | 288]
    Coordinates: 
                lat: [ -90..  90]
                lon: [   0..358.75]
    Number Of Attributes: 13
    . . .
    long_name : Surface Temperature
    units : degK
    . . .

Note the "Coordinates" section, which has lat and lon arrays listed under it, along with their ranges. These arrays are known as coordinate arrays. By definition, then, ts is on a rectilinear grid.

To extract a lat/lon region that goes from 30 to 60 latitude and 0 to 50 longitude, use the special "{" and "}" syntax:

  ts_extract = ts({30:60},{0:50})  

Note that the longitudes go from 0 to 358.75. If you want to extract a longitude region using negative longitudes, for example, -130 to -60, then you must first "flip" the longitudes using the lonFlip function:

  ts = lonFlip(ts)
A printVarSummary of ts will now yield:

    Variable: ts
    . . .
    Dimensions and sizes:[lat | 192] x [lon | 288]
    Coordinates: 
                lat: [ -90..  90]
                lon: [-180..178.75]
    Number Of Attributes: 13
    . . .

and you can now subscript with negative longitudes:

  ts_extract = ts({30:60},{-130:-60})  

The first frame of this example shows the full global plot of the data. The second frame extracts a region in Asia using coordinate subscripting. The third frame zooms in on this region and adds a lat/lon grid and markers to further show the region of interest. The gsn_coordinates procedure is used to add the lat/lon grid lines. The fourth frame shows how to subscript the data using negative longitudes, after flipping it.

latlon_subset_2.ncl:

Data on a curvilinear grid, which is data represented by 2D lat/lon arrays, cannot be extracted using "coordinate scripting" mentioned in the first example on this page.

To find out if your data is on a curvilinear lat/lon grid, first try using printVarSummary to print information about the variable. Check if there is an attribute called "coordinates" (not to be confused with the "Coordinates:" section):

Variable: temp
Type: float
Total Size: 15120 bytes
            3780 values
Number of Dimensions: 3
Dimensions and sizes:[lv_SPDY3 | 6] x [gridx_236 | 30] x [gridy_236 | 21]
Coordinates:
Number Of Attributes: 13
. . .
long_name : Temperature
units : degK
_FillValue : 1e+20
coordinates : gridlat_236 gridlon_236

"temp" doesn't have any information in the "Coordinates:" section, so this tells you right away this data is NOT on a rectilinear grid. However, it does have an attribute called "coordinates", which tells you that this variable is represented by latitude and longitude arrays called "gridlat_236" and "gridlon_236". You can look on the same file that you read "temp" from, to see if these two variables are on the file.

To extract a lat/lon region from curvilinear data, use the getind_latlon2d function. Assuming you have a 2D array "temp" with 2D lat/lon arrays that you've read off the file and named "lat2d", "lon2d":

  lat_pts  = (/30,60/)
  lon_pts  = (/ 0,50/)
  ij       = getind_latlon2d(lat2d,lon2d,lat_pts,lon_pts)
  temp_sub = temp(ij(0,0):ij(1,0),ij(0,1):ij(1,1))
The first frame of this example shows the plot of the whole data array, which is regional data that covers the United States. The second frame extracts a region over New Mexico and Colorado using getind_latlon2d. The third frame zooms in on this region and adds a lat/lon grid and markers to further show the region of interest. The gsn_coordinates procedure is used to add the lat/lon grid lines.

See latlon_subset_3.ncl for an example of using region_ind. See latlon_subset_compare_3.ncl for a comparison of both methods.

latlon_subset_3.ncl:

This example is exactly the same as latlon_subset_2 except the region_ind function is used.

What is the difference between the two functions? The getind_latlon2d uses arguments which specify two opposite corners of the region while region_ind's arguments specify the southern- (latS), northern- (latN), western- (latW) and eastern- (latE) most locations.

Clearly, when applied to the data of this example, the grid area difference is small. Different curvilinear grids may result in larger areal differences.

See latlon_subset_2.ncl for an example of using getind_latlon2d. See latlon_subset_compare_3.ncl for a comparison of both methods.

latlon_subset_compare_3.ncl:

This example is a panel plot of the third images from the previous two examples, allowing you to more easily compare the difference between the getind_latlon2d and region_ind functions.

Note that the lat/lon area created by using the region_ind function is slightly larger than the area created by the getind_latlon2d function.

mask_9.ncl: Demonstrates using gc_inout to mask an area in your data array using a geographical outline.

This particular example reads a shapefile to get an outline of the Mississippi River Basin. You then have the option of masking out all areas inside or outside this outline.

Katrina_circle.ncl: This script plots the 5-day running average of precipitation for an entire year (2005). It shows a unique way of displaying filled contours in a circle, by using nggcog in conjunction with gc_inout to mask data inside a great circle.

See the Unique examples page for another version of this script that generates a histogram of the values, and for an animation of both scripts.

This code was contributed by Jake Huff, a Masters student in the Climate Extremes Modeling Group at Stony Brook University.

wrf_gsn_10.ncl This example shows three ways to subset a WRF lat/lon grid by providing two corners of a lat/lon box. Using each method, a spatial average is taken of the data in this box.

The three methods are 1) where, 2) wrf_user_ll_to_ij, 3) getind_latlon2d.

Markers are drawn in the plots to show the area where the data was subsetted, so you can see there is quite a difference in the two methods.

wrf_user_ll_to_ij should only be used on WRF-ARW data. The other methods will work on curvilinear grids.