欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IDL将原始整型值转为二进制并获取所需位数的值

程序员文章站 2022-07-15 14:50:00
...

啊啊啊最近在学习MODIS数据,暂时下载的MOD09,听说这个数据质量一般,所以要提前做一步去云处理。

用HDF EXPLORER打开下载的一幅MODIS数据,其中state_1km_1就是标定数据质量的属性,通过QA index可以查看它的具体说明。

IDL将原始整型值转为二进制并获取所需位数的值
我们所下载的数据在该属性下是0~57335的整型数值,首先要将其转换为二进制,然后根据以下说明,选取你所需要的二进制的某一位的值进行数据的筛选。
我需要的是第10位的是否有云标记(一共16位:0~15)

IDL将原始整型值转为二进制并获取所需位数的值
接下来就是由整型转二进制并提取某一位数值的操作了。找了好多代码……感觉都不太简便,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

以下是结果
IDL将原始整型值转为二进制并获取所需位数的值