0

我的目标是使用用 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脚本:

  • 选项 1) 启动上述 idl .pro 脚本
  • 选项 2) 使用 IDL to Python Bridge sintax。

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

在第二种情况下,我编写了以下 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()正常工作,实际上是 Envi 设置启动。

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

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

有人能帮我吗?谢谢你。洛伦佐

4

1 回答 1

1

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

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

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

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

该类IDL只是一个接口,它允许您调用任何 IDL 函数作为IDL该类的静态方法。但是,一旦您实例化了一个对象,在这种情况下e,就可以像使用任何其他对象一样使用它。

于 2016-05-26T14:22:48.507 回答