IDL 9.1新特性

ENVI-IDL技术殿堂發表於2024-10-21

IDL 9.1版本具有以下新增功能和更新:

新增功能:

  • Windows 小部件的深色模式
  • 球諧變換
  • GAUSS_QUAD_LEGENDRE 功能
  • 讀取和轉換 float16/binary16 半精度浮點數
  • 命令列進度條
  • IDL_HASHVAR 功能
  • 新的 SVG 圖示
  • RENDER_SVG 功能
  • RENDER_ICON 功能
  • SVG_ICON_BROWSER 例程

更新功能:

  • VS Code 的 IDL 擴充套件
  • HDF5 可以處理空陣列
  • HttpRequest 進度條
  • IDL_String::替換新的 Count 引數
  • 對 NaN 和 Infinity 值的 JSON 支援
  • LEGEND 填充顏色
  • MapContinents Shapefile
  • 多行工具提示
  • PRINT/PRINTF 新的 NEWLINE 關鍵字
  • Shapefile 增強
  • TS_SMOOTH新的 NAN 關鍵字
  • WIDGET_BROWSER 支援
  • WIDGET_LABEL 和 WIDGET_TEXT 文字和背景顏色
  • WIDGET_PROPERTYSHEET Top Header 關鍵字
  • WIDGET_TEXT 對齊關鍵字
  • WIDGET_TEXT FRAME = 0
  • WRITE_PNG 壓縮關鍵字
  • Dataminer 安裝

1 新功能

1.1 Windows 小部件的深色模式

在 Windows 上,IDL 小部件現在支援深色模式主題。您可以使用新的 IDL 首選項IDL_THEME 更改小部件主題,該首選項可以設定為 0 表示淺色模式(預設),設定為 1 表示深色模式。可以使用 IDL Workbench 中的首選項對話方塊或使用 PREF_SET 例程來設定主題首選項。新的只讀系統變數 !THEME允許您確定首選項的當前值。

一些一般說明:

  • 在 Windows 上,所有 IDL 小部件應用程式(包括 ENVI)都將遵循主題設定。
  • 如果您更改主題,則必須重新啟動 IDL 才能使更改生效。
  • IDL 小元件主題獨立於 Windows 系統主題設定。
  • IDL Workbench 有自己的主題設定,與此設定無關。
  • 直接圖形視窗和物件圖形視窗中的圖形不受影響。
  • Linux 和 Mac 平臺將預設忽略主題首選項,並始終使用淺色模式。

1.2 球諧變換

IDL 現在具有用於執行正向和逆向球諧變換的內建函式。

SPHERE_HARM_FORWARD 函式使用 Gauss-Legendre 演算法來計算球面座標網格上二維輸入陣列的正向球面諧波變換。SPHERE_HARM_INVERSE 函式計算逆向球諧變換,並在球面座標網格上返回結果。正向變換和逆向變換都是用 C 程式碼編寫的,並且是多執行緒的,以實現最佳效能。

球諧變換是在全球資料集上分析波型的有用工具,廣泛用於氣象學和海洋學,以及地磁場和太陽磁場的研究。正向和逆向變換對於應用頻譜濾波器也很有用。在這種情況下,執行正向變換,然後對頻譜系數應用濾波函式,之後執行逆變換。

除了轉換函式之外,IDL 現在還有兩個新例程:SPHERE_HARM_FILTER 和 SPHERE_HARM_KERNEL。這些例程可用於對球面資料集進行光譜過濾,以保持波數長於特定閾值。

例如,這裡我們載入一些 1884 年 12 月 1 日的氣溫資料,然後計算 T63 截斷:

restore, filepath('reanl20v3_1dec1884_512x256dbl.sav', $
  subdir=['examples', 'data'])
T63 = sphere_harm_filter(A, 63)
im = image(A, rgb_table = 75, layout=[1, 2, 1], $
  dim=[550, 580], min = -30, max = 30)
im = image(T63, rgb_table = 75, /current, $
  layout=[1, 2, 2])

這些例程基於 Mark Miesch、Marc DeRosa 和 Gilbert P. Compo 編寫的原始變換和過濾例程,並經許可使用。有關更詳細的示例以及資料來源和參考,請參閱 SPHERE_HARM_FORWARD。

