近日博主需要下载上海市2018年的哨兵1A/B GDRH数据,用于多时相SAR遥感地物分类。
尽管有许多网站可以下载到免费的Sentinel(哨兵)数据,但是除了官网(The Copernicus Open Access Hub,哥白尼数据开放访问中心)外,其它的其它网站都是通过间接或合作的方式获得的,因此,我本人还是推荐到哥白尼数据开放访问中心下载Sentinel数据,尽管有时会有些麻烦。 网址:https://scihub.copernicus.eu/ 注意,下载数据需要注册账号。 后文的sentinelsat包使用也是建立在你具有哥白尼数据开放访问中心的账号之上。如果你想使用sentinelsat包,一定要注册一个。 点击上文的网址后,会见到下图页面。
点击Open Hub,可以进入下载数据的图形用户界面(GUI),登录账号后如下图所示。 关于如何如何下载Sentinel数据不再赘述。需要说明的是可以通过将数据集添加到购物车自定义选择下载的数据集,然而,添加到购物车的数据集无法实现批量下载,并且欧空局限制每个账户最多只能同时下载2个产品数据。
还有一点需要强调的是历史数据问题,即欧空局所称的长期档案数据(Long Term Archive (LTA) 数据)。根据欧空局关于LTA数据数据的说明:欧空局针对现阶段使用较少的历史数据,启用了时长为滚动窗计划,对不在滚动窗的Sentinel数据(即距离现在1年(少数为1年半)以前的数据)进行了在线删除,以减少服务器的压力,提高用户体验。 2018年9月10日起,最古老、使用最少的Sentinel-1A和sentinel - B数据开始从在线档案中删除。它们的检索仍然是通过数据中心,但现在通过长期档案(Long Term Archive, LTA)。往后一段时间,欧空局会对Sentinel-2,3进行同样的处理。
表1 Sentinel数据滚动计划时间表 卫星名称滚动起点日期Sentinel-12018年9月12日Sentinel-22019年第二或三季度Sentinel-32019年第二季度 表2 Sentinel数据滚动窗口时间长度 卫星名称窗口长度Sentinel-112个月Sentinel-2 L1C级产品12个月Sentinel-2 L2A级产品18个月Sentinel-312个月根据其官网的说明,截止到2019年5月24日,Sentinel-1的在线数据起点日期为2018年8月1日,Sentinel-2,Sentinel-3所有数据仍然在线。要下载Sentinel历史数据数据请尽早下载,以免后面的欧空局清理带来麻烦。搜了一下Sentinel-1 GRDH级数据,与欧空局官方的说明完全一致,得到的结果如下图所示(注意观察红色框中时间): 不过,这些非在线数据并非不能下载了。哥白尼数据中心服务的产品目录继续提供对全套数据的访问,这些数据仍然可通过图形用户界面、OData和OpenSearch API进行搜索。
不再联机的数据被标记为“Offine”。尝试下载这些“离线”产品,将触发它们从LTA检索。过一段时间,所请求的产品将可以通过原始URL下载。一旦数据恢复(24小时内),用户就可以启动实际的下载。另外设置了每个用户每小时请求的最大数量的用户配额(半小时可激活一个产品)。从长期档案中恢复的产品至少在网上保存3天。
更多的关于历史数据问题的说明,可以查看该页面帮助文档: https://scihub.copernicus.eu/userguide/LongTermArchiveg 哥白尼数据开放访问中目前支持Sentinel-1、Sentinel-2、Sentinel-3卫星数据的下载,Sentinel-5暂时不支持。
事实上,欧空局为处理Sentinel数据而开发的遥感处理软件SNAP,可以实现批量下载Sentinel数据。如果你想下载SNAP软件,请到网址(http://step.esa.int/main/download/snap-download/) 进行下载。如果你对SNAP软件或snappy感兴趣的话,也可以加入我创建的欧空局SNAP处理交流群:665903216 打开SNAP软件,初始页面如下图所示: 如果你看到的界面与我的不一样,请不要慌张。请参照下图,恢复默认窗口设置: 确保右侧的Product Libriray模块可以看到。因为这是批量下载Sentinel数据使用到的模块。鼠标点击Product Libriray,可以打开该模块,并调整窗口,如下图所示:
批量下载设置: 在Folder框选择ESA SciHub,初次使用时需要输入哥白尼数据开放访问中心的账户名和密码。ROI绘制的窗口说明:平移:按住鼠标中键(即滚轮)拖动地图;放大:鼠标滚轮向下滚动;缩小:鼠标滚轮向上滚动;其它的参数说明见下图: 设置好查询参数,点击右上方的搜索按钮启动查询。搜索过程通常需要等待较长时间,特别是在查找长时间段的数据时。
选择好产品数据后,可以点击下载按钮下载选择的产品数据,会弹出一个窗口让你设置保存路径。下载需要耗费较长时间,请保持耐心!真的好长时间。下载时长与你要下载的数据量、网速等等相关。当其下方出现“download”字眼时表明其正在下载数据,你也可以到你保存路径中去查看数据产品,当“download”字眼消失时,表明数据下载结束。 使用SNAP批量下载Sentinel数据的优缺点: 优点:GUI界面操作方便并且自动与SNAP建立连接,方便处理,支持Sentinel -1,Sentinel-2,Sentinel-3卫星数据下载 缺点:搜索下载通常比较费时,且不能下载哥白尼数据开放访问中心离线数据。
关于Sentinel-1数据的批量下载,可以到下面的Vertex网站(美国阿拉斯加卫星设备处)下载:https://vertex.daac.asf.alaska.edu/# 该网站帮助文档可以查看批量下载功能,见链接: https://vertex.daac.asf.alaska.edu/help 这个网站可以下载包括Sentinel-1在内的多种SAR数据(如ALOS-1、Radarsat-1、ERS-1/2等)。 我的朋友告诉我这个网站需要翻墙才能下载数据,但是博主亲测不用翻墙也可以。 缺点是:下载速度经常很慢很慢。
USGS(美国地质调查局网站)提供了关于Sentinel-2数据的批量下载的功能,需要安装Java8(或Java7)开发工具包(JDK)及Bulk Dowload Application(BDA)软件。请参照帮助文档实现批量下载。 USGS网址:https://earthexplorer.usgs.gov/ 帮助文档:https://lta.cr.usgs.gov/EEHelp/ee_help 缺点:下载流程复杂(从下订单、处理完成到下载,需要接收多个邮件),并且下载速度很慢。 但是美帝的USGS网站的确提供了许多的免费资源(Landsat ,MODIS,DEM数据等等),还是要称赞一下的。 抱歉,Sentinel-3数据我使用的较少,也没有去找其第三方下载网站。
sentinelsat包是搜索、下载和检索来自哥白尼数据开放访问中心的Sentinel卫星影像数据Python模块包,易于安装,易于使用
sentinelsat包实现了哥白尼数据开放访问中心提供两个API(OData和OpenSearch)对应的查询方法,使得对Sentinel卫星数据进行筛选、排序等操作更加方便
sentinelsat包由Marcel Wille, Kersten Clauss 等人长期维护和更新,目前最新版本为V0.13, 支持Python versions 2.7 and 3.4+
其详细介绍请查看: PyPi sentinelsat网址:https://pypi.org/project/sentinelsat/ sentinelsat包 doc文档: https://sentinelsat.readthedocs.io/en/stable/api.html
下载并安装Python(2.7或3.4+,可以到Python官网下载,建议安装Python3版本),建议安装Anaconda(可以到Anaconda官网下载)。
拥有哥白尼数据开放访问中心账号(The Copernicus Open Access Hub)
博主主要使用Anaconda,以其为例,成功安装后如下图所示:
SentinelAPI类是sentinelsat包中连接到哥白尼开放存取中心,搜索和下载Sentinel卫星影像的类,是该模块包最重要的类,其类别定义如下:
class sentinelsat.SentinelAPI(user, password, api_url=‘https://scihub.copernicus.eu/apihub/’, show_progressbars=True, timeout=None)注意:这里api_url虽然给出了两个URL,但建议使用后者,即 https://scihub.copernicus.eu/dhus ,因为前一个URL:https://scihub.copernicus.eu/apihub ,无法下载历史数据,即使在历史数据由“Offline”变为“Online”时,也无法下载。但 https://scihub.copernicus.eu/dhus , 在历史数据由“Offline”变为“Online”时,可以恢复下载。其中一个URL下载速度慢时,也可以换另一个。
使用一个区域的坐标、日期间隔和OpenSearch API接受的任何其他搜索关键字查询产品。
另一个重要的查询方法:
get_product_odata(id, full=False)使用一个产品id获取对应的产品,full为Odata API接受的搜索查询关键字参数 关于OpenSearch API与Odata API只需知道它们在sentinelsat包中封装起来的方法不同即可。 query()和get_product_odata()方法的区别: OpenSearch API的query(),它支持根据产品的属性过滤产品,并一次返回所有匹配产品的元数据; get_product_odata(),它可以一次查询一个产品,但是为每个产品提供完整的元数据,以及关于产品文件的信息,比如文件大小和校验码(MD5码),这些信息在OpenSearch API中是不可用的。
上述类、方法及其它的方法请参考详细介绍参照sentinelsat包 doc文档: https://sentinelsat.readthedocs.io/en/stable/api.html
由于sentinelsat主要提供geojson文件格式接口,首先获取上海市对应范围的geojson文件。可以在下列网址中轻易获取上海市对应范围的geojson格式的文件: http://geojson.io 绘制上海市感兴趣区域,并将结果以GeoJSON格式导出保存为Shanghai_map.geojson。
虽然前面介绍的SentinelAPI类及其方法比较复杂,但是其使用却比较简单。 注意:需要使用自己的哥白尼数据开放访问中心用户名和密码,并且需要将Shanghai_map.geojson放入到python源代码所在目录文件夹或自定义路径时需修改代码中保存路径。另外复制代码时不知道缩进是否有问题,使用时最好检查一下 。 源代码((博主是在Anaconda中Spyder(Python 3.7)运行的))如下:
#sentinelsat中导入相关的模块 from sentinelsat import SentinelAPI, read_geojson, geojson_to_wkt #创建SentinelAPI,请使用哥白尼数据开放获取中心自己的用户名及密码 api =SentinelAPI(‘用户名', ‘密码','https://scihub.copernicus.eu/apihub/') #读入上海市的geojson文件并转换为wkt格式的文件对象,相当于足迹 footprint =geojson_to_wkt(read_geojson('Shanghai_map.geojson')) #通过设置OpenSearch API查询参数筛选符合条件的所有Sentinel-2 L2A级数据 products =api.query(footprint, #Area范围 date=(‘20190510’,‘20190512‘), #搜索的日期范围 platformname=‘Sentinel-2’, #卫星平台名,Sentinel-2 producttype=‘S2MSI2A’, #产品数据等级,‘S2MSI2A’表示S2-L2A级产品 cloudcoverpercentage=(0,30)) # 云量百分比 #通过for循环遍历并打印、下载出搜索到的产品文件名 for product in products: #通过OData API获取单一产品数据的主要元数据信息 product_info = api.get_product_odata(product) #打印下载的产品数据文件名 print(product_info['title']) #下载产品id为product的产品数据 api.download(product)运行结果:
考虑以下限制: 使用SAR卫星数据中对农业监测中,不希望下载下雨天时候的SAR数据,因为下雨后,土壤、植被等含水量增加,会对地物识别造成较大的干扰。 现在: 需要对下载上海市2018年Sentinel-1 GRDH数据对上海市农作物进行识别和区分,为此,需要根据天气条件对下载的哨兵数据进行筛选。 此外,还有一点需要注意的: 2018年9月10日起,最古老、使用最少的Sentinel-1A和sentinel - B数据开始从在线档案中删除。它们的检索仍然是通过数据中心,但现在通过长期档案(Long Term Archive, LTA)。
只考虑在线数据(Online的情况)
首先爬取去2018年1月1日到-2018年12月31日上海市的天气记录;利用sentinelsat包和上海市geojson文件的搜索上海市2018年所有的Sentinel 1卫星GRDH级数据(包括1A和1B);读取爬取的上海市天气记录,筛选出不下雨的日期列表;如果搜索Sentinel -1 数据产品成像日期在不下雨的日期列表中,并且该产品数据在线可以下载,则下载该Sentinel 1卫星GRDH级数据;可以在天气后报网站中找到上海市2018年的天气数据,网址: http://www.tianqihoubao.com/lishi/shanghai.html 其是以月为表单位记录天气数据的,因此需要爬取12个月的数据。下面的代码自动爬取上海市2018年12个月并拼接起来,保存为.csv格式文件,文件名为:Shanghai_2018_weather.csv。 复制代码时不知道缩进是否有问题,使用时最好检查一下。 源代码(博主是在Anaconda中Spyder(Python 3.7)运行的)如下:
#导入相关库 from urllib import request from bs4 import BeautifulSoup import csv output_file = "Shanghai_2018_weather.csv"#输出的文件名 with open(output_file, "w",newline = "") as csv_writer_file: csv_writer = csv.writer(csv_writer_file) # http://www.tianqihoubao.com/lishi/shanghai/month/201801.html url_head = "http://www.tianqihoubao.com/lishi/shanghai/month/" # 写入表头标题行 csv_head = ["日期","天气状况","气温","风力风向"] csv_writer.writerow(csv_head) s =""# 记录的空白字符串 for month in range(1,13): # 一年12个月 # 获取html url_month = "2018" +"{:02d}".format(month)+".html" url = url_head + url_month print(url) html = request.urlopen(url) #创建 BeautifulSoup对象 bs = BeautifulSoup(html,"lxml") # 找到网址table中的所有标签<tr> trs = bs.find_all("tr") # 迭代处理表头标题行后每一行 for tr in trs[1:]: # 字符串空列表 str_list = [] # 每个标签<tr>有4个子标签<td> # 获取首行标签所有的子标签 td_list = tr.find_all("td") for td in td_list: # 获取标签<td>的字符串内容,并去掉多余的空白符 str_list.append("".join(td.get_text().split())) # 以行数据的形式写入csv文件中 csv_writer.writerow(str_list)注意:代码中的用户名及密码需使用自己在哥白尼数据开放访问中心用户名及密码,代码中的上一步爬取的上海市2018年历史天气的数据文件Shanghai_2018_weather.csv、下载数据的目录与代码所在的文件夹目录相同,可以自定以修改路径,确保文件在对应的路径就行。另外,复制代码时不知道缩进是否有问题,使用时最好检查一下 源代码(博主是在Anaconda中Spyder(Python 3.7)运行的)如下:
# 导入相关模块 from sentinelsat import SentinelAPI, read_geojson, geojson_to_wkt from datetime import datetime import csv ##获取晴天日期的代码 # 以晴天(含多云、阴天)为条件筛选产品数据。从获取的上海市2018年天气数据的csv文件筛选日期 # 上海市2018年天气数据的csv文件 input_file = "Shanghai_2018_weather.csv" # 晴天日期列表 sunny_days =[] # 天气条件 : weather_condition = ["晴/晴","晴/多云","晴/阴","多云/晴","多云/多云","多云/阴","阴/晴","阴/多云","阴/阴"] with open(input_file, 'r', newline = '') as csv_in_file: csv_reader = csv.reader(csv_in_file) # 迭代处理每一行 for row_list in csv_reader: if row_list[1] in weather_condition: # 修改日期格式,去掉中文“年”,“月”,“日” date_temp = datetime.date( datetime.strptime(row_list[0],"%Y年%m月%d日")) sunny_days.append(date_temp) # 用户名,密码,哥白尼数据开放中心,需修改为自己的用户名及密码 api = SentinelAPI(‘用户名’,密码','https://scihub.copernicus.eu/dhus') # 读取上海市地区的geojson文件,获取足迹 footprint = geojson_to_wkt(read_geojson('Shanghai_map.geojson')) # 设置查询参数,足迹,平台,日期,产品类型,返回的是以产品id为key的复合字典 products = api.query(footprint, platformname='Sentinel-1', date=('20180101','20181231'), producttype='GRD') # 下载所有符合条件的Sentinel-1A/1B产品数据 for product in products: # 判断成像的日期是否符合天气条件 product_info = api.get_product_odata(product) if datetime.date(product_info['date']) in sunny_days: print(product_info['date’]) #判断数据可以在线下载 if product_info[‘Online’]: #”Online”的情况 print(‘Product {} is online.Starting download...’.format(product_info[‘title’]))#打印产品文件名 api.download(product) #历史存档数据(“Offine”的情况),暂时不下载和触发LAT标记 else: print(‘Product {} is not online.’.format(product_info[‘date’]))#打印“Offine”产品日期信息运行结果: 具体下载快慢与你的网络环境有关,博主测试过,和在欧空局哥白尼数据开放访问中心网站下载速度其实是差不多的。
其处理的关键在于:设置一个半小时的计时器(因为“Offline”产品半小时内只能激活一个产品),每隔半小时执行一次api.download()操作,对“Offline”产品进行激活。在其由"Offline"状态变为“Online”状态(24小时内必定恢复,但24小时内具体的恢复时间无法确定)即可重新下载。当然,也可以在欧空局哥白尼数据开放访问中心手动激活产品。这取决于你的选择。
本文如有不正确的地方,请在评论区批评指正,也希望本文能对经常使用Sentinel数据的同行带来帮助。后面会主要介绍欧空局SNAP软件及其Python包snappy。如果你对SNAP软件或snappy感兴趣的话,也可以加入我创建的欧空局SNAP处理交流群:665903216(这个群已满人),欧空SNAP处理交流群(二):1102493346,共同交流提高。群中有一些资料,可以供参考学习。
[1] 哥白尼数据开放访问中心帮助文档: https://scihub.copernicus.eu/userguide/LongTermArchiveg.
[2] sentinelsat包doc文档:https://sentinelsat.readthedocs.io/en/stable/api.html. [3] 田颖,陈卓奇,惠凤鸣,程晓,欧阳伦曦.欧空局哨兵卫星Sentinel-2A/B数据特征及应用前景分析[J].北京师范大学学报(自然科学版),2019,55(01):57-65. [4] 陈旭,郝震寰.哨兵卫星Sentinel-2A数据特性及应用潜力分析[J].科技视界,2018(16):48-50. [5] 欧阳伦曦,李新情,惠凤鸣,张宝钢,程晓.哨兵卫星Sentinel-1A数据特性及应用潜力分析[J].极地研究,2017,29(02):286-295.