USGS-EROS项目espa-surface-reflectance中的LaSRC Version 1.3.0模块利用vs2010编译出windows64位版本

Posted 吴长明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了USGS-EROS项目espa-surface-reflectance中的LaSRC Version 1.3.0模块利用vs2010编译出windows64位版本相关的知识,希望对你有一定的参考价值。

 

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.gz90G。。。教育网渣网速下载了整整一周。。。。

 

下载espa-product-formatter,找到里面的三个c库项目:commonformat_conversion_libsio_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三个文件添加到项目中。

 

编译成功:

 

 

 

以上是关于USGS-EROS项目espa-surface-reflectance中的LaSRC Version 1.3.0模块利用vs2010编译出windows64位版本的主要内容,如果未能解决你的问题,请参考以下文章

项目管理Maven系列- 清理项目编译项目测试项目打包项目安装项目

项目集与项目群项目组合的区别

项目集与项目群项目组合的区别

如何描述项目内容

maven项目转成web项目变成多个子项目

项目整体管理