1.3 GAUSS_QUAD_LEGENDRE 功能

新的 GAUSS_QUAD_LEGENDRE 函式計算高斯正交積分的 x 值(橫座標)和加權係數,其中 x 值是 N 階勒讓德多項式(Legendre polynomial)的根。GAUSS_QUAD_LEGENDRE基於劍橋大學出版社出版的 Numerical Recipes in C: The Art of Scientific Computing(第二版)第 4.5 節中描述的gauleg例程,並經許可使用。

1.4 讀取和轉換 float16/binary16 半精度浮點數

半精度浮點數的長度為 16 位,而單精度浮點數的長度為 32 位,雙精度浮點數的長度為 64 位。這些數字的標準格式稱為 float16(或 binary16),基於 IEEE 754 標準。儘管 IDL 沒有原生支援16 位浮點數,但 IDL 現在可以讀取和轉換 float16 數字。READ_BINARY 函式有一個新的 FLOAT16 關鍵字,它會自動從檔案中讀取 float16 數字並將其轉換為 32 位浮點數。此外,您還可以使用新的 FLOAT16_DECODE 和 FLOAT16_ENCODE 函式將 16 位無符號整數(float16 格式)與 32 位浮點數相互轉換。

例如:

a = uint([0, 1, 0x8001, 0x3ff, 0x3c00, 0xbc00, 0x7bff, 0x7c00, 0xfc00, 0x7fff])
b = float16_decode(a)
help, b
print, b

IDL 列印:

B    FLOAT  =  Array[10]
0.00000   5.96046e-08   -5.96046e-08   6.09756e-05   1.00000   -1.00000   65504.0   Inf   -Inf   NaN

現在轉換回來:

c = float16_encode(b)
help, c
print, c, format='(10z)'

IDL 列印:

C    UINT  =  Array[10]
0   1   8001   3ff   3c00   bc00   7bff   7c00   fc00   7fff

有關詳細資訊,請參閱 FLOAT16_DECODE、FLOAT16_ENCODE 和 READ_BINARY。

1.5 命令列進度條

新的 CLI_Progress 類在 IDL Workbench 控制檯中或在終端中執行 IDL 時實現命令列進度條。例如:

length = 1000 ; for example, file length in bytes
cli_progress.initialize, title = 'Download', maximum = length, /remaining
for i=0,length do begin & $
  cli_progress.update, i & $
  wait,0.01 & $
endfor

在這裡,進度條將從 0% 緩慢前進到 100%,類似於:

