IDL学习记录和Java调用IDL方法

先记录一下最近的IDL学习经历。

IDL指的是ENVI、IDL的那个IDL,和我老婆吹牛,说是处理火星数据用的,事实可能就是如此。

从2018年1月7日开始,迫于项目的压力,需要在10号前学会IDL,并且把两个博士写的遥感数据处理IDL代码集成到项目中,压力还是很大的。

大学的时候就有了解过IDL,只是一直没有机会去耐心的学。这下也了却了自己多年的心愿,并用4天的时间完成任务。

IDL的资料比较少,很多人在学习IDL的路上走过不少弯路,把我的经历记录下来,一来是自我学习的记录,二来能够帮助希望入门IDL的朋友。

再说说IDL学习的一些方法和个人快速上手经验

个人比较喜欢看书,纸质书,山东省图书馆借的,学习的主要资料也是这本书:《遥感二次开发语言IDL》徐永明编著。用了一上午和一下午的时间把第一、二、三、四、六、八章看了一遍,重点是第一、二、三、四章,用IDL编译器自己动手把书上的例子用命令行敲一遍。第六、八章一页一页翻一遍,其他章节大致翻看一下。依照这个顺序,肯定就能写点简单的IDL代码了。

对于学习编程语言,我发现了一种比较好的方法来实现:边看书边照着例子敲的“境界”,就是看纸质书的同时,下载一本电子书。看理论知识的时候看纸质书,学习例子的时候看电子书,学习例子的时候翻书是个比较累人和不方便的事。

《遥感二次开发语言IDL》这本书中缺少一个内容,就是IDL对象,这个内容可以在Esri的2016年的IDL培训教程中找到一点简介。

下面在看看Java调用IDL的方法

可以使用idlexbr_assistant命令打开idl导出工具。

1.首先编写idl类,只有编写idl类这个工具才可以识别并导出com或者java,此处只说java,com类似

写完后保存,保存名默认为helloworldex__define.pro

 

;类的方法和过程定义:functon/pro 类名::方法名/过程名
FUNCTION helloworldex::HelloFrom, who
  IF (N_ELEMENTS(who) NE 0) THEN BEGIN
    message = "Hello World from " + who
    RETURN, message
  ENDIF ELSE BEGIN
    message = 'Hello World'
    RETURN, message
  ENDELSE
END


;类的方法和过程定义:functon/pro 类名::方法名/过程名
;Init方法相当于IDL类的构造函数,要在类定义前,这个方法必须有
;必须有返回值,1成功,0失败
;此处可以做一些初始化操作,比如初始化envi批处理模式、其他参数等
FUNCTION helloworldex::INIT
  RETURN, 1
END


;IDL类定义,类名为helloworldex,后面跟两个下划线和一个define
;类的里面是一个结构体,就是这样的写法,helloworldex作为结构体署名
;who和message是结构体的两个成员
;$是续行符,相当于写在一行上
;IDL类默认有一个self表示本对象,相当于java中的this
;self.who可以引用who成员
;var = self.HelloFrom, 'Java'可以引用HelloFrom方法,
;也可以定义过程,使用方法和function类似
PRO helloworldex__define
  struct = {helloworldex, $
    who: '' , $
    message: ' ' $
    }
END

2.测试

 

可以在IDL命令行编写IDL代码测试这个对象,当然要先编译一下

 

IDL> obj = obj_new('helloworldex')
IDL> print,obj.HelloFrom()
Hello World
IDL> print,obj.HelloFrom('我说:')
Hello World from 我说:
IDL> 

3.导出

 

测试通过后,IDL控制台使用idlexbr_assistant命令打开Export Bridge Assistant(通俗翻译,导出助手),导出的java类是idl的代理类,代理类的内部还是调用了.pro的idl程序

 

idlexbr_assistant

 

这个助手也是个软件,不要小看,也是以“工程”的方式管理。

新建Java项目

选择保存的__define.pro文件,此处说明,此助手只支持导出__define.pro形式的IDL类

保存此项目,设置导出的类和方法

配置导出类的名称和包名

配置导出方法

如果IDL类中有多个方法,可以只导出需要暴露的方法即可,不需要全部导出

配置导出方法的参数

工具栏第三个按钮,build,生成HelloWorld1.java和HelloWorld1.class,.class没什么用。

下面说如何用java调用idl

4.Java调用IDL功能

helloworldex__define.pro复制到IDL安装目录的lib文件夹中,我的是C:\Program Files (x86)\ITT\IDL\IDL80\lib

在eclipse中创建java项目

引用外部jar包,jar包存放在IDL安装目录下,此jar包的位置不能移动,移动后IDL代理类无法找到idl的程序,我的是C:\Program Files (x86)\ITT\IDL\IDL80\resource\bridges\export\java\javaidlb.jar

把生成的包和.java复制到java项目中

继承这个类,实现此IDL jar包中提供的JIDLOutputListener接口,我创建了HelloWorld1Ex1类,有几个注意的地方看注释,比较简单

 

package hello;

import com.idl.javaidl.JIDLObjectI;
import com.idl.javaidl.JIDLOutputListener;
import com.idl.javaidl.JIDLString;

public class HelloWorld1Ex1 extends HelloWorld1 implements JIDLOutputListener {
	private static final long serialVersionUID = 1L;
	private HelloWorld1 hello1;
	
	public HelloWorld1Ex1() {
		//固定写法
		hello1 = new HelloWorld1();//1.实例化助手导出的类
		hello1.createObject();//2.创建对象
		hello1.addIDLOutputListener(this);//3.添加监听,不添加java控制台不会打印IDL print的内容
		String strFromIDL = hello1.helloFrom(new JIDLString("我家宝宝")).stringValue();//调用
		System.out.println("-------->来自IDL的问候:"+strFromIDL);
		hello1.destroyObject();//JVM虚拟机不负责回收IDL代理对象的垃圾,需要我们自己回收
	}

	@Override
	/**
	 * 实现此接口,可以将IDL中的print输出到java控制台
	 */
	public void IDLoutput(JIDLObjectI arg0, String arg1) {
		System.out.println("IDL:>>"+arg1);
	}
	
	public static void main(String[] args) {
		HelloWorld1Ex1 ex1 = new HelloWorld1Ex1();
	}

}

结果:

 

 

-------->来自IDL的问候:Hello World from 我家宝宝

5.如果是Web项目,因为此处IDL的jar包javaidlb.jar不能移动位置,发布tomcat后,会出现该jar包中的类找不到的情况,解决办法是在配置tomcat的类共享类加载器。

 

在tomcat的catalina.properties配置文件中,将shared.loader项配置为javaidlb.jar的绝对路径




就此结束,希望能帮助到需要的人。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值