操作衛星影像的方便工具:Google Earth Engine

Andy Lin
9 min readJul 20, 2017

--

在處理衛星影像的時候,傳統作法是從NASA、ESA等衛星遙測資料提供方,下載需要的衛星資料,再載入到QGIS、ArcGis等GIS軟體,之後進行疊圖、頻譜計算等分析,最後將分析結果輸出成文字報告、圖檔等格式。

這個流程有它的缺點:

  1. 沒辦法在同一個軟體,完成資料下載、處理到輸出
  2. 多波段衛星遙測資料容量通常高達數百MB,甚至幾GB的都有,從開始下載到下載完成可以處理資料,往往需要十幾分鐘到半小時的時間
  3. 一口氣處理數份衛星遙測資料時,需要相當高的電腦效能,如果電腦不夠好,可能會等很久,圖才會跑出來
  4. 對衛星遙測資料的來源不夠熟悉的話,可能要找到自己需要的衛星資料,就需要Google個老半天

但在Google推出GIS平台「Google Earth Engine」後,上述問題都不再是問題。Google Earth Engine是Google和卡內基美隆大學、NASA等學術機構合作開發的雲端運算平台,讓一般使用者取用、分析衛星遙測資料。

Google Earth Engine可以做到哪些事呢:

  1. Google雲端資料庫裡面已經有滿滿的衛星資料,只要輸入指令,螢幕上的地圖就會在數秒後出現你需要的衛星資料,你不用再苦等十幾分鐘,下載衛星遙測資料本身
  2. Google的強大搜尋功能,讓你只要在搜尋框輸入關鍵字,就可以查到你想要的衛星遙測資料,而且「一鍵」即可載入
  3. Google雲端運算,讓你的電腦不用再狂轉風扇,所有運算都在遙遠的Google主機處理,繁複的演算法計算,所需的計算時間可能從數分鐘縮短到數秒
  4. (對我來說)最棒的地方,一切指令都是基於Javascript語法,這代表你可以儲存每次分析作業的指令檔,一切都有紀錄,下次要進行類似的分析時,只要修改幾個參數就可以搞定一切
  5. 最重要的是,Google Earth Engine開放一般人免費使用!

說了那麼多,你是不是對Google Earth Engine充滿興趣了呢?先別急,在跳進Google Earth Engine的世界裡之前,需要先確認下面幾項事項,你已經做得到了:

  1. 知道衛星遙測資料是什麼:多光譜資料是怎麼一回事、RGB疊圖要怎麼疊、raster資料和vector資料有什麼不一樣、Landsat是什麼等等。不懂的讀者可以看看歐洲太空總署的教學惡補一下
  2. 略懂Javascript:了解var、object、function之類的Javascript概念,如果不懂的話,可以來玩玩Codecademy的Javasscript免費教學
  3. 有一個想要用衛星影像解決的問題:想知道亞泥花蓮礦場的植被生長情況、台北市的土地使用情況、各縣市過去幾年的經濟發展變化等等。如果毫無頭緒,可以來看看GIS技術的100種使用法

如果你已經準備好學習Google Earth Engine,那就接著看下去吧!

首先,你必須要有一個Google帳號,之後點擊這個網址:https://code.earthengine.google.com/

點進去之後,會請你申請Google Engine的使用資格,不用擔心,只需要填寫幾個基本資料,寄出後等幾分鐘,Google那邊就會寄發確認信件給你了。只要點擊寄來的信件的確認連結,就可以開始使用Google Earth Engine啦!(我自己申請使用資格的過程滿順利的,如果有人在這個階段遇到問題請跟我說)

順利申請使用資格後,你應該會被導向以下網頁,如果沒有,請再點擊一次這個網址:https://code.earthengine.google.com/

這就是你跟Google Earth Engine的第一次接觸:

Google Earth Engine的介面有五大部分:

  1. 左上角的部分(有Scripts、Docs等選項的區塊)是api文件和腳本區,可以讓你查閱所有可以輸入的指令,或套用Google提供的現成腳本
  2. 上面中間的地方(標題New Script的區塊)是撰寫指令的地方,你會在這裡寫Google Earth Engine的code
  3. 右上角的地方(有Inspector、Console等選項的區塊)是主控台,可以查看指令執行的結果,切換地圖觀看/查詢模式,以及管理需時較長的分析任務
  4. 下半部是地圖區,可以檢視指令執行的地圖長什麼樣子,以及使用Google Earth Engine的繪圖小工具,載入點、線、面等vector資料
  5. 還有最上面的地方,可以看到一個Google搜尋欄位,你可以在這個地方輸入關鍵字(land cover、ndvi、landsat等等),就可以找到相關的衛星影像

