IDL将原始整型值转为二进制并获取所需位数的值
程序员文章站
2022-07-15 14:50:00
...
啊啊啊最近在学习MODIS数据,暂时下载的MOD09,听说这个数据质量一般,所以要提前做一步去云处理。
用HDF EXPLORER打开下载的一幅MODIS数据,其中state_1km_1就是标定数据质量的属性,通过QA index可以查看它的具体说明。
我们所下载的数据在该属性下是0~57335的整型数值,首先要将其转换为二进制,然后根据以下说明,选取你所需要的二进制的某一位的值进行数据的筛选。
我需要的是第10位的是否有云标记(一共16位:0~15)
接下来就是由整型转二进制并提取某一位数值的操作了。找了好多代码……感觉都不太简便,IDL可能也没有那种直接转换直接提取的函数,总之最后反正弄出了一个办法,亲测有用~~~~~
result_bcluod=read_tiff(filescloud);提前已经用MRT工具将该属性值转为了tif
cloud=result_bcluod[i].**TOBinary()**;转为二进制
len=strlen(cloud);计算长度
add='000000000000000';自己定义一个15位的字符串,这是为了填补高位为0
len1=strlen(add)
add_cloud=add+cloud;把两个字符串连接起来
pos=len+len1-11;我要获取第十位的值,这是第十位的位置(因为二进制所需的位数是从右往左数的)
flag=strmid(add_cloud,pos,1);该函数用来取字符串内的某一位的值:strmid(字符串,所取位置,取几个值)
if(flag eq 1) then begin
ref[i]=-28672
continue
endif;如果有云就是1,我就把最后反射率的结果赋一个很大的值用来取粉区分
这个应该是没问题的,我还没试hh不过我用别的数字试了一下
a=1234
b=a.ToBinary()
m=strlen(b)
c='000000000000000'
d=c+b
print,d
n=strlen(c)
wa=m+n-11
aaa=strmid(d,wa,1)
print,aaa
以下是结果