ENVI终于开放FLAASH二次开发接口

ENVI中的FLAASH模块(Fast Line-of-sight Atmospheric Analysis of Hypercubes,大气校正)的开发者本来是Spectral Sciences和Air Force Research Labs,被ITT公司收购后由ITTVIS整合到ENVI软件中并做了可视化界面,因此,虽然ENVI中大多数模块均已提供了二次开发接口,但是FLAASH模块的二次开发接口却迟迟没有放开(出于商业考虑?),ITT被ESRI收购后更是没了下文。终于,在广大用户们不断地敦促下(尤其是我们的于博士),官方终于在前天公开发布了二次开发接口的调用方式(查看原文),小伙伴们再也不用为批量操作时频繁地重输参数所头疼了。

不啰嗦了,下边引入原文中的接口代码示范:

——————————————分割线以下为引用内容———————————————

重要!!!

如果自己在调用时报错信息类似如下,需要在执行FLAASH之前,在ENVI中关闭输入的辐射亮度数据。

002ajk6hzy79EqP34M109&690

本文将提供两个示例代码,分别处理多光谱(Landsat 8)和高光谱(AVIRIS)。

  • 代码中使用的是相对路径,可直接运行。
  • 输入数据在data文件夹中,输出结果放在output文件夹中。
  • 虽然参数很多,但是和FLAASH面板中的参数是一一对应的。

源码和测试数据下载地址:http://pan.baidu.com/s/1kUETjX9

 把多光谱处理的代码贴上来,敬请欣赏。

大量中文注释,让您的调用畅通无阻。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
PRO test_flaash_object_class_multi
COMPILE_OPT idl2
e=envi()

;获取源码所在文件
Path = FILE_DIRNAME(ROUTINE_FILEPATH())+PATH_SEP()

;输入多光谱辐射亮度数据
radiance_file = FILEPATH('Landsat_8_OLI_Rad.dat', $
root_dir=Path, subdirectory=['data'])

;大气校正输出结果文件路径
reflect_file = FILEPATH('Landsat_8_OLI_Rad_flaash.dat', $
root_dir=Path, subdirectory=['output'])

;打开栅格数据,获取元数据信息
raster = e.OpenRaster(radiance_file)

;数据信息
nspatial = raster.nColumns ;列数
nlines = raster.nRows ;行数
fid = ENVIRasterToFID(raster)
ENVI_FILE_QUERY, fid, data_type=data_type ;数据类型

;获取输入文件后缀 (.dat)
exten = stregex(radiance_file, '\..+$', /extract)
;对应 Rootname for FLAASH files 参数,设置为 Landsat_8_OLI_Rad_
user_stem_name = FILE_BASENAME(radiance_file, exten)+'_'

;对应 Output Directory for FLAASH Files 参数
;使用输出路径作为临时路径(不建议使用系统临时路径)
modtran_directory = Path+'output'

;获取光谱响应函数路径
filter_func_filename = FILEPATH('landsat8_oli.sli', $
root_dir=e.root_dir, subdirectory=['resource','filterfuncs'])

;获取时间信息
IF OBJ_VALID(raster.Time) THEN BEGIN
;如果元数据中有时间信息,则自动获取
tmpTimes = STRSPLIT(raster.Time.ACQUISITION, '-T:Z', /extract)
year = FIX(tmpTimes[0])
month = FIX(tmpTimes[1])
day = FIX(tmpTimes[2])
gmt = DOUBLE(tmpTimes[3]) + $
DOUBLE(tmpTimes[4])/60D + DOUBLE(tmpTimes[5])/60D^2
ENDIF ELSE BEGIN
;如果元数据中没有,则手动设置
year = 2013
month = 10
day = 3
gmt = 2.923418
ENDELSE

;坐标信息
ref = raster.SPATIALREF
IF ref NE !NULL THEN BEGIN
;如果有坐标系,则自动获取经纬度、分辨率
pixel_size = (ref.pixel_size)[0]
ref.ConvertFileToMap, nspatial/2, nlines/2, MapX, MapY
ref.ConvertMapToLonLat, MapX, MapY, longitude, latitude
ENDIF ELSE BEGIN
;如果没有坐标系,则手动设置
pixel_size = 30.0
longitude = 117.08846
latitude = 40.506906
ENDELSE

