X

NV5 Geospatial Blog

Each month, NV5 Geospatial posts new blog content across a variety of categories. Browse our latest posts below to learn about important geospatial information or use the search bar to find a specific topic or author. Stay informed of the latest blog posts, events, and technologies by joining our email list!



Not All Supernovae Are Created Equal: Rethinking the Universe’s Measuring Tools

Not All Supernovae Are Created Equal: Rethinking the Universe’s Measuring Tools

6/3/2025

Rethinking the Reliability of Type 1a Supernovae   How do astronomers measure the universe? It all starts with distance. From gauging the size of a galaxy to calculating how fast the universe is expanding, measuring cosmic distances is essential to understanding everything in the sky. For nearby stars, astronomers use... Read More >

Using LLMs To Research Remote Sensing Software: Helpful, but Incomplete

Using LLMs To Research Remote Sensing Software: Helpful, but Incomplete

5/26/2025

Whether you’re new to remote sensing or a seasoned expert, there is no doubt that large language models (LLMs) like OpenAI’s ChatGPT or Google’s Gemini can be incredibly useful in many aspects of research. From exploring the electromagnetic spectrum to creating object detection models using the latest deep learning... Read More >

From Image to Insight: How GEOINT Automation Is Changing the Speed of Decision-Making

From Image to Insight: How GEOINT Automation Is Changing the Speed of Decision-Making

4/28/2025

When every second counts, the ability to process geospatial data rapidly and accurately isn’t just helpful, it’s critical. Geospatial Intelligence (GEOINT) has always played a pivotal role in defense, security, and disaster response. But in high-tempo operations, traditional workflows are no longer fast enough. Analysts are... Read More >

Thermal Infrared Echoes: Illuminating the Last Gasp of a Dying Star

Thermal Infrared Echoes: Illuminating the Last Gasp of a Dying Star

4/24/2025

This blog was written by Eli Dwek, Emeritus, NASA Goddard Space Flight Center, Greenbelt, MD and Research Fellow, Center for Astrophysics, Harvard & Smithsonian, Cambridge, MA. It is the fifth blog in a series showcasing our IDL® Fellows program which supports passionate retired IDL users who may need support to continue their work... Read More >

A New Era of Hyperspectral Imaging with ENVI® and Wyvern’s Open Data Program

A New Era of Hyperspectral Imaging with ENVI® and Wyvern’s Open Data Program

2/25/2025

This blog was written in collaboration with Adam O’Connor from Wyvern.   As hyperspectral imaging (HSI) continues to grow in importance, access to high-quality satellite data is key to unlocking new insights in environmental monitoring, agriculture, forestry, mining, security, energy infrastructure management, and more.... Read More >

1345678910Last
6212 Rate this article:
No rating

The merits of an example main program

Anonym

When I write a new routine in IDL—a procedure or a function or a class—I like to include a main program at the bottom of the file. I use the main program to

  • demonstrate the calling syntax of the routine
  • give an example of how the routine is used
  • define a simple unit test (or tests)

I first saw this idea used in Python and I’ve copied it for my work in IDL. For example, here’s the full code listing for a simple function, FLATTEN (which converts a multidimensional array into a vector) along with an example main. The programs are saved in the file flatten.pro, in a directory in IDL’s path.

; docformat = 'rst' 
;+ 
; A convenience routine that flattens/linearizes a 
; multidimensional array. 
; 
; :params: 
;  x : in, required, type=any array 
;   An array of any type to be converted to a vector. 
; 
; :author: 
;  Mark Piper, VIS, 2011 
;-
function flatten, x
   compile_opt idl2

   nx = n_elements(x)
   return, nx gt 0 ? reform(x, nx) : 0
end

; Example
a = indgen(5, 7)
b = flatten(a)
c = reform(a, n_elements(a))
help, a, b, c
print, 'Equivalent results? ', array_equal(b, c) ? 'Y' : 'N'
end 

By examining the main program, you can see how FLATTEN works; here, it’s used to convert a 5 x 7 array into a 35-element vector. To use the main program as an example, I execute it from the command line with the .run executive command:

IDL> .r flatten
% Compiled module: FLATTEN.
% Compiled module: $MAIN$.
A               INT       = Array[5, 7]
B               INT       = Array[35]
C               INT       = Array[35]
Equivalent results? Y

The .run command compiles both routines and executes the main program. We’d get the same behavior from the Run button (or the F8 keyboard shortcut) in the IDL Workbench. Note that—and this is important—the calling mechanism still resolves the FLATTEN function (by itself) correctly:

IDL> .reset
IDL> x = indgen(2,3)
IDL> print, x
      0       1
      2       3
      4       5
IDL> y = flatten(x)
% Compiled module: FLATTEN.
IDL> print, y
      0       1       2       3       4       5

This means that (as intended) FLATTEN can be used as a library routine independent of its example main program. I find this technique of including an example main to be especially useful with functions, which won’t execute with the Run button on the Workbench. (This may be a topic for another post, where I'd like to argue for an implicit redirect to !null for functions; e.g., FLATTEN could be called like this:

IDL> flatten(x)

without throwing a syntax error.) Note: ENVI 5 was released this week. It has a new UI and a new API. The API still uses IDL, but with an object-oriented interface. Though I'm not a heavy ENVI user, I'd like to show some examples of using the new API over the next few weeks and months.

Please login or register to post comments.