在Google Earth Engine中將衛星影像輸出成縮時影片

        
      
        遙感探測(Remote sensing),簡稱遙測。透過衛星或任何可以飛到天空的物體搭載觀測儀器,我們可以實現:在遠距離(不用人跑到當地)便可以獲得環境資料的壯舉,應該可以被稱為人類進步史的很大一步! 近期台灣很夯的福衛七號衛星升空,其實很大的目的也是為了進行氣象資料遙測任務,細節我不清楚,但總之可以說是太空產業。

        森林學系的一個學科分支便是利用遙測技術進行資源探勘與管理,我們使用的載具雖不限於衛星,但利用衛星影像為基礎的分析卻占很大一部分,原因大概是衛星影像具定期拍攝的性質,美國與歐洲的各衛星影像資料目前又都是開放的狀態,非常便於採用,雖然國內好像較少看到將遙測資料用於生態學的研究,不過這已然為世界趨勢,例如:Lembrechts(2019)這篇探討將微氣候變因套入物種分布模式的Review paper。

        過往進行衛星影像分析,在克服軟體或寫程式難關後,還有幾個大問題:
  1. 電腦的容量,因為大量的衛星影像需要很大的空間儲存。
  2. 電腦的運算速度,電腦要運算大量的圖資,基本上很吃資源,不夠好的電腦就會跑半天可能還沒辦法得到一張圖。
        上述兩點幾乎是一般使用者或學生無法克服的困難(如果是相關領域的研究生,而研究室有好電腦那又是另一回事),基於此,為了讓更多人可以利用圖資(畢竟資料不用的話,就像垃圾紙屑),許多公司開發了雲端分析平台,讓資料的儲存與運算皆在遠端的超級電腦中進行,我們的小小筆電只需要負責上傳指令與下載運算結果就好,非~常~的便利。感謝這些佛心大大與公司。

        Google Earth Engine(GEE)便是由Google開發並開放免費使用的雲端衛星資料分析平台,也可以說是雲端GIS系統。為何會這樣說呢?基本上GIS軟體辦得到的事情,GEE都辦得到,也可以上傳與下載資料;由於GEE已經預先載入幾乎全部的開放性衛星data,所以也不需要我們各別分開下載,即使就教學目的來說也十分便利。


////////分隔/////////////////////////


        利用上述的特性,前幾週製作side project時,嘗試利用此平台直接輸出了可見光衛星影像縮時影片,作為初步的地景變化分析,完成code後只要修改座標,隨時可以輸出不同地點,不同衛星所取得的影像紀錄,套一句學長的說法:這就是coding的魅力啊~ 這裡分享這次所使用的code與結果。
//這段程式碼參考Trochim Erin在Tessa Hasbrouck, UAF的碩士論文中的碼,在此感謝!


//加入時間戳印所需的package
var palettes = require('users/gena/packages:colorbrewer').Palettes;
var utils = require('users/gena/packages:utils');
var text = require('users/gena/packages:text');

// Define an area to export.
//var polygon = ee.Geometry.Rectangle([120.605543, 21.860020, 121.011459, 22.073435]);
var sites = new ee.FeatureCollection([
    ee.Feature(
 ee.Geometry.Rectangle([120.605543, 21.860020, 121.011459, 22.073435]),
 {name: 'StudyArea', fill:2})
]);

var bounds = sites.geometry().bounds()

//載入衛星影像collection,並按照所需時間地點篩出目標影像集。

var L7 = ee.ImageCollection("LANDSAT/LE07/C01/T1_SR")
 .filterDate('1999-01-01', '2019-06-30') //Filter時間 
 .filterBounds(bounds)
 .filter(ee.Filter.lt('CLOUD_COVER', 20))
  //.map(cloudMaskL457)
  // Need to make the data 8-bit.
  ;
print(L7);



//轉換imagecollection物件為影片
var L7vedio = L7.map(function(image){
 var start = ee.Date(image.get('system:time_start'));
 var label = start.format('YYYY-MM-dd');
 return image.visualize({
 bands: ['B3','B2','B1'],
 min: 0,
 max: 3000,
 gamma: 1.4,})
 .clip(bounds).set({label: label}); 
});
print(L7vedio);


// annotate
Map.centerObject(bounds, 10); //先做這行,固定Map scale,以便後續的annotations大小固定。

var annotations = [
  {
    position: 'left', offset: '1%', margin: '1%', property: 'label', scale: Map.getScale() * 2
  }
];
print(annotations);

L7vedio = L7vedio.map(function(image) {
  return text.annotateImage(image, {}, bounds, annotations)
});
 

// add a few layers to map
var animation = require('users/gena/packages:animation');
animation.animate(L7vedio, {maxFrames: 5});


//多加一個色板來顯示圖層
var visParams = {
  bands: ['vis-red', 'vis-green', 'vis-blue']
};

Map.addLayer(L7vedio.median(), visParams, 'L7vedio_median');


// Export (change dimensions or scale for higher quality).
Export.video.toDrive({
  collection: L7vedio,
  description: 'L7VideoExample',
  dimensions: 1080,
  framesPerSecond: 12,
  region: bounds
}); 




從console中可以看到這次篩出的衛星影像共有99張(features >> 99 elements)



輸出結果如下







留言

  1. 請問我要怎麼換地點? 試過改經緯度,可是結果還是一樣

    回覆刪除
    回覆
    1. 你好,抱歉我沒有及時回復。
      照理來說,只要修改下面code中的經緯度 (包含左下與右上兩個點),理論上在earth engine中看到載入不同位置的畫面。

      var sites = new ee.FeatureCollection([
      ee.Feature(
      ee.Geometry.Rectangle([120.605543, 21.860020, 121.011459, 22.073435]),
      {name: 'StudyArea', fill:2})
      ]);

      刪除

張貼留言