Updates to the MAPGRID function
Prior to IDL 8.2, the labels used on the graticule produced by MAPGRID
were hardcoded (e.g., 30o
E or 15o
S). Now, with the LABEL_FORMAT
property, you can provide a callback function to create labels with custom formatting. Also, through the LATITUDES
properties, you can get references for the individual lines of latitude/longitude and change properties on them. These three properties are described in the IDL Help, but I want to elaborate on the documentation with an example.
Start by defining a callback function that can be used by MAPGRID:
function make_mapgrid_labels, orientation, location, fractional, default_label
if location eq 0 then $
return, orientation ? ' Equator ' : ' Prime Meridian '
label = strtrim(round(abs(location)),2)
prefix = location gt 0 ? '+' : '-'
return, prefix + label
This routine is what MAPGRID will use to define its labels when specified by the LABEL_FORMAT property. It has four required arguments. Orientation
is 0 for a line of longitude and 1 for a line of latitude. Location
gives the value of the line of longitude or latitude. Fractional
are not used here, but are described in the Help.
This callback function assigns eponymous labels for the equator and the prime meridian, while other lines of latitude and longitude are marked with plus and minus signs; e.g., 30o
E becomes +30 while 15o
S becomes -15.
Compile this routine before continuing:
IDL> .compile make_mapgrid_labels
Now call MAP, specifying the callback routine above with the LABEL_FORMAT property, to set up a projection:
IDL> m = map('Cylindrical Equal Area', standard_parallel=-30, $ ; Behrmann
> center_longitude=15, $
> limit=[-40,-30,40,60], $
> label_position=0, $ ; labels bottom and left
> label_format='make_mapgrid_labels', $ ; callback for formatting
> background_color='medium sea green', $
> title='Behrmann Projection')
With LABEL_POSITION, I chose to position the grid labels on the left and bottom of the map, but I wasn't happy with the appearance of the label for the prime meridian. With the LONGITUDES property, I can get an array of references for all the lines of longitude:
IDL> glon = m.mapgrid.longitudes
IDL> help, glon
GLON OBJREF = Array
and change the properties of the line representing the prime meridian. Getting the index of this line from this array of references was a little harder than I'd anticipated. I wrote a quick helper routine to pick it (it has a LOCATION of 0) out of the array of longitudes:
function get_zero_index, line_array
vals = list()
foreach line, line_array do vals.add, fix(line.location)
return, where(vals.toarray() eq 0, /null)
Compile this routine:
IDL> .compile get_zero_index
and use it to get the index of the prime meridian; also change the color of the prime meridan as well as the alignment of its label:
IDL> prime_meridian = glon[get_zero_index(glon)]
IDL> prime_meridian.label_align = 0.0
IDL> prime_meridian.color = 'navy'
For completeness, I performed the same steps to highlight the equator:
IDL> glat = m.mapgrid.latitudes
IDL> equator = glat[get_zero_index(glat)]
IDL> equator.label_align = 0.0
IDL> equator.color = 'navy'
Finish by displaying the continents:
IDL> c = mapcontinents(fill_color='wheat')
Here's my result:
Please feel free to grab my example code here