Download  46% [##################----------------------] 6m:27s

CLI_Progress 類具有用於控制條寬、字元、剩餘時間以及標題和文字訊息的選項。您還可以構建一個“乒乓”選取框進度條,其中進度指示器沿進度條來回彈跳。例如:

CLI_Progress.Initialize, ping_pong = !true, complete_char = "<IDL>"
for i = 0,114 do begin & $
  CLI_Progress.Update & $
  wait, 0.02 & $
endfor

<IDL> 這個詞來回跳動:

[-----------------------------------<IDL>-----]

有關更多資訊,請參閱 CLI_Progress 或訪問 CLI_Progress 示例頁面。

1.6 IDL_HASHVAR 功能

IDL 有一個新的 IDL_HASHVAR 函式,該函式接受任何 IDL 變數並返回表示該值的標量 32 位雜湊程式碼。IDL_HASHVAR 函式用於建立簡單的雜湊碼值,可用於將任意值轉換為具有均勻分佈的 32 位(四位元組)雜湊碼。它還可以用於確定兩個字串是否相同,因為字串中的微小差異(例如單個字元)將產生完全不同的雜湊值。有關更多詳細資訊,請參閱 IDL_HASHVAR。

1.7 新的 SVG 圖示

IDL 現在附帶了 Font Awesome 專案中的 2000 多個新圖示。這些圖示可以在 IDL 發行版的以下目錄中找到:

<IDL_DIR>/resource/bitmaps/svg/brands

<IDL_DIR>/resource/bitmaps/svg/regular

<IDL_DIR>/resource/bitmaps/svg/solid

您可以使用新SVG_ICON_BROWSER顯示所有圖示,也可以使用新的 RENDER_ICON 和 RENDER_SVG 函式來訪問它們。所有這些圖示均根據 Creative Commons Attribution 4.0 International License 分發,可以在您自己的應用程式中自由使用。

1.8 RENDER_SVG 功能

IDL 具有一個新的 RENDER_SVG 函式,該函式可以將 SVG 檔案渲染為具有可選輸出大小、背景色和前景色的點陣圖影像。例如:

file = filepath('folder-open.svg', subdir=['resource', 'bitmaps', 'svg', 'regular'])
img = RENDER_SVG(file, width=128, height=128, background=0xCCCCCC, foreground=0xFF0000)
help, img
i = image(img)

IDL 列印:

IMG BYTE = Array[128, 128, 3]

1.9 RENDER_ICON 功能

IDL 具有一個新的 RENDER_ICON 函式,可從 IDL 中的 SVG 檔案建立圖示。例如:

w = widget_base(/row)
icon = RENDER_ICON("folder-open")
w1 = widget_base(w)
wb = widget_button(w1, value=icon, /bitmap)
icon = RENDER_ICON("folder-open", width=32, height=32)
w1 = widget_base(w)
wb = widget_button(w1, value=icon, /bitmap)
icon = RENDER_ICON("folder-open", width=64, height=64)
w1 = widget_base(w)
wb = widget_button(w1, value=icon, /bitmap)
widget_control, w, /realize

1.10 SVG_ICON_BROWSER 例程

IDL 增加了一個新的 SVG_ICON_BROWSER 例程,用於顯示 IDL 附帶的所有 2000+ 圖示的縮圖。瀏覽器有一個過濾器,還會顯示各個圖示的示例程式碼,以及快速檢視該圖示在各種視窗小部件型別中的顯示方式。有關詳細資訊,請參閱 SVG_ICON_BROWSER。

2 功能更新

2.1 VS Code 的 IDL 擴充套件

IDL 現在擁有了一個新的現代化開發環境,可在 Visual Studio Code 中免費使用。可以從 VS Code 擴充套件頁面輕鬆下載和安裝 VSCode 擴充套件的 IDL。該擴充套件具有以下功能:

  • 功能齊全的 IDL 程式碼編輯器,具有變數型別檢測、自動完成、色彩編碼、問題報告和程式碼格式化功能。
  • 帶有斷點的整合偵錯程式,或在 VS Code 終端中執行命令列 IDL。
  • 支援 IDL Notebook 風格的介面,帶有嵌入式圖形並儲存為 PDF。
  • 可定製的主題和顏色。
  • 懸停幫助包含完整的 IDL 文件,包括程式碼示例。
  • 為 SAVE 檔案或 DLM 中的例程建立例程定義文件。
  • 原生多語言支援。

有關詳細資訊,請訪問 VSCode 的 IDL 頁面。

2.2 HDF5 可以處理空陣列

H5D_READ 和 H5_GETDATA 例程現在可以處理具有零長度陣列的 H5T_VLEN 資料型別。在這些情況下,結果是指向 !NULL 變數。

2.3 HttpRequest 進度條

HttpRequest 類(在 IDL 9.0 中引入)現在在 ::Get、::Post 和 ::Put 方法上有一個可選的進度條。此進度條使用上述新CLI_Progress條。有關詳細資訊,請參閱 HttpRequest::Get、HttpRequest::Post 和 HttpRequest::Put。

2.4 IDL_String::替換新的 Count 引數

IDL_String Replace 方法現在具有新的可選 Count 引數。該引數允許您指定要替換的匹配項數量。預設值是替換所有匹配項。例如:

IDL> str = '.......'
IDL> print, str.replace('.', '*', 3)
***....

還可以指定一個負計數,從字串的末尾開始:

IDL> str = '.......'
IDL> print, str.replace('.', '*', -3)
....***

有關更多詳細資訊,請參閱 IDL_String::Replace。

2.5 對 NaN 和 Infinity 值的 JSON 支援

IDL 的 JSON_PARSE 函式現在支援陣列中的末尾逗號以及特殊的 NaN、Inf 和 Infinity(不帶引號)值。這些都是對 JSON 規範的非標準補充,但提供了與 Python 和其他生成 JSON 工具更好的互操作性。

此外,JSON_SERIALIZE 現在有一個新的 NANINF_LITERAL 關鍵字。預設行為是將 NaN 和 Infinity 值輸出為帶引號的字串,這遵循 JSON 規範,但不允許將它們轉換回浮點值。設定 NANINF_LITERAL 關鍵字將輸出這些值,但不帶引號。這允許 JSON_PARSE 和其他工具(如 Python)理解這些值並返回浮點 NaN 和 Infinity 值。

2.6 LEGEND 填充顏色

現在可以指定 LEGEND 圖形函式的填充顏色:

p = plot(/test)
l = legend(target=p, fill_color='yellow')

有關詳細資訊,請參閱 LEGEND。

2.7 MapContinents Shapefile

MapContinents 圖形功能已更新,包含適用於各大洲、國家/地區、湖泊、島嶼和河流的更多最新 shapefile,包括適用於各大洲、湖泊和河流的新高解析度版本。例如:

m0 = Map('Geographic', limit=[41, -93, 50, -83], margin=[0.1, 0.1, 0.1, 0.05])
m0.mapgrid.label_position = 0
m0.mapgrid.linestyle = "none"
m0.mapgrid.grid_longitude = 2
m0.mapgrid.grid_latitude = 2
m1 = MapContinents(/hires, fill_color="light green")
m2 = MapContinents(/lakes, /hires, fill_color='light blue', linestyle=0)
m3 = MapContinents(/islands, fill_color='green')
m4 = MapContinents(/rivers, /hires, color='blue', thick = 2)

2.8 多行工具提示

IDL 小元件現在支援跨多行的工具提示。要建立多行工具提示,只需在設定 TOOLTIP 關鍵字時嵌入換行符 \n 即可。有關詳細資訊,請參閱 WIDGET_BUTTON、WIDGET_DRAW 或 WIDGET_TREE 上的 TOOLTIP 關鍵字。

2.9 PRINT/PRINTF 新的 NEWLINE 關鍵字

PRINT 和 PRINTF 過程具有新的 NEWLINE 關鍵字。預設值為 1,與以前一樣在輸出末尾輸出換行符(\n)。設定 NEWLINE=0 將隱藏換行符,並允許您多次呼叫 PRINT 並使所有輸出都出現在同一行上。

2.10 Shapefile 增強

IDLffShape 類使用的 Shapefile 庫已更新到最新版本。此外,IDLffShape 現在可以處理 Date 和 Logical 屬性型別。您還可以使用新屬性檢索所有屬性的 Shapefile 型別。有關詳細資訊,請參閱 IDLffShape。

2.11 TS_SMOOTH新的 NAN 關鍵字

TS_SMOOTH 函式具有新的 NAN 關鍵字。設定此關鍵字可使例程檢查輸入資料中是否出現 IEEE 浮點值 NaN 或 Infinity。值為 NaN 或 Infinity 的元素被視為缺失資料。因此,例程會將這些缺失的元素替換為平滑視窗內有效點的平滑值(使用簡單的 Boxcar 平滑)。

2.12 WIDGET_BROWSER 支援

WIDGET_BROWSER 已更新為包含對 macOS 的支援。

2.13 WIDGET_LABEL 和 WIDGET_TEXT 文字和背景顏色

WIDGET_LABEL 和 WIDGET_TEXT 現在支援 FOREGROUND_COLOR 和 BACKGROUND_COLOR 關鍵字,這些關鍵字允許您設定文字顏色和背景文字框顏色。您還可以使用 WIDGET_CONTROL 動態更改這些屬性。例如,儲存並執行以下程式碼:

pro widtext_ex_change, ev
  common _widtext, w1, w2
  widget_control, w1, foreground_color=bytscl(randomu(s,3)), background_color=bytscl(randomu(s,3))
  widget_control, w2, foreground_color=bytscl(randomu(s,3)), background_color=bytscl(randomu(s,3))
end
pro widtext_ex
  common _widtext, w1, w2
  w = widget_base(xsize = 200, /column)
  w0 = widget_base(w, /row)
  f = 'Segoe*24'
  w1 = widget_label(w0, value='Label', foreground_color=[0,200,0], background_color=[255,255,0], font=f, scr_xsize=100)
  w2 = widget_text(w0, value='My Text', /editable, foreground_color=[200,0,0], background_color=[0,255,255], font=f)
  w0 = widget_base(w, /row)
  wbutton = widget_button(w0, value='Change', event_pro = 'widtext_ex_change', font=f)
  widget_control, w, /realize
  xmanager,'widtext_ex', w, /no_block
end

2.14 WIDGET_PROPERTYSHEET Top Header 關鍵字

WIDGET_PROPERTYSHEET 有一個新的 TOP_HEADER 關鍵字,當該關鍵字設定為 0 時,將隱藏頂部(列)標題。

2.15 WIDGET_TEXT 對齊關鍵字

WIDGET_TEXT 有 6 個新的對齊關鍵詞:

  • ALIGN_BOTTOM、ALIGN_CENTER、ALIGN_LEFT、ALIGN_RIGHT 和 ALIGN_TOP 關鍵字控制小部件在其父部件中的位置。這些關鍵字在所有平臺上都是允許的。預設值為 ALIGN_CENTER。
  • 新的 ALIGNMENT 關鍵字允許您設定文字對齊方式。此關鍵字可用於Windows平臺,但在其他平臺上將被靜默忽略。

2.16 WIDGET_TEXT FRAME = 0

在 Windows 上,WIDGET_TEXT現在可以設定 FRAME=0 以刪除文字構件周圍的邊框。在其他平臺上,文字小部件始終具有框架,設定 FRAME=0 將不起作用。

2.17 WRITE_PNG 壓縮關鍵字

WRITE_PNG 函式具有一個新的 COMPRESSION 關鍵字,該關鍵字允許您控制 PNG 輸出的壓縮量。該值必須在 0 到 9 的範圍內。值為 0 表示無壓縮。較高的值將提供較小的檔案,但寫入和讀取的速度會變慢。預設值為 6,這在壓縮和速度之間提供了良好的平衡。

2.18 Dataminer 安裝

Dataminer 模組現在預設與 IDL 一起安裝。它仍然需要許可證才能使用。Dataminer 支援讀取和連線到 Microsoft Excel、PostgreSQL 和許多其他資料庫管理系統。

3 庫更新

第三方庫已更新到以下版本:

  • ArmPL 24.04
  • CEF 121.3.7 for Windows and Mac. To support Red Hat-based systems (Fedora, CentOS, and Rocky Linux). Linux uses CEF 99.2.14.
  • antlr 2.7.7
  • curl 8.9.0
  • Eclipse CVS Client 1.4.2000.v20211124-1800
  • eclipse-egit-plugin 6.7.0.202309050840-r
  • eclipse-platform 4.29.0.v20230903-1000
  • Eclipse Temurin JDK 21.0.2
  • Eclipse Temurin JRE 21.0.2
  • HDF5 1.14.3
  • Inno Setup 6.2.2(u)
  • jackson-json-processor 2.15.2
  • ibtiff 4.6.0t
  • Libxml2 2.13.3
  • microsoft-vcredist 14.40.33810
  • mongo-c-driver 1.27.0
  • mongo-cxx-driver 3.10.1
  • nghttp2 1.62.1
  • NumPy 1.24.4
  • NumPy 1.26.4
  • OpenSSL 3.3.1
  • P4Eclipse 2023.1.2516406
  • poco 1.13.3
  • Python 3.12.4
  • shapelib 1.6.0
  • SQLite 3.46.0
  • x11-dev-tools 1.0.2
  • X PixMap Library 3.5.17
  • xerces-c 3.2.5
  • zlib 1.3.1

新增了以下第三方庫:

  • Eclipse JGit 6.7.0.202309050840-r
  • libtirpc 1.3.4
  • LunaSVG 2.3.9

以下第三方庫已被刪除:

  • HASP Sentinel-LDK_SDK