Мосты 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используйте его как любой другой объект.

Другие вопросы по тегам