基本上,Google Earth Engine的操作原理,和你使用過的GIS軟體很像,都是載入衛星資料,進行基本處理及運算,疊圖,最後輸出結果。只要謹記這個流程,就不會手忙腳亂了。

我們先用最常使用的Landsat 8衛星資料進行示範。

先在Google搜尋框,輸入「Landsat」

點擊「USGS Landsat 8 Collection 1 Tier 1 and Real-Time data Raw Scenes」

點擊「import」

之後撰寫指令的區塊會多兩行指令

恭喜你,在幾秒的時間,已經載入五年多的巨量Landsat資料了!

不過,地圖上看不到任何衛星資料的影子,因為我們還沒有挑選出,要展示哪一個日期、哪一個地區的衛星影像,也還沒跟Google Earth Engine說,我們要用什麼樣的RGB疊圖,呈現衛星資料。

接著,請在撰寫指令的空白處,輸入以下指令(可以直接複製貼上):

輸入完畢後,點擊區塊上方的「Run」

等待幾秒之後,下面的地圖就會出現台灣北部的衛星圖像了。由於我們設定的RGB疊圖是B5-B4-B3,顯示的衛星圖是植被越茂盛的地方越紅,都市、裸露地等沒有植被的地方越偏亮藍的影像(上圖看不出來亮藍,是因為我們還沒有進行影像調整,本文最後會講到)。

完成這張圖之後,大家就運用Google Earth Engine,完成第一次的衛星影像分析了。接下來說明上面請大家輸入的指令的意思:

var filterImage = imageCollection
.filterBounds(ee.Geometry.Point(121.551129, 25.054875))
.filterDate("2016-07-28", "2016-07-30");

第一段指令,是篩選我們一開始載入的Landsat 8影像。

  1. filterBounds:這個指令是依據給定的地理條件篩選衛星影像。我們這裡設定的篩選標準是,選出經緯度[121.551129, 25.05487](我隨便亂選的台北市經緯點)所在的衛星影像
  2. filterDate:這個指令是依據給定的時間條件篩選衛星影像。我們這裡設定的篩選標準是,選出介於2016年7月28日和2016年7月30日的衛星影像,其實就是要2016年7月29日的衛星資料(我事先已經在NASA的資料網站上找到這份衛星資料)

我們把篩選出來的結果,命名為filterImage。

var image = ee.Image(filterImage.first());

不過,我們還需要一個步驟,才能把衛星圖像集,轉變成單一個衛星圖像。我們需要的是,選出filterImage中的第一個衛星圖像(雖然filterImage裡面本來就只有一個衛星資料),再用ee.Image,將衛星資料轉檔成Image格式。

print(image);

print指令可以讓我們在主控台檢視括號裡的東西的內容,在此例是image。

我們可以在主控台看到image的詳細資料,包括類型(type)、id、有哪些波段(bands)、詳細屬性(properties)等等。

Map.centerObject(image, 9);Map.addLayer(image, {bands: ['B5', 'B4', 'B3']});

最後,我們用Map.centerObject指令,把介面下方的地圖中心,移動到image的所在地,再用Map.addLayer指令,把image資料顯示在地圖上。

稍微講一下Map.addLayer指令:

  1. 括號中第一個位置,要放需要繪製的圖檔,在此例是image
  2. 第二個位置,要放設定的繪製條件,在此例我們設定了rgb波段要放哪些資料,依序是B5、B4、B3,也就是第五、第四和第三波段。

這樣就大功告成啦!我們成功繪製了台灣北部的衛星圖像,可以藉此分析植被的茂盛程度。

不過,影像看起來不是很鮮艷,需要增加一些對比。

請點擊撰寫指令區的「reset => Clear script」,將撰寫區清空。

再將以下的指令複製貼上:

複製貼上之後,按「Run」

我們的衛星影像對比明顯多了,因為有運用簡單的公式,誇大化衛星影像顏色的差異。

之後我們會更加詳細地解釋怎麼調整衛星影像的樣子,以及如何用Google Earth Engine,呈現植被指數(NDVI)。想自行鑽研Google Earth Engine的讀者,可以閱讀Google的精美教學,寫得非常詳細。

--

--