IDL 8.9 Release Notes

Refer to the IDL Help for instructions on using the tools and API. Access the help by selecting Help > Help Contents from the IDL menu bar. Then click "IDL" in the table of contents on the left side of the help page.

See Platform Support for ENVI 5.7 and IDL 8.9 for additional details.

See the following sections:

New Features

New Licensing Engine

This version includes a new licensing engine. The same activation codes you used to activate your previous version of IDL can also be used to activate your new license. If you still have your legacy license installed, the License Administrator will be able to detect it and migrate your license.

ASDF (Advanced Scientific Data Format) File Support

IDL now supports reading and writing files in the ASDF (Advanced Scientific Data Format) file format. The ASDF_Parse function is used to read ASDF files into IDL, while ASDF_Write is used for creating ASDF files. The IDL ASDF reader/writer provides a straightforward, simple way to access and modify data using simple array notation via an ASDF_ile class. The new ASDF_NDAray class allows for easy translation of ASDF/Python ndarray arrays to/from IDL arrays. For example, to create a simple ASDF file, then read it back into IDL:

a = ASDF_File('mydata', randomu(seed, 100, 50))

ASDF_Write, 'myfile.asdf', a

af = ASDF_Parse('myfile.asdf')

help, af

help, af['mydata']

help, af['mydata', 'data']

IDL prints:

AF ASDF_FILE <ID=28 NELEMENTS=3> TAG='!core/asdf-1.1.0' GLOBAL_TAGS=1

<Expression> ASDF_NDARRAY <ID=27> float32 [50,100] internal

<Expression> FLOAT = Array[100, 50]

Complex Number Constants

You can now use "i" and "j" as suffixes to create complex numbers. For example:

help, 1 - 2i, 3.14i, 1 + 2d-20i

<Expression> COMPLEX = ( 1.00000, - 2.00000)

<Expression> COMPLEX = ( 0.00000, 3.14000)

<Expression> DCOMPLEX = ( 1.0000000, 2.0000000e-20)

Creating complex numbers this way is significantly faster than using the COMPLEX or DCOMPLEX functions. See Defining and Using Constants for details.

You can also input complex numbers from files or strings using this notation:

IDL> num = 0i ; create a complex zero

IDL> reads, '1+2i', num ; complex number cannot contain spaces

IDL> help, num

NUM COMPLEX = ( 1.00000, 2.00000)

Binary, Octal, and Hexadecimal Constants

You can now use the special prefixes 0b, 0o, and 0x to construct binary, octal, and hexadecimal number constants:

help, 0b101110111100, 0o777, 0xFA62, BigInteger('0xFFFFFF')

<Expression> INT = 3004

<Expression> INT = 511

<Expression> LONG = 64098

<Expression> BIGINTEGER <ID=7 LENGTH=24 bits> = 16777215

These prefixes can be combined with the usual integer suffixes (b, s, l, u) to construct integers of different types.

The prefixes can also be used when reading input from files or strings.

IDL> num = 0L

IDL> reads, "0x2000", num

IDL> help, num

NUM LONG = 8192

IDL> reads, '0o777', num

IDL> help, num

NUM LONG = 511

IDL> reads, '0b101110111100', num

IDL> help, num

NUM LONG = 3004

To print out these numbers or convert them to strings, use %x, %o, or %b:

IDL> print, 8192, 511, 3004, format='%x %o %b'

2000 777 101110111100

See Defining and Using Constants for details.

Gabor Transform Filter

The new GABOR_KERNEL and GABOR_FILTER functions can be used to perform a complex Gabor filter on two-dimensional arrays. The Gabor filter consists of a sinusoidal wave in a particular orientation, with a Gaussian envelope that limits the effect to a localized region around each point in the image. The filter is useful for edge detection and texture analysis.

Gabor Demo Application

The new gabor_demo_app procedure (in the examples/doc/image subdirectory) can be used to explore different Gabor parameters for the Gabor filter function. You can open different image files, tweak the parameter values, and then see the new kernel function on the left and the filter results on the right superimposed on the original image.

Template Literal Strings

You can now create template literal strings using backtick characters. These template literal strings can contain IDL expressions (evaluated at runtime) and can span multiple lines, with all whitespace and line breaks preserved in the final string (hence the word "literal"). The strings can also contain special characters such as line breaks.

For example:

a = [1, 2, 3, 4, 5]

result = `There are ${total(a gt 2, /int)} matches\nin the array ${a}.`

print, result

IDL prints:

There are 3 matches

in the array [1,2,3,4,5].

For more details see Template Literal Strings.

FLOAT64 and IDL3 Compile Options

The new FLOAT64 compile option indicates that floating-point constants will default to the 64-bit DOUBLE type rather than the usual 32-bit FLOAT type. Floating-point constants with an "e" exponent will remain as 32-bit floats. The new IDL3 compile option is a shortcut for the compile options DEFINT32, FLOAT64, LOGICAL_PREDICATE, and STRICTARR. For more details see COMPILE_OPT.

