Landsat8卫星的大气校正目前国内有很多学者都在做,随便百度一下就能找到很多论文,提出的算法都有各自的亮点,学术研究上都有意义。
但是,问题来了,如果要真正拿出来处理任意一幅Landsat8的图像,具备工程化数据处理能力,且平均结果精度被广泛认可的算法程序,选哪个?
目前,我认为首选USGS-EROS项目espa-surface-reflectance中的LaSRC Version 1.3.0模块。机构够强,项目都大,Eric Vermote参与算法。额,做大气校正的都知道这个人的吧。
代码托管在git上
(https://github.com/USGS-EROS/espa-surface-reflectance)。
中国人爱用windows平台,项目需求用,但LaSRC是Linux平台,由于还依赖ESPA-PRODUCT_FORMATTER算法库,其文档比较详细,相关文件, 代码等信息都在(https://github.com/USGS-EROS/espa-product-formatter),该算法库又依赖JPEG, ZLIB, TIFF, GeoTIFF, HDF4, GCTP, HDF-EOS2, XML2, JBIG, Land/water static polygon总共10个包或文件,加上代码中大量的跨平台函数替换。所以移植windows的工作我用了近一周时间。。。。
感觉有必要在这里记录一下了。
LaSRC Version 1.3.0 Release Notes
Release Date: September 2017
Downloads
LaSRC (Landsat Surface Reflectance Code) source code
git clone https://github.com/USGS-EROS/espa-surface-reflectance.git
LaSRC auxiliary files
http://edclpdsftp.cr.usgs.gov/downloads/auxiliaries/lasrc_auxiliary/lasrc_aux.2013-2017.tar.gz
See git tag [lasrc-version_1.3.0]
这里下载的辅助文件包asrc_aux.2013-2017.tar.gz
有
90G
。。。教育网渣网速下载了整整一周。。。。
下载
espa-product-formatter
,找到里面的三个
c
库项目:
common
、
format_conversion_libs
、
io_libs
。编译
LaSRC只用到这三个库。
下载LaSRC,找到c库代码,在espa-surface-reflectance-master\lasrc\c_version\src文件夹下。
打开vs2010,新建一个C++空项目,把上面所有库的代码文件都添加进去。
添加include与lib:
这些库有的可以直接在官网上下载到win64位的包,有的需要自己编译,问题都不大,但调试过程中花了两天解决一个错误,最后发现是HDF4库与HDF-EOS2库版本不匹配的问题,所以强烈建议自己编译这两个库,注意编译时要include上GCTP库,官网上下载的是不包含的。。。
下面尝试生成vs2010的解决方案,遇到错误逐一该:
espa_metadata.h文件第72行代码错误int class。。。竟然还有用关键字命名变量名的。。。把class改成huclass。所有引用我都换了一遍。
Parse_matadata.c文件中第2190行,变量声明xmlAttrPtr attr;应该放到函数开头,这是标准c代码哎。
espa_matadata.c文件中第468行,变量声明与472行变量声明应该放到函数开头。
xmlAttrPtr attr;
xmlNsPtr ns = cur_node->nsDef;
Convert_espa_to_netcdf.c文件中提示NC_BYTE没有定义,原因是该文件include的头文件netcdf.h文件不完整,该文件在HDF4库里被集成的版本太老,删除该文件,从netcdf库官网上重下一个新的库,包含netcdf.h文件。新的文件近2000行,旧的才不到600行。
convert_espa_to_raw_binary_bip.c文件317行指针类型错误,在file_buf变量前加(char *),代码中这类内存申请不指明类型的情况很多,慢慢改吧。。。
Convert_espa_to_hdf.c文件84行出现未声明的标示符,自己查了一下hdfeos库的版本号,自己填了一个2.19。
snprintf 全部换成_snprintf,或者在所有头文件前加
#if_MSC_VER
#define snprintf _snprintf
#endif
write_global_attributes函数在convert_espa_to_hdf.h与convert_espa_to_netcdf.h中重定义错误。
修改其中一个的函数名称,还好该函数就调用一次,替换方便。
用的是vs2010,连roundf函数都没有。。。把所有6个调用位置换为原数加0.5直接截断取整。
get_args.c文件找不到getopt_long函数错误,将#include <getopt.h>改成#include "getopt.h",
GetOpt.h是一个GNU标准库的头文件,它包含一些从命令行上提取参数的工具用于基于文本C/C++应用程序。因为getopt.h不是ANSI C标准库的一部分,getopt必须编译到每个使用它的项目中,或者编译它倒一个静态类,显式的链接到程序中。在CodeProject网站上也提供基于C的GetOpt库实现,下载网址为:
http://www.codeproject.com/Articles/157001/Full-getopt-Port-for-Unicode-and-Multibyte-Microso
下载:
找出getopt.h、getopt.c、tailor.h三个文件添加到项目中。
编译成功: