Python中使用sentinelsat包自動下載Sentinel系列數據


(原創文章,轉載請註明來源,謝謝!)

前言

近日博主需要下載上海市2018年的哨兵1A/B GDRH數據,用於多時相SAR遙感地物分類。

普通下載

儘管有許多網站可以下載到免費的Sentinel(哨兵)數據,但是除了官網(The Copernicus Open Access Hub,哥白尼數據開放訪問中心)外,其它的其它網站都是通過間接或合作的方式獲得的,因此,我本人還是推薦到哥白尼數據開放訪問中心下載Sentinel數據,儘管有時會有些麻煩。
網址:https://scihub.copernicus.eu/
注意,下載數據需要註冊賬號。
後文的sentinelsat包使用也是建立在你具有哥白尼數據開放訪問中心的賬號之上。如果你想使用sentinelsat包,一定要註冊一個。
點擊上文的網址後,會見到下圖頁面。

圖1
點擊Open Hub,可以進入下載數據的圖形用戶界面(GUI),登錄賬號後如下圖所示。
圖2
關於如何如何下載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-1 2018年9月12日
Sentinel-2 2019年第二或三季度
Sentinel-3 2019年第二季度
表2 Sentinel數據滾動窗口時間長度
衛星名稱 窗口長度
Sentinel-1 12個月
Sentinel-2 L1C級產品 12個月
Sentinel-2 L2A級產品 18個月
Sentinel-3 12個月

根據其官網的說明,截止到2019年5月24日,Sentinel-1的在線數據起點日期爲2018年8月1日,Sentinel-2,Sentinel-3所有數據仍然在線。要下載Sentinel歷史數據數據請儘早下載,以免後面的歐空局清理帶來麻煩。搜了一下Sentinel-1 GRDH級數據,與歐空局官方的說明完全一致,得到的結果如下圖所示(注意觀察紅色框中時間):
圖3
不過,這些非在線數據並非不能下載了。哥白尼數據中心服務的產品目錄繼續提供對全套數據的訪問,這些數據仍然可通過圖形用戶界面、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,可以實現批量下載Sentinel數據。如果你想下載SNAP軟件,請到網址(http://step.esa.int/main/download/snap-download/) 進行下載。如果你對SNAP軟件或snappy感興趣的話,也可以加入我創建的歐空局SNAP處理交流羣:665903216
打開SNAP軟件,初始頁面如下圖所示:
圖4
如果你看到的界面與我的不一樣,請不要慌張。請參照下圖,恢復默認窗口設置:
圖5
確保右側的Product Libriray模塊可以看到。因爲這是批量下載Sentinel數據使用到的模塊。鼠標點擊Product Libriray,可以打開該模塊,並調整窗口,如下圖所示:

圖6
批量下載設置:
在Folder框選擇ESA SciHub,初次使用時需要輸入哥白尼數據開放訪問中心的賬戶名和密碼。ROI繪製的窗口說明:平移:按住鼠標中鍵(即滾輪)拖動地圖;放大:鼠標滾輪向下滾動;縮小:鼠標滾輪向上滾動;其它的參數說明見下圖:
圖7
設置好查詢參數,點擊右上方的搜索按鈕啓動查詢。搜索過程通常需要等待較長時間,特別是在查找長時間段的數據時。

圖8
選擇好產品數據後,可以點擊下載按鈕下載選擇的產品數據,會彈出一個窗口讓你設置保存路徑。下載需要耗費較長時間,請保持耐心!真的好長時間。下載時長與你要下載的數據量、網速等等相關。當其下方出現“download”字眼時表明其正在下載數據,你也可以到你保存路徑中去查看數據產品,當“download”字眼消失時,表明數據下載結束。
使用SNAP批量下載Sentinel數據的優缺點:
優點:GUI界面操作方便並且自動與SNAP建立連接,方便處理,支持Sentinel -1,Sentinel-2,Sentinel-3衛星數據下載
缺點:搜索下載通常比較費時,且不能下載哥白尼數據開放訪問中心離線數據。

第三方軟件或網站批量下載

Sentinel-1衛星數據

關於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等)。
我的朋友告訴我這個網站需要翻牆才能下載數據,但是博主親測不用翻牆也可以。
缺點是:下載速度經常很慢很慢。

Sentinel-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包簡介

  1. sentinelsat包是搜索、下載和檢索來自哥白尼數據開放訪問中心的Sentinel衛星影像數據Python模塊包,易於安裝,易於使用

  2. sentinelsat包實現了哥白尼數據開放訪問中心提供兩個API(OData和OpenSearch)對應的查詢方法,使得對Sentinel衛星數據進行篩選、排序等操作更加方便

  3. 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

sentinelsat包安裝