;获取波长信息
metadata = Raster.Metadata
wavelength_units = metadata['WAVELENGTH UNITS']
lambda = metadata['WAVELENGTH']
;fwhm如果没有,可设置值全部为-1
;例如4个波段的多光谱数据,设置为[-1.0, -1.0, -1.0, -1.0]
IF metadata.HasTag('FWHM') THEN $
fwhm = metadata['FWHM'] $
ELSE fwhm = DBLARR(raster.nBands)-1.0
;缩放系数,如果定标时设置了FLAASH Setting,则设置value=1.0即可。
input_scale = MAKE_ARRAY(raster.nbands, value=1.0, /double)

;初始化FLAASH对象
;可选关键字如下:
; rad_remove FLAASH执行完毕后,自动关闭输入文件
; anc_remove FLAASH执行完毕后,自动关闭生成的辅助数据
; anc_delete FLAASH执行完毕后,自动关闭并删除辅助数据
flaash_obj = obj_new('flaash_batch', /anc_delete)

;设置大量的输入参数
flaash_obj->SetProperty, $
hyper = 0, $ ;设置为1,表示高光谱;设置为0,表示多光谱
;
; FLAASH工程参数----
radiance_file = radiance_file, $
reflect_file = reflect_file, $
filter_func_filename = filter_func_filename, $
filter_func_file_index = 0, $
water_band_choice = 1.13, $
red_channel = 4, $ ;0表示undefined,LC8红波段为第4波段
green_channel = 3, $ ;0表示undefined,LC8绿波段为第3波段
blue_channel = 2, $ ;0表示undefined,LC8蓝波段为第2波段

;水汽反演,没有所需波段,所以设置为0,表示undefined
;分别对应Multispectral Setting中Water Retrieval选项卡中的两个参数
water_retrieval = 0, $ ;Water Retrieval参数。0表示No,1表示Yes
water_abs_channel = 0, $
water_ref_channel = 0, $

