1. 程式人生 > >USGS-EROS項目espa-surface-reflectance中的LaSRC Version 1.3.0模塊利用vs2010編譯出windows64位版本(一)

USGS-EROS項目espa-surface-reflectance中的LaSRC Version 1.3.0模塊利用vs2010編譯出windows64位版本(一)

product 發現 jpeg git clone args dcl 函數 中一 比較

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庫項目: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位版本(一)