Python IDL 桥:Envi 函数

Python IDL bridges: Envi functions

我的目的是用IDL写的脚本,变成python:

IDL代码:

PRO PS_GS
; Start the application
e = ENVI()
;Generate the roi from a vector file
; Open a vector file
file_vec = Filepath('Sic_Trapani.shp', ROOT_DIR = 'E:\mydirectory\')
vettore = e.OpenVector(file_vec)
; Get the task from the catalog of ENVITasks
Task_VtoR = ENVITask('VectorRecordsToROI')
; Define inputs
Task_VtoR.INPUT_VECTOR = vettore
; Define outputs
Task_VtoR.OUTPUT_ROI_URI = Filepath('roi_roi.xml', ROOT_DIR = 'E:\mydirectory\')
;Run the task
Task_VtoR.Execute
END

以上代码在 IDL 命令提示符下运行正常。 我想制作一个 python 脚本:

在第一种情况下,使用subprocess.call("idldirectory\idl.exe")命令,我可以打开IDL提示符进入windows命令提示符。但是我不能像简单的 PRINT, 'hello'.

那样执行任何 IDL 函数

在第二种情况下,我写了下面的poython代码:

import subprocess
from subprocess import call
import idlpy
from idlpy import IDL
e=IDL.ENVI()
msi_file = """IDL.Filepath(mydata.tif", ROOT_DIR = 'mydirectory')"""
msi_raster = IDL.OpenRaster(msi_file)

指令 e=IDL.ENVI() 工作正常,实际上环境启动了。

指令 msi_file = """IDL.Filepath(mydata.tif", ROOT_DIR = 'mydirectory')""" 工作正常。

我的问题出在 OpenRaster 指令上。它是 ENVI 指令而不是 IDL 指令。所以,IDL.OpenRaster 不起作用,我也没有任何解决方案。

有人可以帮助我吗? 谢谢你。 洛伦佐

你已经完成了一半。您出错的地方是在 IDL class 上将 OpenRaster 方法作为静态方法调用。这不是你想要做的。要使用 OpenRaster,您实际上需要在您创建的 ENVI 对象上调用该方法。例如:

e=IDL.ENVI()
msi_file = IDL.Filepath('mydata.tif', ROOT_DIR = 'mydirectory')
msi_raster = e.OpenRaster(msi_file)

创建对象 e 后,它的行为与任何其他 python 对象一样。也就是说,您可以调用它的方法、访问属性等。例如,要将您的文件加载到 ENVI 显示中,您可以执行以下操作:

view = e.GetView()
layer = view.CreateLayer(msi_raster)

IDL class 只是一个接口,允许您在 IDL class 上调用任何 IDL 函数作为静态方法。但是一旦你实例化了一个对象,在本例中 e,就可以像使用任何其他对象一样使用它。