08-SNAP的命令行處理工具gpt及其批處理(Sentinel-1和Sentinel-2爲例)

導語

如果我告訴你,SNAP中僅需一行代碼即可以完成某地整年Sentinel衛星影像的預處理,而僅僅需要數小時而已,你是否該對SNAP該“刮目相看”了?

前言

用過SNAP GUI(圖形用戶界面)界面的同學,常常抱怨SNAP顯示慢、處理速度慢、沒有GPU加速功能等,這些在SNAP官方論壇中已經有許多用戶提及到,SNAP官方開發者早開始着手解決這些問題。其中主要的原因是SNAP的源碼是使用Java寫的,相對於C/C++等編譯語言來說,正常情況下在進行大數據量運算時速度明顯慢一些,另一個問題就是java虛擬機在SNAP經常不能及時釋放內存,導致大數據量的處理或報錯或者很慢。當然,使用Java有明顯的一個好處,那就是跨平臺(windows、linux、unix、Mac系統)運行,開發很大的便利。顯示慢的一個原因,我覺得應該是SNAP保存影像數據時是不像ENVI、ArcGIS沒有創建相應的影像金字塔輔助文件,另一方面如果創建金字塔,又會耗費不少硬盤空間,總之各有利弊。

不過,也不是說沒有辦法加快SNAP的運行速度。硬件上,大運行內存明顯能加速加速大數據量影像的處理,而固態硬盤則明顯改善影像數據的讀寫速度,這些都是常規的硬件加速方法,但是需要花費一定的費用;軟件上,使用SNAP的流程圖或者命令行工具gpt可以明顯加速數據的處理速度,這是我一直提倡在SNAP處理Sentinel衛星影像的方式,原因是其避免了大量中間過程的數據讀寫過程。當然,gpt工具已經是編譯後二進制程序(像C/C++等編譯後的.exe可執行程序一樣),而非Java虛擬機識別jar程序(Java字節碼程序),這對運算速度又有一定的提升。當然,SNAP的Python包snappy或者利用Java源碼結合多進程、多線程技術、分塊技術並行計算也是一種加速的辦法。

這次,探討的是SNAP的命令行工具gpt,接下來,你可以看到使用gpt工具給數據處理速度帶來質的飛躍,並且,這是在僅需要少量(一句或者幾句)的代碼即可以高效地完成數據處理。這裏,要感謝SNAP官方開發者在命令行工具的出色設計,使得我們可以非常簡單地實現Sentinel等衛星的快速預處理以及常規的遙感處理操作。

儘管本文是以Windows10系統爲例的,但是在linux,mac系統使用SNAP的gpt工具命令是類似的。

(博主最近購買了兩個16G內存條(每個約400元),將運行內存升級到了32G(之前是16G),有條件可以結合電腦的實際情況買個內存條升級一下,在SNAP中的體驗應該會有很大提升。不過,除了後文的批量處理,小內存的電腦(4G或8G)可能會出現內存不足的報錯,前面的一些簡單gpt命令行操作應該是毫無壓力。本文,除了最後的Sentinel-1 IWGRDH批量處理操作要求內存高(應該需要16G內存)外,其餘的操作應該8G內存就可以。不一定要像博主,非要達到32G。不過,大的運行內存,相對而言,處理大數據會方便許多!另外,應該確保C盤至少有20G的空間,以便存放SNAP或者gpt運行時產生的大量臨時文件)

gpt命令行工具簡介

儘管使用SNAP GUI界面可以不編寫代碼,通過鼠標的點擊即可以完成衆多處理操作,但是,一旦你熟悉了SNAP的gpt工具,處理起來Sentinel衛星數據就會非常得心應手,就像“切瓜炒菜”那樣自然、簡單。一些沒有命令行編程,可能黑漆漆的界面,可能感到恐懼,其實,早期的電腦就是隻有這樣的命令行界面(包括現在linux、mac系統仍保留這樣設計),這隻過回到比較原始的編程界面上,和普通的IDE界面編寫程序基本是一樣的,除了語法有點區別。實際上,啓動GUI界面,佔用不少的系統資源,在資源有限的系統上是會拖慢程序的運行速度的。慶幸的是,我們只需要掌握少數的SNAP的gpt命令行工具命令即可以完成多數的處理了。好了,講了那麼多,究竟是不是這樣,需要體驗過才相信!

gpt命令行工具的位置

gpt命令行工具(gpt.exe)位於SNAP安裝路徑下snap文件夾下的bin文件夾下(和snap64.exe在同一文件夾下),如下是博主的安裝路徑:
E:\SNAP\install_path\snap\bin
如下圖:在這裏插入圖片描述
如果你看不到後綴名.exe,你可能需要設置一下顯示文件擴展名以及隱藏的項目:
在這裏插入圖片描述

在上圖中,你可以看到多個.exe程序(以及對應的配置文件.vmoptions),其中snap64.exe是啓動SNAP GUI界面的主程序, pconvert.exe是一個數據轉換程序。如果你在命令行中輸入:snap64,你會發現SNAP GUI見面啓動了(實際上,SNAP桌面快捷方式綁定的正是這個程序)。
在當前文件路徑下啓動命令行界面:
在這裏插入圖片描述
或者按shift鍵+鼠標右鍵單擊:
在這裏插入圖片描述
在命令行界面輸入:snap64(或者snap64.exe),你會發現SNAP的GUI界面打開了。
在這裏插入圖片描述
爲了避免每次調用gpt不用在SNAP安裝路徑下啓動命令行界面,建議你將SNAP的安裝路徑下snap文件夾下的bin文件夾添加用戶環境變量中:
在這裏插入圖片描述

