Мосты Python IDL: функции Envi
Моя цель - использовать скрипт, написанный на 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 для Python Bridge.
В первом случае, используя subprocess.call("idldirectory\idl.exe")
Команда, я могу открыть приглашение IDL в командной строке Windows. Но я не могу выполнить любую функцию IDL, как простой 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 не работает, и у меня нет никаких решений.
Кто-нибудь может мне помочь? Спасибо. Lorenzo
1 ответ
Вы на полпути там. Вы ошиблись, вызвав метод OpenRaster как статический метод в классе IDL. Это не то, что вы хотите сделать. Чтобы использовать 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
класс это просто интерфейс, который позволяет вам вызывать любую функцию IDL как статический метод на IDL
учебный класс. Но как только вы создали экземпляр объекта, в этом случае e
используйте его как любой другой объект.