MODIS积雪产品工具箱(最终版)

2014.8.14更新:
(1) 显著提高积雪合成模块的计算速度
(2) 扩展并改进了积雪合成时的“校正”方案
(3) 进一步修正了原来的一些bug,使程序更加稳定更新后的界面:              1 

详情:

重点更新了本程序的第一个模块:积雪合成算法。本次更新的具体内容如下:

(1)极大地提高了双卫星积雪合成算法的计算速度:以整个青藏高原范围的积雪数据(500米分辨率,约1200万个栅格)为例,进行一次双卫星单日合成只需要约10秒左右的时间,即进行一年的合成只需要一小时。

(2)增加了可使用第三方数据的“校正”功能,并提供了较为灵活的方案:
如上图,假如选定了“补充校正”,就需要提供“校正路径”,分为两种情况:(a) 单一文件路径 ;(b) 逐日文件所在的目录。此外,需要提供“校正表”来帮助判定输出结果,“校正表”是一个由用户自定义的合成规则表格。具体说来,
a、对于“单一文件路径”这种情况:最常见的例子,就是使用冰川进行校正,冰川一般假定是不变的,所以一年或多年只需要一个数据文件,它的校正表的内容应该是类似这样的:
2
如图,code是识别“规则区域”的必要关键字,列标(0, 1)是校正数据(在此为冰川文件)的编码,0表示非冰川覆盖区域,1表示冰川覆盖区域,行标(0~255)是MODIS积雪数据的编码,上表的设定即表明了在合成时,只要是冰川覆盖的区域都会判定为积雪而无视MODIS产品的编码(这可能不够合理,所以提供这样一个自定义规则表格可以有效帮助用户自定义合理的合成规则)。

b、对于“逐日文件所在的目录”这种情况:比如使用“IMS逐日雪冰分析数据”来对合成产品进行去云操作,由于每日都有一景数据,所以需要程序会搜索这个目录里与合成日期对应时相的数据对合成后的产品进行逐日校正去云,其“校正表”的内容类似
3
这里,列标是IMS数据的编码(4表示积雪),这里做了如下考虑:ims数据是四公里栅格的,而MODIS积雪产品是500米分辨率的,我们有理由相信MODIS数据更加准确,所以在校正时只对MODIS的云或无效数据填充部分进行校正。
比如,在进行校正前,对青藏高原2006年1月1日至1月6日进行积雪合成,此程序得到的结果如下:
4

我们看到每日的云量还是很大的(有5天超过30%),在使用上面的“校正表”进行了IMS校正后,得到的结果如下:

5

看到,云量已经全部降为0

(3)修正多处BUG

程序下载:http://pan.baidu.com/s/1c0ep5k8

关于源码:考虑再三还是不开源了,因为写的实在是太乱(或者烂 )了,从2012年开始写,中间进行过多次修改,而且,很多代码的处理很可能会误导新手,目前本程序所有模块的总代码量约为1万8千行左右,看这样一个混乱的冗长代码实在是害己害人

