如何用idl读landsat8的idl 用数据画图

[转载]ENVI二次开发模式下的Landsat数据读取
从usgs网站或者马里兰大学下载TM或Landsat原始数据,数据可能包括9个tif数据,两个txt文件和一个gtf文件。示例结构如下:
ENVI下可以直接打开*_MTL.txt文件打开,打开后波段列表如下:
IDL程序用envi_open_data_file打开后只能获取到一个fid,此时需要用ENVI_GET_FIDS函数。示例代码如下:
PRO SAMPLE_IMPORT_LANDSAT_META
& COMPILE_OPT idl2&
& ENVI, /RESTORE_BASE_SAVE_FILES
& ENVI_BATCH_INIT
& file=DIALOG_PICKFILE(FILTER='*_mtl.txt')
& ; 打开文件
& ENVI_OPEN_DATA_FILE, file, /LANDSAT_METADATA,
& IF (fid EQ -1) THEN RETURN
& ; 这个是关键!
& fids=ENVI_GET_FILE_IDS()
& HELP, fids
& ;依次对fid进行判断
& FOR i=0, N_ELEMENTS(fids) -1 DO BEGIN
ENVI_FILE_QUERY, fids[i], NB=nb,
SNAME=sname
IF nb EQ 6 THEN mb_fid = fids[i]
& ENVI_BATCH_EXIT&
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。The page is temporarily unavailable
nginx error!
The page you are looking for is temporarily unavailable.
Please try again later.
Website Administrator
Something has triggered an error on your
This is the default error page for
nginx that is distributed with
It is located
/usr/share/nginx/html/50x.html
You should customize this error page for your own
site or edit the error_page directive in
the nginx configuration file
/etc/nginx/nginx.conf.IDL遥感应用入门(12):读取HDF4影像数据
在遥感应用中,会遇到一些HDF4格式的影像数据,HDF是一种自描述性的文件,不像之前介绍的数据和QuikScat数据那样,需要一个专门的数据描述文档,然后我们通过文档获取相关参数去读取文件。HDF的好处是完全跨平台,只要给定一个完整的HDF文件,我们就可以根据相关的规则去读取而不需要任何文档。关于HDF的文件的详细介绍,你可以看这篇文章:
言归正传,下面介绍一个完整的读取HDF文件的过程,本文中所用到的HDF文件,你可以从这里下载。链接:/s/1gdxhBv9 密码:hmcn
;Author:Sailor
PRO Course_11
;定义文件路径
MyRootDir='D:\8\'
;遍历文件夹
filearr = file_search(MyRootDir+'day','*-sst.hdf',count=num);
FOR fileindex=0,num-1,1 DO BEGIN
打开SDS模式的HDF文件&返回文件信息
hdfid=hdf_sd_start(filearr[fileindex])
hdf_sd_fileinfo,hdfid,datasets,attributes
遍历每个属性
attrindex=0,attributes-1 DO BEGIN
hdf_sd_attrinfo,hdfid,attrindex,name=a,data=b,count=c,hdf_type=d,type=e
print,'Name',':',a
print,'Data',':',b
print,'Count',':',c
print,'Hdf_type',':',d
print,'Type',':',e
print,'+++++++++++++++++++++++++++++++++++++'
遍历每个数据集
FOR dsindex=0,datasets-1 DO BEGIN
读取数据集数据
varid=hdf_sd_select(hdfid,dsindex)
hdf_sd_getdata,varid,Data
hdf_sd_getinfo,varid,name=dstName,natts=dstNum
如果数据集不为0
IF(dstNum NE 0) THEN BEGIN
print,'Name',':',dstName
print,'Num',':',dstNum
FOR ind2=0,dstNum-1 DO BEGIN
hdf_sd_attrinfo,varid,ind2,name=disName,data=disData
print,disName
print,disData
print,'******************************'
hdf_sd_endaccess,varid
读取sst数据集
ind=hdf_sd_nametoindex(hdfid,'sst');得到sst数据集的索引号
var_id=hdf_sd_select(hdfid,ind)
hdf_sd_getdata,var_id,sst
sst=congrid(sst,)
对sst数组进行处理
sst=sst*0.075-3
sst=reverse(sst,2)
sst=bytscl(sst,min=-3,max=33,top=255)
Img=image(sst,rgb_table=39,title=filearr(fileindex),grid_units=1,POSITION=[0.1,0,0.85,1])
xaxis=axis('X',location=[0,0],range=[-180,180],minor=0, major=19,coord_transform=[-180,0.25],title='Longitude(°)')
yaxis=axis('Y',location=[0,0],range=[-90,90],minor=0, major=7,coord_transform=[-90,0.25],title='Latitude(°)')
c = COLORBAR(TARGET=Img, ORIENTATION=1,TITLE='SST(Deg)')
MyRootDir='D:\8\'
这句代码规定了HDF的数据路径,当然你要换成你自己的路径,测试数据可以从。
filearr = file_search(MyRootDir+'day','*-sst.hdf',count=num);
FOR fileindex=0,num-num,1 DO BEGIN
这句代码段是对上面的路径做一个遍历,找出所有的.hdf数据,之所以这么写是为了方便批处理,因为不可能只处理一个文件。不过如果仅仅是做测试,这里可以改为num-num只处理一个文件测试效果,效果满意再做批处理。关于file_search函数的详细使用,你可以看这篇文章:
;打开SDS模式的HDF文件&返回文件信息
hdfid=hdf_sd_start(filearr[fileindex])
hdf_sd_fileinfo,hdfid,datasets,attributes
这段代码是读取某一个具体的hdf文件,并且获取这个文件的ID,数据集个数 datasets 和属性个数 attributes。
;遍历每个属性
attrindex=0,attributes-1 DO BEGIN
hdf_sd_attrinfo,hdfid,attrindex,name=a,data=b,count=c,hdf_type=d,type=e
print,'Name',':',a
print,'Data',':',b
print,'Count',':',c
print,'Hdf_type',':',d
print,'Type',':',e
print,'+++++++++++++++++++++++++++++++++++++'
这段代码遍历了文件的全局属性,并输出。
;遍历每个数据集
FOR dsindex=0,datasets-1 DO BEGIN
读取数据集数据
varid=hdf_sd_select(hdfid,dsindex)
hdf_sd_getdata,varid,Data
hdf_sd_getinfo,varid,name=dstName,natts=dstNum
如果数据集不为0
IF(dstNum NE 0) THEN BEGIN
print,'Name',':',dstName
print,'Num',':',dstNum
FOR ind2=0,dstNum-1 DO BEGIN
hdf_sd_attrinfo,varid,ind2,name=disName,data=disData
print,disName
print,disData
print,'******************************'
hdf_sd_endaccess,varid
这段代码遍历了全局的数据集,并且对每个数据集的属性做了一个遍历。
;读取sst数据集
ind=hdf_sd_nametoindex(hdfid,'sst');得到sst数据集的索引号
var_id=hdf_sd_select(hdfid,ind)
hdf_sd_getdata,var_id,sst
sst=congrid(sst,)
这里通过上面两步遍历,找出我们要找的数据集sst,这里读取sst数据集,并且根据数据集信息做了一个采样。
;对sst数组进行处理
sst=sst*0.075-3
sst=reverse(sst,2)
sst=bytscl(sst,min=-3,max=33,top=255)
Img=image(sst,rgb_table=39,title=filearr(fileindex),grid_units=1,POSITION=[0.1,0,0.85,1])
xaxis=axis('X',location=[0,0],range=[-180,180],minor=0, major=19,coord_transform=[-180,0.25],title='Longitude(°)')
yaxis=axis('Y',location=[0,0],range=[-90,90],minor=0, major=7,coord_transform=[-90,0.25],title='Latitude(°)')
c = COLORBAR(TARGET=Img, ORIENTATION=1,TITLE='SST(Deg)')
最后对整个数据集做了一个处理,这里的sst=sst*0.075-3 也是通过之前的属性遍历得到的,如图:
这就是整个HDF4文件的读取过程,如果有什么问题,欢迎留言。
如您有疑问,可在文末留言,或到QQ群提问。
本站QQ群:
微信公众号:malagis,扫描右边二维码直接关注。
如果本文对您有所帮助,欢迎对我们团队进行打赏捐助,让我们在传播3S的路上可以走得更远。
作者:,GIS爱好者。分享本文,请您带上。
文中的HDF文件无法下载。NASA最新的Landsat8数据版本
NASA于2014年2月号更新网站所有的Landsat8数据,历时50天。()。新的数据采用新的处理系统生产,数据更加精确,详细情况可从上述网站中获取。从2013年提供Landsat8免费下载开始,期间对数据做了多次更新,包括几何精度、辐射定标精度等。NASA每次更新都会对所有的数据进行更新,非常方便大家使用。
ENVI的通用定标工具(Radiometric Calibration)是直接读取*_MTL.txt元数据中的定标参数,因此ENVI直接可以处理NASA更新的数据。下面在ENVI5.1版本中简单的测试。
数据为2014年5月7号从USGS(http://glovis.usgs.gov/)和地理空间数据云(/)下载的两种数据,成像时间为2013年10月3号。打开数据可以看到,USGS数据的修改时间为2014年2月14号,地理空间数据云的修改时间为2013年10月18号。如下图为两个图像像素值的比较,在个位数字上有很小的差别。
图1:两种数据的像元值对比
利用Radiometric
Calibration工具对多光谱和热红外进行定标。如下图为Band10的辐射亮度值,有-0.28的差别,符合网站-0.29 +/- 0.12范围。
图2:Band10辐射亮度值
&因此,在使用Landsat8数据做定量反演方面的工作时,尽量使用最新的数据,即2014年2月3号后处理得到的数据。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 idl 读取遥感数据代码 的文章

 

随机推荐