Landsat元数据批量下载工具
目錄
前言
landsat數據情況簡介
下載元數據
總結
一、前言
最近由于工作需要,需要下載部分landsat數據的元數據,老板大手一揮,給了十幾年的landsat的path、row以及日期等,就算交待完了。于是我就開始準備吭哧吭哧到USGS官網上去一個個找。程序員應該是世界上最懶的人,懶到哪怕只有幾百個也不愿意一個個手動弄,于是在官網上翻騰半天,終于找到這么一個頁面(https://landsat.usgs.gov/landsat-bulk-metadata-service),能夠給定范圍批量下載元數據,這是個好東西,基本幾下就解決問題了。懶勁又升級了,這么一批一批的下下來我不是還要手工整理,于是就想寫個程序自動下載然后篩選出我想要的部分。
二、landsat數據情況簡介
我相信接觸過landsat的人這塊應該都很清楚了,百度百科介紹如下:
美國NASA的陸地衛星(Landsat)計劃(1975年前稱為地球資源技術衛星 — ERTS ),從1972年7月23日以來, 已發射8顆(第6顆發射失?。?。目前Landsat1—4均相繼失效,Landsat 5仍在超期運行(從1984年3月1日發射至今)。 Landsat 7于1999年4月15日發射升空。Landsat8[1] 于2013年2月11日發射升空,經過100天測試運行后開始獲取影像。
具體信息可以自行查詢,landsat的數據都是以帶號進行命名的,信息包含path、row以及數據日期等。我們就要根據這些來實現批量下載landsat元數據。
三、下載元數據
3.1 分析下載元數據頁面
仔細分析上述usgs官網中的下載元數據頁面,不難發現其是將行列號一定范圍內以及日期一定范圍內的元數據打包成一個文件發送到前臺。并且發送的是一個GET請求,請求格式如下:
https://earthexplorer.usgs.gov/EE/InventoryStream/pathrow?start_path=131&end_path=140&start_row=35&end_row=38&sensor=LANDSAT_TM_C1&start_date=2011-06-01&end_date=2011-11-01&format=CSV
參數名稱也都通俗易懂,于是一切就豁然開朗了,我只需要寫個程序根據需求拼接出此url,然后發送請求,就能得到結果。一切就是這么easy,不過拿到結果后你會發現事情稍微復雜一點,因為請求的區域及時間等都是范圍,這就導致結果中有很多不是我們需要的,于是再完善程序循環遍歷與我們輸入數據的行列號逐一匹配,取出需要的結果即可。
3.2 程序實現
程序整體界面如圖所示:
程序比較簡單,只需要提供一個下載范圍文件(csv格式),每行一個,選擇下載的landsat的dataset即可。
程序讀取用戶給定的范圍自動算出行列號的范圍以及日期范圍,代碼如下:
var lines = File.ReadAllLines(fileName);
var data = lines.Select(s => s.Split(',')).Select(s => new { Path = int.Parse(s[0]), Row = int.Parse(s[1]), Date = CommonHelper.ParseDate(s[2]) });
StartPath = data.Min(s => s.Path);
StartRow = data.Min(s => s.Row);
StartDate = data.Min(s => s.Date);
EndPath = data.Max(s => s.Path);
EndRow = data.Max(s => s.Row);
EndDate = data.Max(s => s.Date);
之后拼接請求的URL,代碼如下:
$"https://earthexplorer.usgs.gov/EE/InventoryStream/pathrow?start_path={StartPath}&end_path={EndPath}&start_row={StartRow}&end_row={EndRow}&sensor={DatasetType}&start_date={CommonHelper.FormatDate(StartDate)}&end_date={CommonHelper.FormatDate(EndDate)}&format=CSV"
其中DatasetType是用戶選擇的landsat數據源,CommonHelper.FormatDate函數完成日期到字符串格式的轉化,代碼如下:
public static string FormatDate(DateTime date)
{
return date.ToString("yyyy-MM-dd");
}
然后發送請求,獲取結果,這塊在網絡爬蟲之密碼破解一文中已經介紹過,不再贅述。獲取到結果后,將其與用戶想要的結果一一比對,取出需要的結果,代碼如下:
var orginResultList = orginResult.Split(new char[] { '', '
' }, StringSplitOptions.RemoveEmptyEntries).Skip(1);
var source = File.ReadAllLines(file);
var data = source.Select(s => s.Split(',')).Select(s => new { Path = int.Parse(s[0]), Row = int.Parse(s[1]), Date = CommonHelper.ParseDate(s[2]) });
var endResult = new List<string>();
data.ToList().ForEach(s =>
{
var temp = orginResultList.Where(re =>
{
var arr = re.Split(',');
return int.Parse(arr[7]) == s.Path && int.Parse(arr[8]) == s.Row /*&& CommonHelper.ParseDate(arr[5]) == s.Date*/;
});
if (temp != null && temp.Count() > 0)
endResult.Add(temp.First());
});
File.WriteAllLines(Path.Combine(Path.GetDirectoryName(file), "res.csv"), endResult);
其中orginResult表示請求返回的結果,這里面存在一個問題就是往往用戶想要的元數據日期與返回的元數據日期不一致(原因可能有很多,用戶輸入不準確,或者有什么我未考慮到的因素),如果時間也進行匹配的話基本取不到結果,所以目前采用的方式只比對行列號。
四、總結
通過以上方式即可實現批量下載landsat元數據,需要下載程序的可以直接點擊這里,當然由于剛做出的程序,難免在代碼邏輯或者業務邏輯上有BUG或者未考慮到的地方,歡迎批評指正,后續完善之后可能會將源代碼開放到Github上,以供需要的人使用。
總結
以上是生活随笔為你收集整理的Landsat元数据批量下载工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米最贵量产机来了!小米MIX FOLD
- 下一篇: 一步步学习微软InfoPath2010和