6S大气传输模型修改源码添加、自定义卫星光谱响应(以HJ-1B CCD为例)
来源:互联网 发布:淘宝线下代购 编辑:程序博客网 时间:2024/06/05 11:01
6S大气传输模型修改源码添加、自定义卫星光谱响应(以HJ-1B CCD为例)
最近要做国产卫星的大气校正,打算用6s模型模拟气溶胶的查找表,但是发现6s模型中没有国产卫星的相应光谱响应函数,只能在输入的时候把光谱响应函数整个输进去,觉得麻烦,研究了一下,发现修改源码可以实现添加自定义的卫星光谱响应函数,现在与大家分享一下我的做法:
(p.s. 我是在Linux系统下做的,Windows系统大家自己摸索吧··)
所需文件
- 6s源码:http://6s.ltdri.org/pages/downloads.html
目前最新的是2015年发布的V2.1版本。 - 所需卫星的光谱响应函数文件
我用的是HJ-1B卫星的CCD相机的光谱响应函数,可以在
http://www.cresda.com/site1/Downloads/gpxyhs/index.shtml
下载,这个网页还有GF、ZY等卫星的光谱响应函数文件。(吐槽,在网上找GOCI卫星的光谱响应函数怎么也找不到,不知道棒子藏着这些干嘛)。
- 6s源码:http://6s.ltdri.org/pages/downloads.html
步骤
1. 修改main.f
解压压缩包之后,找到main.f打开。(建议大家浏览一下这个文件,各种输入参数的说明、注释非常到位,还有彩蛋)
大家可以发现首先出现与传感器有关的代码是在第364行左右:
nsat 这个东西(对Fortran不了解不知道怎么叫它····姑且叫它东西吧···)保存了传感器波段名称字符串,在输出结果的时候用的上。所以我们要在nsat的末尾加上我们自己的传感器:
我加了4个字符串,HJ1/CCD 1-4,代表CCD的4个波段。之所以字符串长度和之前的字符串长度一致(包含空格17个字符),除了看着爽之外,也是有原因的,看到代码292行左右:
这里是nsat的定义,可以看到是一个204*17的character,就是说共有204个XX,每个XX长度是17字符。这个204也是我后来修改的,之前是200,加了4。
接下来,看到代码大约1100行,关于spectral conditions的说明:
不同输入对应不同的spectral condition。当输入大于2时,便是内置的传感器波段了。我们也装模作样的把我们自己的传感器写到这个注释里面:
当然这个编号(200-204)也是有用的。再往下看,大约1370行左右:
这个注释说明了不同传感器输入对应应该goto哪一个语句(尼玛Fortran这么多的goto也是看醉了),我们也装模作样的把自己的传感器加进去。如果输入是200-203,则goto 165编号的行。注意检查一下goto的编号是否已经存在了。
这只是修改了注释,接下来修改代码。就在注释下方编号18的goto,观察一下就是与注释相对应的,我们把自己的传感器加在下方:
然后就是写编号为165的代码行了,在编号164的下方,稍微修改一下函数名就好:
至此,对mian.f的修改完成!2. 制作传感器文件(HJ1.f)
下面是重头戏,制作我们自己的传感器文件。新建一个文件,我取名为HJ1.f,注意文件名和上一步call的函数名一致。
首先可以打开一个6s自带的传感器文件,就拿MODIS吧,打开看一下,先全部复制粘贴过来吧·····没关系,后面慢慢改。
由于我们只有4个波段,所以定义sr只需要4行(下图标号11的行),我还装模作样的写了一些注释:
下面就是定义每一个波段上的光谱响应了。我先在matlab里面把光谱响应函数的光谱间隔差值到了2.5nm,这也是必须的。下面是CCD第一个波段的例子:
一行一行解释,首先注释行说明了起始波长和终止波长,下面是具体每一个波长上光谱响应值。注意每一行是1501列的,这个不能修改,不然会出错。因为6s中光谱范围是0.25-4um,间隔为0.0025um,所以有(4-0.25)/0.0025+1=1501个波长。14行的数据中第一项69*0说明这一行数据前69个数为0,69=(0.4225-0.25)/0.0025;最后一项1385 * 0说明最后1385个数为0,1385 = (4-0.5375)/0.0025。检验一下,前面有69个0,后面有1385个0,中间有47个光谱响应值,一共是69+1385+47=1501个波段,简直颇费。只要保证起始波长(0.4225)正好对应第一个非0光谱响应值(0.092),而终止波长(0.5735)正好对应最后一个非0光谱响应(0.175),就能按照上面的计算方法保证不多不少正好。不然的话就要绕一些了···总之大家检查一下是不是一共有1501个数据,还有波段上是否每个波长都有光谱响应值就ok。
按照上面的方法继续完成剩余的3个波段,最后需要修改各个波段的上下限:
大功告成!3. 修改makefile
最后要修改一下makefile,很简单,打开makefile,在那一长串的字符最后加上我们的 HJ1.o就OK了:4. 编译
下面就是编译了,cd到6s的文件夹下,输入命令 make ,回车,
and good luck!
如果有问题,可以根据错误提示找找哪里出错了,我之前有几次就是在main.f中不小心多打了一些符号或者错删了一些语句造成了失败。可以与原来的main.f比较一下很快就发现问题了。5. 运行6s
如果编译成功的话,就可以运行6s程序了,
cd到6s的文件夹,输入命令 ./sixsV2.1 回车
此时会等待输入各种参数。
关于6s的参数说明,还是推荐大家看main.f里面的说明,这里贴一张6s User Manual里面的图:
下面是我的输入,注意看第9行,数字201代表了我们自己加入的CCD band2,
然后回车···good luck······
output中可以看到我们自己加入的传感器波段名
以及大气校正的结果。
- 6S大气传输模型修改源码添加、自定义卫星光谱响应(以HJ-1B CCD为例)
- S3C2440 - DMA传输(以字符传输为例)
- libevent源码分析 以epoll模型为例
- 对控制台EXE程序的自动运行问题——以6S模型6s.exe为例
- (6)为QAction添加事件响应
- [有修改]Android Studio 添加 Library Project (以Volley为例)
- 在rose里添加自定义的stereotype(以概念用例为例)
- RT-N14U源码研究之——添加用户app(以zdclient为例)
- ENVI/IDL实现HJ卫星气溶胶反演
- nginx中的事件响应机制(以epoll为例)
- 以自定义布局为Item的GridView不响应事件
- B/S结构程序在提交等待时加上进度条,以asp.net c#为例
- 修改jQuery表格插件flexigrid源码添加自定义功能(1)
- 定量/高光谱遥感之——大气校正(一)
- 定量/高光谱遥感之——大气校正(二)
- 关于添加修改内容的模块化、对象化处理架构说明,以 bom 模块为例。(编号:20110704A0801)
- VLC 修改源码,添加对鼠标事件的响应
- 【卫星测高】用matlab读取指定经纬度区域的卫星测高数据并计算高程_以jason2为例
- Codeforces Round #297 (Div. 2) 525D Arthur and Walls(dfs)
- RippleDrawable 的简单使用
- LeetCode 258. Add Digits
- Servlet之过滤器
- 从数据库丢失更新想到的一些问题
- 6S大气传输模型修改源码添加、自定义卫星光谱响应(以HJ-1B CCD为例)
- CMake与Make
- 欢迎使用CSDN-markdown编辑器
- 从github上clone项目
- spring+mybatis返回json日期处理(日期全局处理相差8个小时解决方法)
- 用C++实现一个Quaternion类
- 传感器
- Jloi 2015 一试
- codeforces 301D. Yaroslav and Divisors(遍历和排序的艺术)