YAML (YAML Ain't Markup Language) Support

IDL can now parse YAML strings and files using YAML_PARSE. You can also convert IDL hash, list, and other datatypes to YAML using YAML_SERIALIZE.


Array Concatenation

You can now concatenate IDL arrays using up to 8 nesting levels of brackets (the previous limit was 3 levels). For example:

IDL> a = fltarr(2,2,2,2,2,2,2,2)

IDL> b = a

IDL> help, [a, b]

<Expression> FLOAT = Array[4, 2, 2, 2, 2, 2, 2, 2]

IDL> help, [[[[a]]], [[[b]]]]

<Expression> FLOAT = Array[2, 2, 2, 4, 2, 2, 2, 2]

IDL> help, [[[[[[[[a]]]]]]], [[[[[[[b]]]]]]]]

<Expression> FLOAT = Array[2, 2, 2, 2, 2, 2, 2, 4]

See Creating Arrays for details.


The CONVOL function has a new EDGE_REFLECT keyword, which will treat values at the array edge as reflected. This is similar to the EDGE_MIRROR keyword except the point at the very edge is not repeated. For example, if the array values are represented by "abcdefg" then the effective array will be "gfedcb|abcdefg|fedcba".


The ISA function has a new UNSIGNED keyword, which will return true for unsigned integer variables, and false otherwise.


The JSON_SERIALIZE function has a new PRETTY keyword, which will output the JSON in a "pretty" format with line breaks and indentation using spaces.

h3>Python Bridge Installation

The process for installing the IDL-to-Python and Python-to-IDL bridges has been streamlined and made more robust. See Python Bridge for details.

Support Removed for 32-bit IDL

Support for running IDL in 32-bit mode has been removed. This also includes removing COM Object-Import (IDLcomIDispatch) and DXF file format (IDLffDXF) support.

Library Updates

The 3rd party libraries listed below have been updated to these versions:

  • CDF 3.8.1

    • New CDF_READCDF routine

    • New CDF_READVARIABLE routine

  • curl 7.88.1
  • ffmpeg 4.4.3
  • jackson-json-processor 2.14.2
  • libtiff 4.5.0
  • libxml2 2.10.3
  • openssl 1.1.1t
  • sqlite 3.41.2
  • x11-xpm 3.5.15
  • zlib 1.2.13

The following 3rd party libraries have been added:

  • rapidyaml 0.5.0

The following 3rd party libraries have been removed:

  • IDL Python Bridge support for Python 3.7

Fixed Issues

Issue Description
IDL-69692 JULDAY and CALDAT were returning slightly inaccurate results - added MODIFIED keyword
IDL-69844 TEXT graphic was taking a very long time to render large number of inputs
IDL-69902 FILE_GUNZIP failed to read more than 4GB into a variable with BUFFER keyword
IDL-69913 I18N:FILE_ZIP didn't handle extended ascii characters correctly
IDL-69970 FILE_UNZIP was causing an error with Sentinel 2 data
IDL-70263 MAKE_RT was failing on Mac due to permissions on activate
IDL-70598 FILE_ZIP was not compressing folders correctly
IDL-70683 Java->IDL Export Bridge didn't support licensing modes in IDL 8.6+
IDL-70774 PRINT, PRINTF, STRING: FORMAT keyword had a memory leak
IDL-70804 WIDGET_PROPERTYSHEET was segfaulting IDL on Ubuntu 18+ & RHEL/Centos 7.9+
IDL-70805 When unpacking a .tgz file using FILE_GUNZIP, the size was growing rapidly.
IDL-70806 IDL’s FILE_UNTAR routine did not support subdirectories.
IDL-70842 .edit Editor tab focus behaved unexpectedly when another program is at a STOP
IDL-70865 Screen size and resolution returned by IDLDE and IDL command line were not the same
IDL-70866 IDL interpreter was halting at the wrong place after list/hash calls
IDL-70872 WIDGET_SLIDER default scroll wheel action was 3 units on Linux, when it used to be 1
IDL-70873 Could not execute MAKE_RT application from app on macOS Monterey
IDL-70902 Executing anything in IDL Workbench console while stopped at breakpoint caused editor to jump back to breakpoint
IDL-70903 WRITE_PNG should not be 32-bit limited --- could not write more than ~700 megapixels
IDL-70904 An array contained by a hash could not be properly subscripted
IDL-70908 With MacOS firewall enabled, user needed to "allow" IDLDE on every launch
IDL-70911 COM->IDL Export Bridge didn't support licensing modes in IDL 8.6+
IDL-70912 Implied print with floats produced invalid JSON
IDL-70918 .RUN was not working correctly in IDL 8.8.2
IDL-70930 HIST_EQUAL was returning incorrect results for values on the edge of the scale range
IDL-70938 IDL was crashing with LISTS and SAV files with structures containing null strings
Please login or register to post comments.


Sign up to receive the latest news, events, technologies, and special offers.