;气溶胶反演----
;对应Multispectral Setting中Kaufman-Tanre Aerosol Retrieval选项卡中的参数
kt_upper_channel = 6, $ ;设置短波红外2(SWIR 2
kt_lower_channel = 4, $ ;设置红波段(Red)
kt_cutoff = 0.08, $ ;Maximum Upper Channel Reflectance
kt_ratio = 0.500, $ ;Reflectance Ratio
cirrus_channel = 0, $ ;0表示undefined

;前边已经定义
user_stem_name = user_stem_name, $
modtran_directory = modtran_directory, $
;
; MODTRAN参数---
visvalue = 40.0000, $ ;能见度,默认40km

;为了进行水汽反演,需要如下3个波段范围中的一个:
; 1050-1210nm, 770-870nm, 870-1020nm
; 而且要求此范围的波段光谱分辨率最低为15nm
f_resolution = 15.0000, $

;时间信息----
day = day, $
month = month, $
year = year, $
gmt = gmt, $
latitude = latitude, $
longitude = longitude, $
sensor_altitude = 705.0000, $ ;传感器高度
ground_elevation = 0.043, $ ;平均海拔,单位km

;分别对应 Advanced Setting 中的同名参数,默认即可
view_zenith_angle = 180.0000, $
view_azimuth = 0.0000, $

;大气模型:0-SAW;1-MLW;2-U.S. Standard;3-SAS;4-MLS;5-T
atmosphere_model = 4, $
;气溶胶模型:0-No Aerosol;1-Rural;2-Maritime;3-Urban;4-Tropospheric
aerosol_model = 3, $

;如下几个参数对应 Advanced Setting同名参数,默认即可。
multiscatter_model = 0, $
disort_streams = 8, $
co2mix = 390.0000, $
water_column_multiplier = 1.0000, $
;
;图像参数----
nspatial = nspatial, $
nlines = nlines, $
data_type = data_type, $
margin1 = 0, $
margin2 = 0, $
nskip = 0, $
pixel_size = pixel_size, $
sensor_name = 'Landsat-8 OLI', $

;分析参数----
;对应Advanced Setting中的 Aerosol Scale Height
aerosol_scaleht = 2.0000, $
;对应Advanced Setting中的 Use Adjacency Correction
;中高分辨率设置为1,低分辨率(如Modis)设置为0
use_adjacency = 1, $

;输出缩放系数,输出结果放大了10000倍,变为UINT数据类型。
;对应Advanced Setting中的Output Reflectance Scale Factor
output_scale = 10000.0000, $ ;输出结果缩放系数

;对应 Width (number of bands) 参数,多光谱设置0即可。
polishing_res = 0, $

;对应 Aerosol Retrieval 参数。
; 0 表示 None;1 表示 2-Band (K-T)2 表示 2-Band Over Water
aerosol_retrieval = 1, $

;对应FLAASH面板中的 Wavelength Recalibration,多光谱一般为0
calc_wl_correction = 0, $
reuse_modtran_calcs = 0, $
use_square_slit_function = 0, $
convolution_method = 'fft', $

;对应Advanced Setting中的 Use Tiled Processing
;1-Yes;0-No
use_tiling = 0, $
tile_size = 1024.0000, $

; Spectral Parameters
wavelength_units = wavelength_units, $
lambda = lambda, $
fwhm = fwhm, $
input_scale = input_scale

;重要!!!!!!重要!!!!!!重要!!!!!
;执行FLAASH之前,必须在ENVI中把输入文件关闭
Raster.Close

;开始执行FLAASH
flaash_obj->processImage

;获取输入输出文件的FID
flaash_obj->getResults, rad_fid=rad_fid, reflect_fid=reflect_fid
END

写在年末

匆忙又一年,明天就要放假回家了,日子过得也太快了。前两周写本年度工作总结的时候,拿出前一年的工作总结对比,像刚写完似的,每一行字都还很熟悉。只当是记忆力和时间没有同步。

看完病就好了

从春节后到现在往医院跑了不下十趟了,先是有段时间喉咙难受,只要有吞咽的动作就会疼得厉害,哪怕是喝水也这样,没办法,做胃镜看一下里边是啥情况,结果出来后也没发现什么,开了点抑制胃酸的药,药还没吃不适感就消失了,不知道什么原因引起的吞咽困难;又有一次连续四五天早晨起来头晕,去医院检查好几次,CT、耳、前庭功能都做了检查,结果出来后也没发现什么,眩晕感在检查后一两天就消失了,最终也不知道是什么原因。

干打雷,不下雨

老家那边下暴雨了,看朋友圈里都是各种被淹的照片,一片狼藉,身在帝都的我深表同情,北京已经连续高温好多天了,白天气温30多度不在话下,空气闷热潮湿,像极了武汉那令人难以忍受的桑拿天,天气预报说本周有雨,却一直是干打雷不下雨,反反复复烤验着人的忍耐极限。

不会整理房间

今天又把卧室重新布置了一遍,记不清这是半年以来第几次大规模布置卧室了,总是觉得桌椅柜子怎么摆放都不顺眼,今天整理完了,还是不顺眼,囧RZ。。。

匆匆2014

稀里哗啦的一年,过得太快,想不起来有哪些闪光点,为自己感到羞愧 :cry:

工作按部就班,没有明显的突破

技术学习进度太慢。。太慢。。。

花销逐渐合理,存了一笔钱,明年研究理财

羽毛球水平有所提高,但还得继续努力

和同事组了乐队,架子鼓成了又一个爱好

离开学校后工作的完整一年,给自己打70分,表现平平,希望第二年能够更有收获,日记还是要写的,哪怕断断续续的也是有意义的,免得下一个年底回想时又是一片空白。明年在保持兴趣爱好的基础上,工作和学习要有所突破,年内要通过两个考试,职称英语、系统分析师,再参加一个数据库培训,必须要强制自己学习,不然和别人的差距就越拉越大了。

昨天买了台电视放在卧室里,接上有线,瞬间有了家的感觉,遥控器在手,天下我有。。。

就这样给2014年的博客画个句号吧,有更重要的事情要去做啦~元旦快乐~

Oracle透明网关配置过程中遇到的两个问题

Oracle透明网关(Transparent Gateway)能够方便地解决异构数据库系统之间的数据共享问题,使得基于Oracle环境的应用系统/程序在访问非Oracle数据库中的数据时不需要另外再做代码开发工作,大大节省系统开销,提高数据使用的灵活性(功能示意图如下)。最近在进行透明网关的安装和配置过程中遇到了两个问题,网上搜不到解决方案,摸索着解决后写此文总结一下,希望能对遇到同样问题的童鞋有所帮助。

Oracle 9i透明网关访问SQL Server

Oracle的透明网关是oracle直接访问异构数据库的利器。在9i中,透明网关是包含在数据库安装程序中的,在安装数据库软件过程中可以选择,透明网关可以安装在Oracle DB或者SQL Server DB所在的服务器中,也可以单独安装在二者以外的一台服务器中,看自己的需求如何了。需要说明的是Oracle 9i透明网关不能安装在Windows Server 2008、Win7和Linux等系统中,所以安装前请确定兼容性是没问题的。