基本條件

  • 下載並安裝Python(2.7或3.4+,可以到Python官網下載,建議安裝Python3版本),建議安裝Anaconda(可以到Anaconda官網下載)。

  • 擁有哥白尼數據開放訪問中心賬號(The Copernicus Open Access Hub

安裝

  • 標準Python版本安裝,通過命令行窗口通過pip安裝:
pip install sentinelsat
  • 在Anaconda上安裝,可以在Anaconda Prompt命令行窗口使用pip安裝(但是不能conda安裝):
pip install sentinelsat

博主主要使用Anaconda,以其爲例,成功安裝後如下圖所示:
圖9

Sentinelsat包主要類對象及其方法

SentinelAPI類對象

SentinelAPI類是sentinelsat包中連接到哥白尼開放存取中心,搜索和下載Sentinel衛星影像的類,是該模塊包最重要的類,其類別定義如下:

class sentinelsat.SentinelAPI(user, password,
api_url=‘https://scihub.copernicus.eu/apihub/’, show_progressbars=True,
timeout=None)

圖10
注意:這裏api_url雖然給出了兩個URL,但建議使用後者,即 https://scihub.copernicus.eu/dhus ,因爲前一個URL:https://scihub.copernicus.eu/apihub ,無法下載歷史數據,即使在歷史數據由“Offline”變爲“Online”時,也無法下載。但 https://scihub.copernicus.eu/dhus , 在歷史數據由“Offline”變爲“Online”時,可以恢復下載。其中一個URL下載速度慢時,也可以換另一個。

SentinelAPI類對象重要方法

查詢方法

query(area=None, date=None, raw=None,
area_relation='Intersects', order_by=None, limit=None, offset=0, **keywords)

使用一個區域的座標、日期間隔和OpenSearch API接受的任何其他搜索關鍵字查詢產品。

圖12

另一個重要的查詢方法:

get_product_odata(id, full=False)

使用一個產品id獲取對應的產品,full爲Odata API接受的搜索查詢關鍵字參數
圖13
關於OpenSearch API與Odata API只需知道它們在sentinelsat包中封裝起來的方法不同即可。
query()和get_product_odata()方法的區別:
OpenSearch API的query(),它支持根據產品的屬性過濾產品,並一次返回所有匹配產品的元數據;
get_product_odata(),它可以一次查詢一個產品,但是爲每個產品提供完整的元數據,以及關於產品文件的信息,比如文件大小和校驗碼(MD5碼),這些信息在OpenSearch API中是不可用的。

下載方法

圖14

與geojson、pandas、geopandas模塊交互

圖15
上述類、方法及其它的方法請參考詳細介紹參照sentinelsat包 doc文檔: https://sentinelsat.readthedocs.io/en/stable/api.html

批量下載上海市Sentinel 2影像(簡單篇)

獲取geojson文件

由於sentinelsat主要提供geojson文件格式接口,首先獲取上海市對應範圍的geojson文件。可以在下列網址中輕易獲取上海市對應範圍的geojson格式的文件:
http://geojson.io
圖16
繪製上海市感興趣區域,並將結果以GeoJSON格式導出保存爲Shanghai_map.geojson。
圖17

批量下載上海市Sentinel 2影像源代碼

雖然前面介紹的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)

運行結果:
圖18

批量下載上海市Sentinel 1影像(複雜篇)

一些限制

考慮以下限制:
使用SAR衛星數據中對農業監測中,不希望下載下雨天時候的SAR數據,因爲下雨後,土壤、植被等含水量增加,會對地物識別造成較大的干擾。
現在:
需要對下載上海市2018年Sentinel-1 GRDH數據對上海市農作物進行識別和區分,爲此,需要根據天氣條件對下載的哨兵數據進行篩選。
此外,還有一點需要注意的:
2018年9月10日起,最古老、使用最少的Sentinel-1A和sentinel - B數據開始從在線檔案中刪除。它們的檢索仍然是通過數據中心,但現在通過長期檔案(Long Term Archive, LTA)。

代碼設計思路

只考慮在線數據(Online的情況)

  1. 首先爬取去2018年1月1日到-2018年12月31日上海市的天氣記錄;
  2. 利用sentinelsat包和上海市geojson文件的搜索上海市2018年所有的Sentinel 1衛星GRDH級數據(包括1A和1B);
  3. 讀取爬取的上海市天氣記錄,篩選出不下雨的日期列表;
  4. 如果搜索Sentinel -1 數據產品成像日期在不下雨的日期列表中,並且該產品數據在線可以下載,則下載該Sentinel 1衛星GRDH級數據;

爬取上海市2018年的天氣數據

可以在天氣後報網站中找到上海市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年"Online"的Sentinel-1數據

注意:代碼中的用戶名及密碼需使用自己在哥白尼數據開放訪問中心用戶名及密碼,代碼中的上一步爬取的上海市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”產品日期信息

運行結果:
圖19
具體下載快慢與你的網絡環境有關,博主測試過,和在歐空局哥白尼數據開放訪問中心網站下載速度其實是差不多的。

關於“Offline”Sentinel數據的下載

其處理的關鍵在於:設置一個半小時的計時器(因爲“Offline”產品半小時內只能激活一個產品),每隔半小時執行一次api.download()操作,對“Offline”產品進行激活。在其由"Offline"狀態變爲“Online”狀態(24小時內必定恢復,但24小時內具體的恢復時間無法確定)即可重新下載。當然,也可以在歐空局哥白尼數據開放訪問中心手動激活產品。這取決於你的選擇。

後語

本文如有不正確的地方,請在評論區批評指正,也希望本文能對經常使用Sentinel數據的同行帶來幫助。後面會主要介紹歐空局SNAP軟件及其Python包snappy。如果你對SNAP軟件或snappy感興趣的話,也可以加入我創建的歐空局SNAP處理交流羣:665903216,共同交流提高。羣中有一些資料,可以供參考學習。

參考文獻

[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.

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