gpt命令行語法參數

在打開的命令行界面輸入:

gpt -h

(可能需要等待數十秒,因爲這個命令行包括的操作和命令太多了,稍後會顯示一大片的英文文檔說明,鼠標往前拉,先看下前面的參數。絕大數情況下,我們不要記住那麼多得參數,只需要在用到的時候找到其即可)

可以看到其語法說明(Usage),尖括號<>表示必須要填寫的參數,中括號[]表示可選的參數,豎線 |: 用於分隔多個互斥參數,含義爲“或”,使用時只能選擇一個。如果你想看下命令行常見語法格式說明符可以看下這篇博客命令行語法格式及特殊字符

# <op>表示某一操作符,<graph-file>表示SNAP流程圖文件(xml文件);見Arguments參數
# <options>表示可選參數,-h, -e, -f等等,見Options選項
# <source-file-1>表示源數據文件,當然後面還可以多個源數據文件
gpt <op>|<graph-file> [options] [<source-file-1> <source-file-2> ...]

(#號表示的是註釋說明)
在這裏插入圖片描述
有幾個Options參數是比較重要的(你可能暫時看不懂-S和-P參數的說明,不過,不重要,帶着疑問繼續往下看,後面展示其用法時,再討論其表示的意思):

  • -h: 顯示幫助命令;
  • -t <file>: 表示輸出文件名(用file表示),如果沒有這個參數,默認輸出的文件名是target.dim;
  • -f <format>:表示輸出的格式(用format表示),默認的是“BEAM-DIMAP”,當然你也可以輸入“GeoTIFF”, "ENVI"等格式輸出;
  • -S<source>=<file> :這是由xml文件定義的源文件參數變量${<source>}指示(爲什麼是-S?答案是簡寫,S表示source的第一個字母)。
  • -P<name>=<value>:這個參數和-S<source>=<value>是類似的,但是更加通用,可以在xml文件設置名稱字值對變量(爲什麼是-P?答案也是簡寫,P表示parameters的第一個字母)。後面批處理是會展示其用法;

如果你繼續往下拉,可以看到Opterators,其下均是SNAP支持的操作(按字母升序排列,A->Z):
在這裏插入圖片描述

數據源

Sentinel-1數據

以覆蓋上海市的sentinel-1 IW GRDH 產品數據(2019年6月-2020年5月)爲例(源數據無需解壓):
在這裏插入圖片描述
範圍如下:
在這裏插入圖片描述

Sentinel-2數據

以覆蓋位於山東省東營市的黃河三角洲區域爲例,以下爲其2019年1月-201912月的近似無雲(雲量少於5%)的Sentinel-2 L2A影像(源數據無需解壓):
在這裏插入圖片描述
範圍如下:
在這裏插入圖片描述

gpt實現單一操作

單個數據集單一操作處理

Sentinel-2 NDVI計算

在上述的gpt命令行參數界面Operators的參數表中往下拉找到N字母開頭的NdviOp操作,這就是我們要找的SNAP的NDVI計算命令行操作, 在命令行界面下,輸入:gpt NdviOp -h, 可以查看該操作符命令參數的相關說明(gpt,NdviOp可以混寫大小寫,但帶-的參數,需要嚴格區分大小寫,例如這裏-h)。

gpt NdviOp -h

可以看到如下的參數說明:
源文件參數 -Ssource=<file>,表示源數據,file用文件名代替,尖括號表示該參數是必須的,不可缺失,後面float,string的尖括號也表示相同的意思;

-PnirFactor=<float>,-PredFactor=<float> 分別表示近紅外波段,紅光波段的比例調節因子,在我們常用的NDVI計算其比例因子均爲1,這裏的默認值爲1.0F(表示浮點數的1.0),通常我們不需要輸入這個參數;

-PnirSourceBand=<string> , -PredSourceBand=<string> 分別表示近紅外波段,紅光波段,string表示波段名;

其後,還跟有一個Graph XML Format,顯示該操作默認調用的xml文件內容, 這裏你看到其中在<sources>節點中含有的${source},所以我們源文件用的參數是-Ssource=<file>。假如我用的xm文件中<sources>節點將${source}改爲${input},這時我們轉入源文件,則源文件參數用法變爲變爲-Sinput=<file>。這裏,暫時該不了其默認的xml文件,暫時擱置着個改動一會先。

該操作的命令行見Usage:

# optional表示可選項參數,即上面帶-的相關參數,如-Ssource等
gpt NdviOp [optional]

在這裏插入圖片描述

先簡單展示一下,博主的源數據文件夾以及輸出文件夾位置:
在這裏插入圖片描述
以第一景數據爲例,即S2A_MSIL2A_20190122T025021_N0211_R132_T50SPG_20190122T065329.zip

好了,是時候展示其命令行用法(注意=兩邊不要有空格,-t參數是沒有等號的,輸入和保存的文件路徑可能需要你手動修改一下,這裏的輸出文件名爲S2A_MSIL2A_20190122T025021_N0211_R132_T50SPG_20190122T065329_ndvi.dim,加了後綴並且使用了標準的SNAP格式BEAM-DIMAP,如果後綴名改爲.tif,默認是以“GeoTiff”格式輸出,當然在命令行上,加上-f “GeoTIFF”)。

# 雖然是一句命令,但是添加路徑後,顯得很長。可以將最後一行命令複製到一個.txt文件中,
# 在.txt文本中也容易編輯命令。確認命令無誤後,
# 打開命令行界面(在命令行界面中點擊鼠標右鍵則可以粘貼拷貝的文本了)
# -Ssource表示源文件的絕對路徑(儘管也可以使用相對路徑,但是絕對路徑安全一些),
# 爲什麼在路徑中添加了雙引號,這樣可以避免路徑中出現空格導致路徑被分隔開識別
# -PnirSourceBand表示近紅外波段名,Sentinel-2對應的近紅外波段名爲B8
# -PredSourceBand表示紅光波段名,Sentinel-2對應的紅光波段名爲B4,
# B8與B4分辨率均爲10m,且柵格影像大小一樣,所以可以直接進行ndvi的計算
# -t 表示輸出的文件名,路徑也是添加了雙引號,注意博主加了後綴_ndvi.dim
gpt NdviOp -Ssource="G:\2019_S2_data\S2A_MSIL2A_20190122T025021_N0211_R132_T50SPG_20190122T065329.zip" -PnirSourceBand="B8"  -PredSourceBand="B4" -t "G:\2019_S2_data\Test_NDVI\S2A_MSIL2A_20190122T025021_N0211_R132_T50SPG_20190122T065329_ndvi.dim"

(尋找命令需要耗費幾十秒的時間,執行計算ndvi的命令大概需要兩分鐘的時間,速度還算可以)
由於博主已經將SNAP安裝路徑下的bin文件夾(gpt.exe的父路徑)添加到了環境變量中,所以我可以在任意一個文件夾打開命令行窗口,這裏是在輸入
在這裏插入圖片描述
我們將原始數據(.zip),以及生成對應的的NDVI導入SNAP查看效果:
在這裏插入圖片描述
perfect! 你可以在SNAP的命令行界面中調用NDVI工具來計算,結果應該是一樣的。
(當然,僅僅處理單個數據集和單個操作並沒有展現出gpt的優勢所在,甚至,你還需要記錄那麼多的命令行參數,展現其威力的地方更多地體現在批處理上,保持一點耐心,繼續往下看)

Sentinel-1 軌道校正

其實使用輻射定標操作演示更好的,但是軌道校正通常是SNAP中SAR數據處理的第一步,也無妨,這裏僅僅演示Sentinel-1的gpt單一操作命令行處理。

同樣地可以通過命令行命令:

gpt -h

找到軌道校正的操作符命令名稱:Apply-Orbit-File(如果你熟悉SNAP的GUI界面是很容知道的)
在這裏插入圖片描述

接下來查看該命令符的用法:

gpt Apply-Orbit-File -h

可以看到其用法和參數(注意到其中Parameter Options下的三個-Pxxx參數都有默認值,我們在使用命令行命令中可以不加以設置):
在這裏插入圖片描述

當然,其默認的參數設置和SNAP的GUI界面默認參數是一一對應(SNAP中,每一個GUI操作界面都可以查看其對應xml文件參數):
打開SNAP的GUI界面(可以導入已經Sentinel-1數據,或者不導入也無關係),點擊Radar—>Apply Orbit File,可以打開該操作的GUI界面。
在這裏插入圖片描述
然後,點擊File—>Display Parameters…
在這裏插入圖片描述
查看參數(可以和命令行Apply-Orbit-File操作大的參數對比一下,可見它們參數的默認值是相同的,參數名也是相同的,除了命令行參數中多帶了-P字眼。前面提到,-P中P是parameters的首字母):
在這裏插入圖片描述

這裏以該景Sentinel-1 IW GRDH數據爲例:
S1A_IW_GRDH_1SDV_20190617T095445_20190617T095510_027718_0320F1_218D.zip

好了,是時候展示一下其用法了。由於我們使用默認參數,相對前一個計算NDVI的命令來說,這個要簡單一些(注意=兩邊不要有空格,-t參數是沒有等號的,輸入和保存的文件路徑可能需要你手動修改一下,這裏的輸出文件名爲S1A_IW_GRDH_1SDV_20190617T095445_20190617T095510_027718_0320F1_218D_Ort.dim,加了後綴並且使用了標準的SNAP格式BEAM-DIMAP,如果後綴名改爲.tif,默認是以“GeoTiff”格式輸出,當然在命令行上,加上-f “GeoTIFF”)。

# 雖然是一句命令,但是添加路徑後,顯得很長。可以將最後一行命令複製到一個.txt文件中,
# 在.txt文本中也容易編輯命令。確認命令無誤後,
# 打開命令行界面(在命令行界面中點擊鼠標右鍵則可以粘貼拷貝的文本了)
# -Ssource表示源文件的絕對路徑(儘管也可以使用相對路徑,但是絕對路徑安全一些),
# 爲什麼在路徑中添加了雙引號,這樣可以避免路徑中出現空格導致路徑被分隔開識別
# -t 表示輸出的文件名,路徑也是添加了雙引號,注意博主加入後綴_Orb.dim
gpt Apply-Orbit-File -Ssource="D:\temp_SAR\S1A_IW_GRDH_1SDV_20190617T095445_20190617T095510_027718_0320F1_218D.zip" -t "D:\temp_SAR\test_apply_orbit_file\S1A_IW_GRDH_1SDV_20190617T095445_20190617T095510_027718_0320F1_218D_Orb.dim"

運行結果(大概一兩分鐘的時間):
在這裏插入圖片描述
將原始數據和軌道校正後的數據導入看看結果正確與否:
在這裏插入圖片描述 perfect!正確無誤。好了,接着講一下單一操作的批處理了。

多個數據集批量單一操作處理

批量處理時要確保你的硬盤有足夠的存儲空間,下載數據集最後單獨放在一個文件夾下,不用使用中文路徑

Sentinel-2時序NDVI計算

如果你有某一地區的多景Sentinel-2影像數據,你應該很希望獲得其時序NDVI曲線,這可能是植被、農作物等地物分類或監測常見的時序特徵曲線,可能這是Sentinel-2多時相分析最常見的需求了。不過藉助SNAP的gpt命令行工具,很容易實現這個需求。已經下載了2019年黃河三角洲每月的Sentinel-2 L2A影像,只需要在gpt命令行實現批量ndvi計算(執行NdviOp操作符)即可。

注意PowerShell(這是一個類似Linux終端的命令行,但是語法又不完全和linux)和windows 標準命令行命令不一樣,下面的語法要在標準命令行代碼性需要在標準命令行運行纔可以。幸運的是很容易在PowerShell命令行窗口進入windows 標準命令行窗口, 只需要在PowerShell命令行窗口(該命令行帶有PS的提示符)輸入cmd即可:

cmd

博主的數據放在這個文件夾(G:\2019_S2_data)下, 輸出目錄爲G:\2019_S2_data\Test_NDVI(儘管該目錄下有上一次單一數據集的ndvi操作結果,但是批量不會有影響,默認是會覆蓋該數據集,當然,你也可以手動刪除它):

在這裏插入圖片描述
在輸入文件目錄啓動PowerShell,然後輸入cmd,切換到windows標準的命令行窗口:
在這裏插入圖片描述
然後才輸入下面最後一句命令(見上面的執行界面):
(如果你需要處理自己的數據集,只需修改對應的輸入、輸出目錄路徑即可)

# 雖然仍是一句命令,但是添加路徑後,顯得很長。可以將最後一行命令複製到一個.txt文件中,
# 在.txt文本中也容易編輯命令。確認命令無誤後,
# 打開命令行界面(在命令行界面中點擊鼠標右鍵則可以粘貼拷貝的文本了)
# /r "G:\2019_S2_data" 表示在該路徑下迭代文件,這是博主存放源數據的目錄
# %X是迭代變量,這裏用於表示迭代的zip文件絕對路徑
# *.zip 是正則表達式語法,這裏是後綴含有.zip的文件
# -Ssource=%X 表示gpt的源文件
# -t "G:\2019_S2_data\Test_NDVI\%~nX_ndvi.dim" 表示輸出文件完整絕對路徑,
# G:\2019_S2_data\Test_NDVI是博主的輸出文件路徑,
# %~nX表示獲取XXXX.zip文件不帶後綴.zip的文件名。
# 注意博主這裏的輸出文件添加了後綴_ndvi.dim
for /r "G:\2019_S2_data" %X in (*.zip) do (gpt NdviOp -Ssource=%X -PnirSourceBand="B8"  -PredSourceBand="B4" -t "G:\2019_S2_data\Test_NDVI\%~nX_ndvi.dim")

(如果,你對windows命令行for循環命令不是很瞭解,你可以參考一下這篇文章BAT 批處理腳本教程(詳細篇腳本之家補充)
另外,我想證明SNAP的gpt命令行的執行效率高,一種簡單的方式,是你可以打開任務監測器看下其CPU利用率(如果你感興趣的話可以和SNAP GUI界面執行對比一下):
在這裏插入圖片描述
大約需要10分鐘左右的時間(12景影像,平均每景不到一分鐘):
在這裏插入圖片描述
到輸出數據目錄看看:
在這裏插入圖片描述
很好!我要的結果全部在。

當然,黃河三角洲2019年各月份的NDVI影像我們已經有了,接下來看下如何在SNAP GUI界面中查看某點(通常可以是你的實測點,如果你有該點的經緯度座標的話)的時序曲線:

先導入數據:在這裏插入圖片描述

打開一景ndvi影像:
在這裏插入圖片描述
在此之前,先回答一個疑問:按照同一個足跡(按哥白尼數據中心同一搜索框,或者你稱爲研究區也是可以的)下載的Sentinel-2數據是否還需要配準?答案是不需要的,因爲歐空局哥白尼數據中心在生產Sentinel-2影像已經做過幾何校正(正射校正)了(利用其近乎遍佈全球的控制點,調整和控制誤差幾何誤差),當然,如果你實地測了大範圍的控制點,並且你能確保測量的準確性,也是可以做一下配準。如果是同一個研究區(同一個足跡)的Sentinel-2(S2A,S2B,單一源)源影像,是無須配準的,但是,如果是不同源的數據,如Sentinel-2和landsat,Sentinel-1和Sentinel-2,不同源數據融合的話,最好還是配準一下。

爲了讓你看下Sentinel-2影像的幾何校正(正射校正)效果,可以藉助打開前四景ndvi影像,均勻分屏顯示(並且我可以告訴你,連影像大小,柵格像素數都是一致):
在這裏插入圖片描述
均勻分屏:在這裏插入圖片描述
在這裏插入圖片描述

如果和光產衛星數據對比一下,你就會驚訝於Sentinel-2數據的幾何校正效果。
很好,我們的Sentinel-2 NDVI數據集是一一對應的,接下來可以看下其時序曲線了。
(可以打開的後3個ndvi的影像窗口)

打開時序曲線窗口(見下圖):
在這裏插入圖片描述
時序曲線設置窗口:在這裏插入圖片描述

(儘管你可以通過向上或向下箭頭一一調整數據集的順序,時期按照日期遞增順序排列,但這樣對於時序曲線窗口而言不是必須的,時序曲線窗口自動提取日期並繪製其時間對應的時間序列曲線)
在這裏插入圖片描述
篩選繪製的波段(這裏的ndvi_flag對我們來說不是很有用的信息,它是一個標誌波段,衡量ndvi質量的, 見04篇博客在這裏插入圖片描述
在這裏插入圖片描述
更多的說明請查看SNAP官方論壇Time Series (Temporal) of NDVI的討論。

Sentinel-1批量軌道校正

有了上述經驗,Sentinel-1 IW GRDH 批量軌道校正也是輕易的事情。
博主的Sentinel-1源數據集目錄爲D:\temp_SAR,輸出目錄爲D:\temp_SAR\test_apply_orbit_file:
在這裏插入圖片描述
批量校正命令:
(如果你需要處理自己的數據集,只需修改對應的輸入、輸出目錄路徑即可)

# 雖然仍是一句命令,但是添加路徑後,顯得很長。可以將最後一行命令複製到一個.txt文件中,
# 在.txt文本中也容易編輯命令。確認命令無誤後,
# 打開命令行界面(在命令行界面中點擊鼠標右鍵則可以粘貼拷貝的文本了)
# /r "D:\temp_SAR" 表示在該路徑下迭代文件,這是博主存放源數據的目錄
# %X是迭代變量,這裏用於表示迭代的zip文件絕對路徑
# *.zip 是正則表達式語法,這裏是後綴含有.zip的文件
# -Ssource=%X 表示gpt的源文件
# -t "D:\temp_SAR\test_apply_orbit_file\%~nX_Orb.dim" 表示輸出文件完整絕對路徑,
# D:\temp_SAR\test_apply_orbit_file是博主的輸出文件路徑,
# %~nX表示獲取XXXX.zip文件不帶後綴.zip的文件名。
# 注意博主這裏的輸出文件添加了後綴_Orb.dim
for /r "D:\temp_SAR" %X in (*.zip) do (gpt Apply-Orbit-File -Ssource=%X  -t "D:\temp_SAR\test_apply_orbit_file\%~nX_Orb.dim")

在這裏插入圖片描述

結束了(大約每景1分半,24景需要40分鐘左右的時間):在這裏插入圖片描述在這裏插入圖片描述

就單個操作的處理,對於Sentinel-1來說不是很有用,Sentinel-1(或者別的SAR數據)的預處理往往需要多步(類似流程圖的處理操作)。

gpt搭配流程圖實現流程式處理

如果僅僅在gpt中執行單個處理操作,未免有點“大材小用”了,gpt的高效處理在流程式操作才能體現出來。

本篇博客所用的流程圖文件以及代碼見百度雲盤:
鏈接:https://pan.baidu.com/s/1vxkJX0S4_TWx-N1r7pOfTA
提取碼:eak9

單個數據集流程圖處理

Sentinel-2 L2A 數據集流程式處理

仍然以S2A_MSIL2A_20190122T025021_N0211_R132_T50SPG_20190122T065329.zip
這景數據爲例。

來創建一個Sentinel-2 L2A 用於分類特徵數據集,流程如下圖(如果你對流程圖的步驟不是很熟悉,可以看下04篇博客波段疊加部分):
在這裏插入圖片描述

這個流程圖(創建流程圖一定注意步驟順序,否則很容易出錯)實際上是博客03和04篇博客的步驟總結,具體是先現將Sentinel-2數據重採樣至10米(以10米波段2分辨率爲依據),然後裁剪出黃河三角洲區域,隨後做主成分變換(提取3個主成分),利用得到第一個主成分通過其共生紋理矩陣計算其四個紋理特徵(對比度、二階角動量、熵、方差);通過波段運算計算NDVI(歸一化植被指數)、MNDWI(改進歸一化水體指數)、BI(土壤亮度指數)、NDre1(紅邊波段歸一化指數1)四個指數特徵;最後,將紋理特徵、指數特徵和原來的光譜特徵通過BandMerge工具疊加起來,寫入到數據集。

各個流程節點參數(只對需要注意的參數進行標註):
Read:在這裏插入圖片描述
Resample:
在這裏插入圖片描述
Subset:
在這裏插入圖片描述
PCA:
在這裏插入圖片描述
GLCM:在這裏插入圖片描述
BandMaths:
在這裏插入圖片描述
BandMaths(2):
在這裏插入圖片描述
BandMaths(3):
在這裏插入圖片描述
BandMaths(4):
在這裏插入圖片描述

BandMerge:
在這裏插入圖片描述
Write:
(博主創建了一個源數據目錄下創建了一個S2_features文件夾用於保存生成的Sentinel-2特徵數據集)
在這裏插入圖片描述

保存流程圖文件

在這裏插入圖片描述

然後關閉流程圖窗口,關閉SNAP,進入保存的流程圖xml文件,查看流程圖文件:
在這裏插入圖片描述

可以看下其節點內容(如果你熟悉html網頁文件的話,應該可以識別每個節點的內容),先看看其內容,以增強你對流程圖參數文件認識,不要改動其中的內容。
(上下拖動鼠標瀏覽後,可以關閉該xml文件)

我告訴你接下來,只需要使用gpt命名行輸入一句命令即可以執行該景數據的預處理,啓動一個PowerShell命令行窗口:

# G:\2019_S2_data\test_S2_features.xml爲流程圖文件的絕對路徑,
# 你可能結合自己的流程圖文件改動一下路徑
# 因爲我們在創建流程圖時定義數據集的輸入與輸出
# 所以這裏命令行參數沒有輸入和輸出參數
gpt G:\2019_S2_data\test_S2_features.xml

不好意思,上述複雜的流程圖計算,博主使用gpt命令行工具,僅用了兩分鐘(不到一個上小便的時間)就完成計算了(當然,博主把研究區裁剪到了近似原來的1/10,數據量少了很多,但是其效率仍然很高):
在這裏插入圖片描述生成的數據集:
在這裏插入圖片描述

將該數據導入SNAP看下效果:
在這裏插入圖片描述
perfect!就是這樣輕鬆愉快就得到了一個用於分類的數據集。
如果你想利用這個數據集來做隨機森林分類,請參考05篇博客

Sentinel-1 IW GRDH 數據集流程式處理

仍然以07篇該景數據爲例:

創建的流程圖請參考博客07篇流程圖預處理部分預處理部分:
在這裏插入圖片描述
該流程圖的各節點參數均與07篇流程圖預處理部分的路程圖參數相同:
在這裏插入圖片描述
然後關閉流程圖窗口和SNAP。
博主的源數據和保存的流程圖文件目錄爲D:\temp_SAR,要保存的輸出文件目錄爲D:\temp_SAR\Sentinel_1_processed。

在源數據文件目錄啓動一個PowerShell窗口,輸入以下一句命令:

# D:\temp_SAR\S1_iw_grd_preprocess.xml爲流程圖文件的絕對路徑,
# 你可能結合自己的流程圖文件改動一下路徑
# 因爲我們在創建流程圖時定義數據集的輸入與輸出
# 所以這裏命令行參數沒有輸入和輸出參數
gpt D:\temp_SAR\S1_iw_grd_preprocess.xml

在這裏插入圖片描述
大概需要耗費10左右分鐘的時間,便處理完成。
在這裏插入圖片描述
將預處理後的數據導入SNAP查看一下效果:
在這裏插入圖片描述

gpt工具很好地完成了處理!

多個數據集批量流程圖處理

絕大多數SNAP中的功能在流程圖中都能找到其操作名,包括部分添加到SNAP的第三插件,而只要是流程圖帶有的節點操作,在SNAP的gpt中都是可以實現的。

Sentinel-2 L2A 數據集批量流程式處理

我估算了一下運算量,應該8G運行內存的電腦是可以實現這個流程圖的批處理的,因爲流程圖做做了裁剪操作,運行內存的電腦跑這個批處理可能比較喫力

有時候我們希望得到同一地區多景Sentinel-2特徵數據集,以便分析其時序特徵或時序變化化又或者進行多時相的分類或變化檢測等。幸運的是利用流程圖文件和gpt命令行工具,我們很容易實現數據量批處理。

利用上述Sentinel-2 L2A 數據集流程式處理部分,創建的流程圖文件和gpt工具很容易實現獲取多景Sentinel-2特徵數據集的批量處理。但是,我們需要對流程圖xml文件做一些小修改:

先打開相應的流程圖文件:
在這裏插入圖片描述
我們需要修改輸入和輸出節點的文件,設置gpt命令行-P參數變量:

對於輸入節點<node id=“Read”>的<file>內容:
由:
<file>G:\2019_S2_data\S2A_MSIL2A_20190122T025021_N0211_R132_T50SPG_20190122T065329.zip</file> 改爲:
<file>$input</file>
gpt命令行-P參數變量,由美元符$開頭指示,input是其變量名。
在這裏插入圖片描述
對於輸出節點<node id=“Read”>的<file>內容:在這裏插入圖片描述
<file>G:\2019_S2_data\S2_features\Subset_S2A_MSIL2A_20190122T025021_N0211_R132_T50SPG_20190122T065329_features.dim</file> 改爲:
<file>$output</file>
gpt命令行-P參數變量,由美元符$開頭指示,output是其變量名。
即:
在這裏插入圖片描述

(儘管這裏只把gpt命令行工具-P參數變量定義了輸入文件和輸出文件變量,但是你可以藉助美元符$將流程圖的任意參數定義爲-P參數變量,例如你可以可能需要定義輸出數據的分辨率、選擇輸出的波段、座標系統等。)

完成這兩處的修改後,關閉該xml文件,到源數據目錄下啓動一個PowerShell窗口:
注意,批處理先要進入windows標準命令行窗口(先輸入cmd)

然後輸入下面一句命令:

# 你可能需要結合實際調整一下你的輸入目錄和輸出目錄
# /r "G:\2019_S2_data" 表示迭代目錄
# %X 表示設置的迭代變量,即某個(.zip)文件名的絕對路徑
# G:\2019_S2_data\test_S2_features.xml 表示要處理的流程圖文件的絕對路徑
# -Pinput=%X 其中-Pinput表示流程圖中input變量(-P參數變量),%X表示引用的文件名
# -Poutput="G:\2019_S2_data\S2_features\Subset_%~nX_features.dim" ,
# -Poutput表示流程圖中的output變量(-P參數變量), G:\2019_S2_data\S2_features表示輸出文件的父目錄
# Subset_%~nX_features.dim 取出去掉文件名的後綴名.zip,
# 並加了前綴Subset_, 後綴_features.dim
for /r "G:\2019_S2_data" %X in (*.zip) do (gpt G:\2019_S2_data\test_S2_features.xml -Pinput=%X  -Poutput="G:\2019_S2_data\S2_features\Subset_%~nX_features.dim")

在這裏插入圖片描述
大概花費了半小時(12景數據),還算可以啦!
在這裏插入圖片描述
打開SNAP檢查一下數據(很nice):
在這裏插入圖片描述

Sentinel-1 IW GRDH 數據集批量流程式處理

由於這裏是需要兩景Sentinel-1 IW GRDH進行鑲嵌,對運行內存要求較高,我估算了一下,8G運行內存的電腦可能比較喫力,16G運行內存的電腦應該是沒有問題的,另外,你需要確保保存數據目錄有足夠的存儲空間,Sentinel-1的數據通常很大,這裏鑲嵌後的一景約5G大小)

同樣,如果你需要對Sentinel-1 IW GRDH數據做同樣的處理,定義gpt命令行工具的輸入和輸出的-P參數變量(當然,還可以有其它的-P參數變量)。

這次博主使用的流程圖見07篇 博客方式3:TOPSAR技術鑲嵌,該流程圖比較複雜,如下:
在這裏插入圖片描述
(有兩個輸入,1個輸出,該流程圖的參數與07篇 博客方式3:TOPSAR技術鑲嵌,這裏不再重複贅述了)

因爲需要由同一天相鄰的順軌上下兩景Sentinel-1 IW GRDH影像來合成覆蓋整個上海市範圍的影像,這就會帶來煩惱,如何在批量的數據集中確保鑲嵌時的剛好對應的是同一天相鄰的順軌上下兩景?
在這裏插入圖片描述
但是,要是在命令行中迭代兩個變量會麻煩一些,並且提取文件名信息也有點麻煩!我並沒有找到合適的cmd命令,但是,的確要辦法實現的,結合C語言毫無疑問是可以實現的。除了這個麻煩,還可能還有一個麻煩,就是gpt的佔用內存不能及時釋放的問題,導致程序變慢甚至報錯。

考慮到後面要介紹snappy,這裏使用Python調用cmd命令,優雅地實現這個批量處理。Python中衆多很方便的庫包,我們僅用標準庫即可。關於gpt的內存釋放問題,這裏使用的一種技巧是殺死進程,強制釋放JVM(java虛擬機)的內存。即每一次調用cmd進程,執行完命令後,關閉該cmd進程,再新啓動一個cmd進程處理。

思路已有,接下來。我們需要修改流程圖文件(這裏文件名爲:S1_mosaic2.xml),定義3個-P參數變量:

節點<Read>:
由:
<file>G:\test\S1A_IW_GRDH_1SDV_20190828T095515_20190828T095540_028768_034210_860C.zip</file>
改爲:
<file>$input1</file>
gpt命令行-P參數變量,由美元符$開頭指示,input1是其變量名。

節點<Read(2)>:
由:
<file>G:\test\S1A_IW_GRDH_1SDV_20190828T095515_20190828T095540_028768_034210_860C.zip</file>
改爲:
<file>$input2</file>
gpt命令行-P參數變量,由美元符$開頭指示,input2是其變量名。

變動前:
在這裏插入圖片描述變動後:
在這裏插入圖片描述
節點<Write>:
由:
<file>G:\test\S1A_IW_GRDH_1SDV_20190828T095515_20190828T095540_028768_034210_860C.zip</file>
改爲:
<file>$input2</file>
gpt命令行-P參數變量,由美元符$開頭指示,input2是其變量名。

變動前:
在這裏插入圖片描述
變動後:
在這裏插入圖片描述
OK! 修改完畢!萬事俱備,只欠東風!

(實際代碼是不長的,博主加了詳細的註釋,應該是不難理解的。另外,在此之前,一定要檢查C盤是否有足夠的存儲空間,至少應該要有20G,在前面gpt命令行操作過程中應該。以下代碼可能你還需要更改輸入、輸出路徑和輸出文件名前、後綴名)

# -*- coding: utf-8 -*-
# Author: 超級禾欠水
# Python 3.6.7 win64

# 導入相關庫
import os
import glob
import subprocess
import time


# Sentinel-1 IW GDRH元數據壓縮包存放目錄,輸入目錄
data_path = r'D:\temp_SAR'

# 保險起見, 對找到的元數據(.zip)按文件名進行排序
# 這樣同一天的影像相鄰的
datas = sorted(glob.glob(os.path.join(data_path, '*.zip')))

# 流程圖文件路徑
xml_file = r'D:\temp_SAR\S1_mosaic2.xml'

# 輸出目錄
output_path = r'D:\temp_SAR\Sentinel_1_processed'

# 將同一天的兩景影像分別存於兩個列表part1_datas, part2_datas
# 因爲排序過文件名,可以確定同一天相鄰的兩景影像分別存於兩個
part1_datas = datas[::2]
part2_datas = datas[1::2]


for input1, input2 in zip(part1_datas, part2_datas):
    # 獲取輸入文件的文件名
    basename_input1 = os.path.basename(input1)
    # 提取日期時間
    date = basename_input1.split('_')[4][:8]
    # 打印日期
    print("date:", date)
    # 輸出的文件名, 後綴名'.dim'表示這裏使用SNAP的標準文件格式(BEAM-DIMAP)
    out_file = 'S1_Shanghai_' + date + '.dim'
    # 輸出文件的絕對路徑
    output = os.path.join(output_path, out_file)
    # 要調用的命令行參數列表
    command = ['gpt', xml_file, '-Pinput1=' + input1,
               '-Pinput2=' + input2, '-Poutput=' + output]

    # 如果你想看實際的命令行窗口命令可以取消下面print語句的註釋
    #print(' '.join(command))

    # 以“殺死進程”的方式調用cmd(windows標準命令行窗口)
    # 相當於在命名行執行命令“gpt xml_file -Pinput1=input1 -Pinput2=input2 -Poutput=output”
    subprocess.check_output(command)

    # “以退爲進”----分佈式爬蟲的處理“哲學”,休眠30s,等待釋放內存
    # 避免gpt因爲內存不能及時釋放,拖慢程序運行或者導致出錯
    time.sleep(30)
print("All done!")

只需在python中執行該程序就可以(你應該可以聽到你電腦的“唰唰唰”的風扇,因爲CPU的利用率很可能飆升到100%,要知道gpt默認調用所用CPU核來計算,你電腦有多少個,便調用多少個核)。

Pycharm中的運行界面(大約25分鐘的時間得到一景鑲嵌後的上海市全境影像, 由於數據量很大,需要耐心等待一下):
在這裏插入圖片描述
在這裏插入圖片描述

最終可以得到12景覆蓋上海市的Sentinel-1 IW GRD影像(2019年6-2019年5月,每月一景),總共耗費了5小時多的時間:
在這裏插入圖片描述
導入SNAP看下結果(這裏打開4景VH通道來看看):
在這裏插入圖片描述
OK !正確無誤!

類似於前面的Sentinel-2 NDVI時序曲線,一旦我們有了多景Sentinel-1影像數據,我們同樣可以輕易獲得其SAR後向散射係數時序曲線(我這裏想演示12景的時序曲線的,但是比較卡,因爲整個上海市範圍內的數據量太大了,約60G, 這裏演示4景的)。
在這裏插入圖片描述
證明了我們的操作是無誤的!See you!

後語

希望你能認識到SNAP的gpt命令行常見用法,以便高效地完成哨兵數據的處理。本文雖然只是介紹一些基本的操作,但是,SNAP可以做到更多的。事實上,SNAP完成不少衛星數據的處理,並不是只能處理Sentinel系列衛星(像landsat、Modis、ALOS、ENVISAT等都可以),只是處理Sentinel衛星是其優勢所在。

儘管本文沒有提及更高級的處理技術,例如多進程、分塊處理等,但是,這些在SNAP中保留了其接口,無論是gpt還是其python包snappy或者Java源碼都是可以實現,當然別的編程語言也可以實現,只是相對而言,自己需要做更多的工作。下篇介紹snappy的一些基本知識,或許能加深你的一些印象!

最後,如果你對歐空局開源軟件處理軟件SNAP及其snappy開發處理感興趣,可以加入博主創建的歐空局SNAP處理交流羣:665903216(這個羣已滿人),歐空SNAP處理交流羣(二):1102493346。

祝好!

參考文獻

[1] SNAP Wiki博客gpt工具批處理介紹https://senbox.atlassian.net/wiki/spaces/SNAP/pages/70503475/Bulk+Processing+with+GPT
[2] SNAP Command Line Tutoriall http://step.esa.int/docs/tutorials/SNAP_CommandLine_Tutorial.pdf
[3] 張磊,宮兆寧,王啓爲,金點點,汪星.Sentinel-2影像多特徵優選的黃河三角洲溼地信息提取[J].遙感學報,2019,23(02):313-326.
[4] 李鵬,黎達輝,李振洪,王厚傑.黃河三角洲地區GF-3雷達數據與Sentinel-2多光譜數據溼地協同分類研究[J].武漢大學學報(信息科學版),2019,44(11):1641-1649.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章