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的前身来自于它们包含过去几年开发的一些历史工具箱的功能,如BEAMNEST(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工具箱:

  1. Sentinel-1 Toolbox (S1TBX)
  • 继承并拓展了NEST工具箱的大部分特性,主要用于处理SAR数据:辐射定标、相干斑处理、地形校正、椭球校正、重投影、配准、时序分析、极化分解、分类、干涉等处理
  • 支持的SAR卫星数据:Sentinel-1、ERS-1&2、Envisat、ALOS PALSAR,TerraSAR-X,COSMO-SkyMed、RADARSAT-2等第三方SAR数据;
  1. Sentinel-2 Toolbox (S2TBX)
  • 主要用于处理多光谱数据,包括掩膜、裁剪、重采样、直方图统计、波谱分析、重投影、波段运算、多种指数运算器(如NDVI,NDWI,LAI,CCC等),无监督和监督分类等众多操作
  • 支持多光谱卫星数据:Sentinel-2、Envisat(MERIS和AATSR)、ERS(ATSR)、RapidEye,SPOT、MODIS(Aqua和Terra)、Landsat(TM),ALOS的第三方数据(AVNIR&PRISM)等;
  1. Sentinel-3 Toolbox (S3TBX)
  • 支持数据可视化(栅格金字塔,栅格图层色带等)设置,数据分析(剖面图,散点图,相关分析),栅格数据处理(重投影、镶嵌、聚类、分类)等处理
  • 支持数据类型:Sentinel-3中的OLCI和SLSTR、Envisat(MERIS和AATSR)、ERS(ATSR)、SMOS、MODIS(Aqua和Terra),Landsat(TM),ALOS(AVNIR&)、PRISM等。
  1. SMOS Toolbox
  • 支持用户使用和处理欧空局的(Soil Moisture and Ocean Salinity,SMOS)卫星获得的数据
  1. Proba-V Toolbox
  • 支持用户处理Proba-V卫星获得的数据(PROBA-V卫星的研制是处于对15年SPOT-VEGETATION观测任务的后续行动,也是为了最近发射的欧空局Sentinel-3陆地和海洋观测卫星任务的准备工作。)
  1. PolSARPro:PolSARpro软件提出了大量著名的Pol-SAR算法和工具,为科学开发利用极化测量技术奠定了基础,并使用Pol-SAR、Pol-InSAR、Pol-TomoSAR和Pol-TimeSAR数据刺激研究和应用开发,接触过PolSAR研究方向的应该比较熟悉。
  2. 第三方插件
  • 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的安装主要有两步:

  1. snappy包生成
  2. 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>

< p y t h o n e x e > <python-exe> python解释器(python.exe文件)的绝对路径,注意,必须是绝对路径。
< s n a p p y d i r > <snappy-dir> 为要放置生成的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

< p y t h o n e x e > <python-exe> 为对应的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/

发布了11 篇原创文章 · 获赞 51 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/lidahuilidahui/article/details/99679554