______________________________________________________________________________________________________2013.12.30更新:
在老师的要求下,我加入了“冰川校正”的选项,同时修正了之前没有发现的一些错误 ,具体如下:
(1)冰川校正:如果选定“冰川校正”,那么冰川覆盖的栅格自动被判定为“积雪”,无视MODIS产品的值
(2)Arcgis Engine库中的创建常量栅格函数运行时不稳定,偶尔会出错(处理1500景数据会“发病”10次左右),所以我重新编写了相应代码,避开了这个问题。并通过了3000景数据的验证。
下载地址:
http://kuai.xunlei.com/d/-EsCDYQ1QZXBUgQAe1e
(之前没有上传到网上是觉得写得实在很垃圾,但是,但是,,,万一有人用了呢)
本来觉得再写这样一篇日志实在有装13的嫌疑,但是已经装了这么多年了,也就不差这一次了。重要的是,做事情要有始有终,我需要给这程序一个“了断”。记忆力越来越差了,大学时做过的很多东西都只剩下模糊的记忆了(尽管那时候做的东西现在看来很幼稚可笑),很多东西写出来却没有发布还是觉得有点可惜。
如果你的科研工作需要用到MODIS积雪产品(产品标识为MOD10或MYD10)、MODIS温度产品(产品标识为MOD11或者MYD11)或者ITPCAS-CMFD数据,那么本文介绍的工具可能会对你有所帮助。
这个小程序是我去年(2012年)帮老师做一些遥感数据产品的处理时编写的,本质上讲,这个程序只是一个批处理工具,它实现了简单的算法,而且代码写得也并不出彩,只是我在老师的“压迫”下赶工完成的。
开发平台: Arcgis Engine 10
开发语言:主要是C# (只有一个简单的小工具是用Java写的)
软件说明:编写粗糙,但尚算合用,拙作并无上传到网盘的打算,如有朋友对此程序感兴趣,可直接联系本人,有求必予。
其主要功能如下:
6“模式”里列出了此程序的所有主要模块。
其详细描述如下:
1、MODIS积雪产品初级提取
7
此模块实现了逐日产品单日单星提取、八日产品单星提取、双星多日合成以及双星多日固定天数合成。
其算法详见我去年的日志[C# & Java]【工作日志】Modis积雪产品工具箱-1
与当时相比,更新了“固定天数”选项,其作用是:忽略云量阀值,只以固定天数为准,每个固定天数输出一个合成产品。

2、提取积雪边缘
8
所谓积雪边缘,顾名思义:积雪分布区的边界栅格(流域边界除外,与云交界处除外)。
这个模块可以将上一个模块中提取出的积雪产品中的积雪边缘提取出来。如下:

9
提取积雪边缘的本意是,我的导师提出了一个通过积雪边缘的高程来估算温度垂直递减率的新算法。所以,我就写了这个模块,实际上原理很简单,只需要判断当前栅格的四周栅格状态就能实现。
“提取高程”,表示输出的积雪边缘栅格会记录各个栅格的高程值。如果此项被选中,那么就要在下面的”DEM文件“中填入DEM数据的路径。
3、提取积雪反照率
10
MODIS逐日产品中有个波段是计算积雪反照率的,我的导师需要反照率数据来校正水文模型中的积雪消融水,所以我就写了这个。
Fraction表征的是一个“有效范围”,积雪含量在这个范围内的栅格才会被提取反照率。
时间片表示的是数据生成的时间范围:
Daily表示 每天生成一景反照率数据。Monthly表示每个自然月输出一个月平均值数据。Yearly则是年平均值。这个选项还是比较方便懒人的,比如我。
4、 提取指定百分比高程
11
一个简单的工具:将所有高程值从小到大排列,计算Percentile小的高程值。
其本意是,有文献使用所有积雪栅格所在高程的5%小的值作为积雪边缘高程,这个显然是不准的,我敬爱的导师只是让我提取出来以证明这一点。
5、 MODIS积雪产品合成
12
鸡肋模块,已废弃。
6、 MODIS温度产品分析
13
这是这个软件的一个比较实用的工具,它可以实现如下三种功能:
(1)提取指定站点(栅格)的MODIS温度产品值(可指定一个或多个经纬度,即可以批处理)
(2)提取指定区域(mask)的MODIS温度产品值
(3)在进行区域提取时,可以进行区域线性回归,提取每日的温度-高程递减率
此外,针对MODIS温度产品本身的特点,它可以做如下细化:
14
质量控制可以查看MODIS温度产品的使用说明,使用这种设置范围的方式是为了最大程度的自定义所需要的“质量要求”
比如,LST err那两个框中,

这里,表示:只提取和计算温度误差在1K以下的栅格
MODIS温度产品每天有两景数据,晚上和白天各一景,所以这里可以选择:白天、夜间或者二者平均
7、计算高程带的积雪
15
主要功能是计算各个高程带的积雪面积,实际上这里实现的效率比较低(虽然说出来比较丢人,但是事实如此)。需要注意的地方如下:

 a、这个最好是以第一个模式输出的结果作为输入,所以在关键字那里写入“coup”(如果是双卫星合成)或者“out”(如果是单星提取),关键字是用来过滤输入目录里的输入文件,只有文件名包含关键字的grid文件才会被处理。
b、DEM文件应是范围与流域mask完全对应的文件(范围、栅格大小、投影)
c、高程带设置的格式为:比如要从1000米到4000米平均设置3个高程带,那么高程带的文本文件格式应该是:
1000
2000
3000
4000
d、输出文件:
“高程带积雪数量.txt”,记录了“日期编号”、“日期”以及每个高程带的积雪栅格数量
“高程带积雪百分比.txt”,记录的是每个高程带的积雪占各个高程带的面积百分比
“高程带栅格数量”,记录的是每个高程带的栅格数量,可用于对比验证

8、计算ITPCAS-CMFD数据
16
这里是以NetCDF的.net库函数为基础,根据青藏高原研究所杨坤老师课题组制备的一个气象数据集(ITPCAS-CMFD)的文件格式,进行相关分析或提取。
和MODIS温度提取类似,可以提指定经纬度的数据或者一个区域的数据。如下

17
它也包含了计算温度-高程递减率的模块。至于高程带逐日提取实际上是因为我的导师的要求才做的,我觉得意义不大。
9、 积雪产品临近日提取
这是做积雪遥感提取时,经常用到的算法,其算法很简单:如果当前日是云或者无效数据,那么在前一日和后一日都是雪的情况,我们有理由相信当前日应该也是雪。

以上工具绝大多数都经过了验证,我敬爱的导师也使用了该工具处理的数据在今年顺利的发表了相关文章。

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Post Navigation