01-SNAP與snappy介紹及安裝
(原創文章,轉載請註明來源,謝謝!)
前言
本文爲《SNAP與snappy》專欄第1篇博文。得益於歐空局(European Space Agency, ESA)的大力支持,現階段我們能夠使用到大量較好的免費遙感衛星數據(例如:Sentinel-1, Sentinel-2, Sentinel-3等 ),並且歐空局自主研發了與這些遙感數據相適應的開源遙感數據處理平臺-----SNAP。SNAP開源軟件闡釋了“開放的世界,自由的科學”這一精神,爲遙感相關學科研究人員帶來了方便,使得遙感數據處理分析得以更好地開展。在SNAP官方論壇中接觸到歐空局的相關專家,感受到他們紮實而淵博的知識及自由開放的精神,同時感覺到在該論壇中,我國相關科研人員關注度不夠。在國內遙感領域處理軟件方面多被ENVI、ERDAS、PCI、ArcGIS國外遙感公司壟斷,許多高校遙感圖像實踐課多是講授這些軟件操作,對開源遙感處理軟件SNAP、QGIS等介紹甚少,不利於擺脫對國外的依賴。創建《SNAP與snappy》專欄的目的,主要是爲了推廣SNAP這個開源遙感處理軟件的使用與開發,學習其先進的處理技術及底層算法,以便日後更好地爲國產遙感行業服務。後面的專欄內容將會使用開源軟件SNAP和QGIS等開源軟件介紹,少用甚至不用任何商業軟件。
關於SNAP
使用過Sentinel系列數據的遙感相關學科人員都應接觸過這個SNAP軟件,網上也有一些文章介紹,但是無論深度還是廣度,遠遠體現不出SNAP的優勢所在,在科研圈中懂SNAP的人仍然屬於少數。儘管歐空局SNAP官網等有不少關於SNAP教程資料,但是或是由於語言或是由於相關基礎知識不足,造成了一定的困難。
SNAP介紹
STEP
歐空局在SEOM項目( the Scientific Exploitation of Operational Missions)支持下爲地球科學觀測衛星(主要是Sentinel系列衛星)開發免費的、開放源碼的工具箱。歐空局將開放源碼的這些工具箱放在STEP(Scientific Toolbox Exploitation Platform)這個ESA社區平臺,用於科研人員訪問、下載使用該平臺相關軟件及其文檔,與開發人員進行溝通,在科學社區內進行對話,促進成果交流與改進,併爲使用科學工具箱培訓科學家提供教程和材料。
SNAP
以下內容大部分來自於知乎Sentinel影像專欄之《哥白尼計劃的軟件支持—SNAP》,該篇文章介紹得比較全(事實上,如果你看瀏覽過SNAP官網的話,該篇文章內容主要翻譯於官網介紹),並修改並補充了部分內容。以下內容大部分來自於知乎Sentinel影像專欄之《哥白尼計劃的軟件支持—SNAP》,該篇文章介紹得比較全(事實上,如果你看瀏覽過SNAP官網的話,該篇文章內容主要翻譯於官網介紹),並修改並補充了部分內容。
ESA工具箱支持ERS-ENVISAT任務、sentinel 1/2/3任務和一系列國家和第三方任務的衛星數據處理。這三個工具箱分別被稱爲Sentinel 1、2和3工具箱,它們共享一個稱爲SNAP的公共架構。
SNAP的前身來自於它們包含過去幾年開發的一些歷史工具箱的功能,如BEAM、NEST(Next Esa Sar Toolbox)和Orfeo Toolbox。 如果你留意過早期的一些遙感類文章的話,應該能看到這幾個軟件(工具箱)。
SNAP(Sentinel Application Platform)是哨兵數據應用平臺,是所有哨兵工具箱的基礎平臺(公共架構),爲桌面端C-S平臺。具有可擴展性、可移植性和模塊化界面。
主要特點:
- 所有工具箱的通用架構;
- 可以實現千兆影像快速顯示和導航;
- 圖形處理框架(GPF):用於創建用戶定義的處理鏈;
- 高級圖層管理:允許添加和操作新的疊加層,例如其他波段的圖像,來自WMS服務器或ESRI shapefile的圖像;
- 豐富感興趣區ROI定義,統計數據和各種出圖;
- 簡單的波段計算和疊加;
- 使用靈活的數學表達式;
- 對常見地圖投影進行準確的重投影和正射校正;
- 使用地面控制點進行地理編碼和整理;
- 自動SRTM DEM下載和選擇;
- 用於高效掃描和編目大型檔案的產品庫;
- 多線程和多核處理器支持;
- 集成的WorldWind可視化;
SNAP中所利用到的技術:
NetBeans platform – 桌面應用程序框架;
Install4J – 多平臺安裝;
GeoTools – 地理空間分析工具庫;
GDAL – 柵格、矢量數據的讀寫;
Jira –問題跟蹤;
Git – 版本控制,在 GitHub進型託管
Sentinel工具箱:
- 繼承並拓展了NEST工具箱的大部分特性,主要用於處理SAR數據:輻射定標、相干斑處理、地形校正、橢球校正、重投影、配準、時序分析、極化分解、分類、干涉等處理
- 支持的SAR衛星數據:Sentinel-1、ERS-1&2、Envisat、ALOS PALSAR,TerraSAR-X,COSMO-SkyMed、RADARSAT-2等第三方SAR數據;
- 主要用於處理多光譜數據,包括掩膜、裁剪、重採樣、直方圖統計、波譜分析、重投影、波段運算、多種指數運算器(如NDVI,NDWI,LAI,CCC等),無監督和監督分類等衆多操作
- 支持多光譜衛星數據:Sentinel-2、Envisat(MERIS和AATSR)、ERS(ATSR)、RapidEye,SPOT、MODIS(Aqua和Terra)、Landsat(TM),ALOS的第三方數據(AVNIR&PRISM)等;
- 支持數據可視化(柵格金字塔,柵格圖層色帶等)設置,數據分析(剖面圖,散點圖,相關分析),柵格數據處理(重投影、鑲嵌、聚類、分類)等處理
- 支持數據類型:Sentinel-3中的OLCI和SLSTR、Envisat(MERIS和AATSR)、ERS(ATSR)、SMOS、MODIS(Aqua和Terra),Landsat(TM),ALOS(AVNIR&)、PRISM等。
- 支持用戶使用和處理歐空局的(Soil Moisture and Ocean Salinity,SMOS)衛星獲得的數據
- 支持用戶處理Proba-V衛星獲得的數據(PROBA-V衛星的研製是處於對15年SPOT-VEGETATION觀測任務的後續行動,也是爲了最近發射的歐空局Sentinel-3陸地和海洋觀測衛星任務的準備工作。)
- PolSARPro:PolSARpro軟件提出了大量著名的Pol-SAR算法和工具,爲科學開發利用極化測量技術奠定了基礎,並使用Pol-SAR、Pol-InSAR、Pol-TomoSAR和Pol-TimeSAR數據刺激研究和應用開發,接觸過PolSAR研究方向的應該比較熟悉。
- 第三方插件
- Sen2cor:Sentinel-2 L2A產品生成和格式化處理器;它對L1C級大氣輸入數據進行大氣、地形和捲雲校正。Sen2Cor創建底部大氣,可選地形和捲雲校正反射圖像;此外,還會創建氣溶膠光學厚度,水汽,場景分類地圖和帶有質量指標性質的雲和雪概率掩膜圖像。其輸出的產品格式和L1C級用戶產品格式相同:JPEG 2000格式圖像,三種不同的分辨率,60、20和10 m。。
- Sen2Three:一個Sentienl-2 L3級處理器,用於大氣校正Sentinel-2 L2A級圖像的時間序列影像合成,Sen2Three以某一地理區域(tiles) L2A級圖像的時間序列爲輸入,通過將之前輸入圖像的所有“壞”像素逐步替換爲隨後場景的“好”像素,生成合成輸出圖像,可以實現Sentinel-2 L2A數據去雲處理。
- Sen2Res:一種將Sentinel-2產品的空間分辨率提高到10m/像素的處理器,可以保持產品的反射率。Sentinel-2 MSI沒有全色波段,但它包含4個10m/pixel波段。Sen2Res的工作原理是建立一個模型,描述這些波段之間如何共享信息(即獨立於反射率的像素內容),以及哪些信息是特定於這些波段的(即像素內容的顏色)。然後應用該模型對20m/pixel波段和60m/pixel波段進行解調,同時保持其反射率。
- SNAPHU:斯坦福大學開發免費的用於InSAR的相位解纏工具,可集成在SNAP中用於對Sentinel-1 IW SLC級產品進行InSAR處理的相位解纏。
總結
實際上SNAP是所有Sentinel工具箱和SMOS工具箱的通用架構。SNAP這一架構是地球觀測衛星(Earth Oberservation Mission)數據處理和分析的理想架構,它具有以下技術創新點:可擴展性、可移植性、豐富的模塊化客戶端平臺、通用EO(Earth Oberservation)數據抽象模型、分層內存管理和圖形處理框架(Graph Processing Framework, gpt)
SNAP的突出優勢:
- 開源(GPLv3 license), 使用java通用框架開發
- 原生態的Sentinel系列衛星處理平臺
- 支持圖形處理框架(gpt)批量處理
- 可擴展java/Python源碼(snappy)的插件
- 支持引擎和雲平臺操作
- 跨平臺單獨安裝
對於我們國家遙感相關研究人員來說,主要的缺點是:
- 暫不支持國產衛星數據的處理;
- 許多資料都是英文;
- 某些操作可能不完善,操作起來較爲麻煩。
總之一句話,SNAP是優秀的開源遙感處理軟件,值得學習和研究。
SNAP安裝
SNAP 已更新至7.0版本,還在使用舊版本的SNAP,建議升級一下。實際上SNAP V8.0已經進入開發階段了。
SNAP用戶者日大會(SNAP User Day)將於2019年9月10 日召開:屆時歐空局SNAP開發專家將會出席該大會,並對SNAP的有關問題進行解答。會分享硬核乾貨,感興趣的話,一定要關注。
SNAP v7.0的下載網址:http://step.esa.int/main/download/snap-download/。建議選擇All Toolboxes形式的安裝包,省去後面再安裝部分插件的麻煩。
SNAP的安裝比較簡單。
博主目前使用的是Windows系統,下面簡介一下Windows系統下面的關鍵步驟。
鼠標左鍵雙擊下載esa-snap_all_windows-x64_7_0.exe(這裏是Windows系統下的.exe文件)即可。
可以選擇安裝的路徑:
可以選擇安裝的工具箱,默認就行。
選擇是否安裝快捷方式及菜單目錄,默認就行。
如果你在安裝SNAP前系統已經安裝了Python(V2.7, V3.3-3.4版本)版本, 博主使用的Python 3.4.4版本,如果你沒有安裝Python的話,可以去掉小方框中的勾,暫不配置snappy文件,安裝好SNAP後再snappy也是可以的。在安裝了Python的前提下,在這一步可以直接配置snappy:
安裝配置後可以在C:\Users\XXXXX.snap\snap-python路徑(XXXXXX代表的是用戶名)下找到以下文件:
後續是正常安裝了,安裝後在桌面上會生成SNAP的快捷方式。
打開SNAP後如圖所示:
相關資源:
SNAP源碼:https://github.com/senbox-org
SNAP官方論壇: https://forum.step.esa.int/
SNAP官方Wiki博客:https://senbox.atlassian.net/wiki/spaces/SNAP/overview
SNAP版本跟蹤:https://senbox.atlassian.net/secure/Dashboard.jspa
SNAP Engine Java API文檔:
http://step.esa.int/docs/v6.0/apidoc/engine/
SNAP Desktop Java API文檔:http://step.esa.int/docs/v6.0/apidoc/desktop/
關於snappy
snappy簡介
前面說到SNAP是使用Java源代碼寫的,必定是可以用Java編寫程序進行開發的。不過,鑑於Python在目前開源世界中的數量龐大函數包和庫,SNAP提供Python API接口模塊snappy,以便充分利用大量Python的優質模塊。
安裝了snappy後,意味着你可以實現SNAP中的支持多種衛星數據(例如Sentinel-1, Sentinel-2等)處理的讀寫、處理、分析操作,並且可以藉助Python第三方庫(例如numpy, scipy,matplotlib, gdal, scikit-learn)快速實現各種自定義操作及高級算法,例如分割、面向對象分類,CNN分類等。
snappy包也有兩種類型,一種是Cpython(標準版Python),另一種是Jython。兩種類型各有優缺點。見SNAP官方介紹:https://senbox.atlassian.net/wiki/spaces/SNAP/pages/19300362/How+to+use+the+SNAP+API+from+Python
CPython:
- 如果您需要使用Python的科學擴展庫,如numpy、scipy、matplotlib等;
- 你已經有了CPython代碼,你想要合併SNAP中的函數;
- 您計劃用Python實現一個快速數據處理器插件;
- 您不打算開發SNAP桌面用戶界面擴展;
- 您不需要在所有平臺上都具有完全的可移植性;
- 您的代碼依賴於(或將依賴於)許多非標準庫。
如果你有以上需求,請安裝標準Python (CPython)的snappy。
Jython:
- 您計劃開發SNAP桌面用戶界面擴展;
- 您需要在所有平臺上都具有完全的可移植性;
- 不需要像numpy等提供的強而有力的數組/柵格數據處理能力(因爲Jython還不能很好地支持這些);
鑑於上述特點,毫無疑問選擇CPython的snappy安裝,因爲我們要使用大量的第三方包(numpy, scipy, scikit-learn等),至於編寫圖形用戶界面(GUI)有大量的第三方包(如PyQt)可以實現。
目前SNAP論壇絕大部分人安裝的都是CPython類型的snappy,下面就Cpython類型的snappy的安裝進行介紹(博主使用的是Win10系統)。
snappy安裝
snappy的安裝主要有兩步:
- snappy包生成
- snappy包解譯
snappy包生成
方法1----在安裝SNAP直接生成:
見前面的SNAP安裝教程,在SNAP安裝過程直接配置,前提是你已經安裝好了Python(v2.7, v3.3-3.4)。
看到這,你可能會問,能不能安裝更高版本的Python(Python3.4以上版本),現在回答你這個問題,Python(v2.7, v3.3-3.4)這三個版本是歐空局推薦的版本,是經過歐空局官方測試的,最好使用這三個版本,另外,論壇也有使用Python3.5, 3.6安裝成功的,但是不能保證裏面是否有些代碼使用是否會出錯,至於更高版本Python3.7-3.8, 目前還沒有人成功安裝上,你可以自己試下。毫無疑問,歐空局後面會提升更高版本Python的支持,只是還需要一定的時間
博主的配置(或者說是建議吧):
不建議使用Python 2版本,這個版本在Python 官方會2020年停止維護。博主使用的兩個版本的Python,分別是標準版Python 3.4.4(Python 3.4版本也已經失去支持了,但是Python3.4)以及Anaconda的Python3.6.7。使用Python 3.6,爲了緊跟Python官方快速迭代更新的腳步,因爲Python 3.4以下的版本有些庫(例如gdal等庫)已經失去支持了。另一方面,使用Python 3.4,是爲了防止Python 3.6有些操作不支持。如無意外,博主後面將使用Python 3.6進行介紹。
- 先說一下Python 3.4.4的問題:Python官網只提供了Python 3.4.5 -10版本的源碼,需要自己編譯(Python的源碼是C語言編寫的)才能安裝,並且在Windows系統編譯的話需要安裝VS 2010(Visual Studio 2010),更高版本的VS好像編譯通過不了。儘管編譯不麻煩,但是VS安裝包太大(安裝後更是佔用大量存儲空間)了,我是肯定不會裝的這樣的龐然大物。因此,博主只好使用Python官網提供的編譯好的最高版本的python 3.4.4,省去麻煩,見網址:
https://www.python.org/downloads/release/python-344/
點擊該網址後往下拉,會看到編譯好的MSI installer文件。下載後直接安裝就行了。
- 再說Python 3.6的安裝:博主使用的是最新版的Anaconda,裏面預裝的是Python 3.7,需要建議一個Python 3.6的虛擬環境,這樣的教程太多了,我不在複述了,隨便粘貼一個教程:https://blog.csdn.net/Fhujinwu/article/details/85851587
- Anaconda的spder, jupyter notebook等編輯器有時自動填充不夠方便,還可以使用Pycharm作爲IDE編輯器,Pycharm配置Python編譯器網上有諸多教程,隨便粘貼一個:https://blog.csdn.net/wingygrandam/article/details/79378286
方法二----利用SNAP的snappy-conf.bat腳本生成
在SNAP的安裝路徑(就是你配置安裝的路徑)下的snap/bin文件夾下可以看到一個snapp-conf.bat的腳本文件:
(裏面還有gpt命令行工具,利用gpt可以幫助snappy更好地處理代碼,往後再介紹)
注意需在snappy-conf.bat腳本所在目錄調用命令行(cmd)纔可以直接使用下面命令,如果不是在snappy-conf前面加上絕對路徑或者你將SNAP的bin文件路徑添加到環境變量中。
配置的命令如下:
snappy-conf <python-exe> <snappy-dir>
爲python解釋器(python.exe文件)的絕對路徑,注意,必須是絕對路徑。
爲要放置生成的snappy包的目錄路徑,一般來說Python非標準庫(第三方庫)都放置在Python安裝路徑下Lib/dist-packages/目錄下。這是一個可選參數。如果空缺的話將會生成在C:\Users\XXXXXX.snap\snap-python目錄下(XXXXXX爲用戶名)。
Python 3.4爲例:
博主的snappy-conf.bat文件所在絕對路徑(見上圖)爲:
E:\SNAP\install_path\snap\bin\snappy-conf.bat
博主的使用的Python 3.4,python.exe文件所在的絕對路徑爲:
C:Python34\python.exe
要放置的snappy包的絕對路徑爲:
C:\Python34\Lib\site-packages
於是總的生成snappy包命令爲:
E:\SNAP\install_path\snap\bin\snappy-conf.bat C:Python34\python.exe C:\Python34\Lib\site-packages
命令很長,可以新建一個.txt文件,寫好命令再複製到命令行。博主很早就配置好了,沒保留截圖。貼一張官方的截圖,注意路徑需要修改爲自己的:
說下Anaconda的Python3.6:
如果是使用Anaconda虛擬環境安裝Python3.6的話,在Anaconda的安裝目錄下會找envs這個文件夾,裏面會有你裝好的虛擬環境,例如樓主虛擬環境名稱爲py36,於是可以找到以下該目錄:
進入該目錄後可以找到python.exe(解釋器):
該Python3.6虛擬環境的非準庫也是在Lib\site-packages相對路徑下:
博主配置snappy是在snappy-conf.bat所在目錄使用 Windows PowerShell(Win10命令行Shell,命令有點像linux系統csh(C Shell)命令,但又不全支持,有點雞肋,不過也是可以執行.bat腳本的)配置的,如果你在win10當前目錄啓動PowerShell的話非常簡單,例如博主在snappy-conf.bat目錄下:
鼠標移動左上方的文件菜單欄,可以看到:
鼠標左鍵單擊一下即可打開,很方便,它的樣子是這樣的:
前面會提示當前路徑
配置snappy的命令如下:
運行.bat腳本文件或者.exe有時需要在前面添加".",否則可能會報錯。成功後如下圖所示
同時可以到配置的路徑下,看到下面的文件夾:
snappy包解譯
還差一步,需要對應的Python解釋器解譯snappy包的setup.py才能讓Python解釋器識別其爲對應的模塊庫(這個工作通常可以藉助pip命令完成,但這裏不能)。注意,必須是對應的解釋器,否則,可能安裝錯位置。不能用pip命令安裝。
解譯命令爲:
<python-exe> setup.py install
爲對應的Python解釋器,最好使用絕對路徑。
setup.py 位於上一步生成的的snappy目錄下
移動當前路徑爲上一步配置好的snappy文件夾所在的路徑,會看到setup.py文件(你可能看到的文件少一些,因爲這是解譯成功後的文件夾),你會看到jpy包(Java-python bridge, Java-Python橋),這個非常重要的包。日後,你會看到snappy許多操作都會用到它。
例如,博主使用的是Anaconda虛擬環境Python3.6,對應的解釋器python.exe,所在完整路徑爲:E:\Anaconda\Anaconda3\envs\py36\python.exe。
因此,解譯命令爲:
E:\Anaconda\Anaconda3\envs\py36\python.exe setup.py install
成功解譯後如下圖所示
snappy包測試
爲了檢查snappy是否安裝成功可以用簡單的小代碼測試一下。
在生成的snappy下有一個testdata文件夾,會看到.dim格式的測試數據文件
博主在Python 3.6環境下寫的簡單測試程序(注意,file_path爲測試數據所在目錄的完整絕對路徑,當然你也可以使用Sentinel-1, Sentinel-2數據做測試):
from snappy import ProductIO
file_path = r'E:\Anaconda\Anaconda3\envs\py36\Lib\sitepackages\snappy\testdata\MER_FRS_L1B_SUBSET.dim'
p = ProductIO.readProduct(file_path)
list(p.getBandNames())
# print(list(p.getBandNames()))
成功後的結果如下圖所示:
如果你執行上述程序,沒有報錯,恭喜你成功安裝上snappy。
關於snappy的入門級教程請看:
https://github.com/techforspace/sentinel
結語
SNAP與snappy的介紹、安裝該收尾了,然而,SNAP的探索和開發之路纔剛剛有了起點,漫漫長路伴你闖!還是提一句,如果你對SNAP或者snappy感興趣的話,可以加入博主創建的歐空局SNAP處理交流QQ羣:665903216。
參考文獻
[1] STEP官網:http://step.esa.int/main/
[2] 知乎Sentinel影像專欄之《哥白尼計劃的軟件支持—SNAP》:https://zhuanlan.zhihu.com/p/61230869
[3] SNAP Wiki博客:https://senbox.atlassian.net/wiki/spaces/SNAP/pages/24051781/Using+SNAP+in+your+programs
[4] techforsapce官網:https://www.techforspace.com/