← 返回課程|遙測學與影像處理
遙測學與影像處理 115-1 · 第 2 週講義(實作篇)

02 探索影像與 GEE 衛星資料目錄

授課教師:朱健銘
上課時間:星期一第 6–8 節
教材對應:Howarth (2024) F1.1;Nicolau 等 (2024) F1.2

本週實作目標

完成本週實作後,同學應能:

  1. 載入一幅影像,用 print 讀取詮釋資料、用 Map.addLayer 顯示單一波段、用 Inspector 查詢像元 DN。
  2. 分辨 ImageCollection 與 Image,用 filterDate、filterBounds、first 取出涵蓋高雄的單一景。
  3. 在 Data Catalog 搜尋資料集、讀懂資料集頁面,並以 palette 顯示高雄地形。
  4. 在呼叫函式的地方加註解,並正確設定腳本分享連結的權限。

關於本講義的引用 本講義實作內容整理自開放教科書 Cardille 等(2024)Cloud-Based Remote Sensing with Google Earth Engine 的兩章:F1.1「Exploring Images」(Howarth, 2024, pp. 19–39)與 F1.2「Survey of Raster Datasets」(Nicolau, Dyson, Saah, & Clinton, 2024, pp. 41–66)。因兩章篇幅較短且以線上版為主,文中引用標示到「節」(如 §2.1.2),對應教科書網站與 Springer 線上版的節號;程式碼依原書範例改寫,示範區域除第貳節的語法範例外一律改為高雄。本講義內容以生成式 AI(Anthropic Claude)協助整理與編排,並經授課教師審閱修訂。理論背景請對照「第 2 週講義(理論篇)」。

開始前 四個步驟

  1. 開啟 https://code.earthengine.google.com,確認已登入第 1 週建立的主資料夾與 GO402 儲存庫。
  2. 在瀏覽器輸入 https://code.earthengine.google.com/?accept_repo=projects/gee-edu/book 加入教科書儲存庫,各節的 Code Checkpoint 之後可在 Scripts 面板的 Reader 區找到(Nicolau 等, 2024, §3.2.1)。
  3. 新開腳本,命名為 w02_explore。
  4. 若執行時出現「not found」或 deprecated 警告,代表資料集 ID 已改版,請到 Data Catalog 搜尋同名資料集改用最新 ID。

壹、程式碼註解規則

從本週起,繳交的腳本須遵守一條規則:在呼叫函式的那一行加註解,說明這個函式在做什麼。不必逐行註解;參數、變數宣告、視覺化參數的內容不用寫。第 1 週學過,// 之後的文字不會被執行(Gandhi, 2024, p. 12)。

示範(右側為本課程要求的寫法):

// 不合要求:完全沒有註解
var img = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_117044_20250101');
print(img);
 
// 不合要求:逐行都註解,反而看不出重點
var img = ee.Image(...);   // 建立變數
                           // 這是 ID
                           // 這是日期
 
// 合乎要求:只在函式呼叫處註解
var img = ee.Image(...);   // ee.Image:由資料集 ID 建立影像物件
print(img);                // 印出詮釋資料到 Console

貳、載入影像、顯示波段、Inspector

本節先用教材原範例(上海,Landsat 5)示範三個基本語法,第參節起一律改用高雄影像 (Howarth, 2024, §2.1.1–2.1.2):

var first_image = ee.Image(  // ee.Image:由資料集 ID 建立影像物件
  'LANDSAT/LT05/C02/T1_L2/LT05_118038_20000606');
print(first_image);  // 印出詮釋資料到 Console
 
Map.addLayer(  // Map.addLayer:把資料加成地圖圖層
  first_image,
  { bands: ['SR_B1'], min: 8000, max: 17000 },
  'Layer 1');

Console 讀到什麼 展開後可見這幅影像由 19 個波段(band)組成,前六個("SR_B1"–"SR_B7")分別量測藍、綠、紅與三個紅外波段。影像波段是網格資料模型的例子:資料存在二維像元(pixel)格網中,每個像元的值稱為數位值(DN) (Howarth, 2024, §2.1.1)。展開 bands 底下的 dimensions 與 crs_transform(30 m),即理論篇第壹、貳節的影像結構與空間解析度。

Map.addLayer 的四個位置 

Inspector 的三個類別 點右側 Inspector 分頁,游標變十字準星,點擊地圖後 (Howarth, 2024, §2.1.2, Fig. 2.2):

參、影像集合:取出高雄的一景

影像集合(image collection)把許多影像組織成一個資料儲存結構,包含每幅影像的位置、日期與屬性,可從中篩選出分析所需的影像 (Nicolau 等, 2024, §3.1)。

一、檢視整個 Landsat 8 集合

// ee.ImageCollection:載入 Landsat 8 原始影像集合
var landsat8 = ee.ImageCollection('LANDSAT/LC08/C02/T1');
print('集合大小:', landsat8.size());  // size:集合中有幾幅影像
// 直接印整個集合 → 會出錯(超過 5000 個元素)
print(landsat8);
// 集合上圖:自動鑲嵌,最新像元疊在最上面
Map.addLayer(landsat8, {}, 'All Landsat 8');

二、篩選到高雄

// ee.Geometry.Point:建立一個點(經度, 緯度),高雄市政府附近
var pointKH = ee.Geometry.Point([120.30, 22.63]);
 
var landsatKH = landsat8
  // filterDate:只留高雄乾季(雲量較少)的影像
  .filterDate('2024-11-01', '2025-01-31')
  // filterBounds:只留涵蓋這個點的影像
  .filterBounds(pointKH);
print('高雄乾季集合大小:', landsatKH.size());  // 確認篩選後剩幾幅
 
// first:取集合中最早的一幅 → 變成單一 ee.Image
var landsatFirst = landsatKH.first();
print('第一幅影像:', landsatFirst);  // 展開 id 可看到 117044 與取像日期
 
// Map.centerObject:把地圖置中於這幅影像,縮放等級 9
Map.centerObject(landsatFirst, 9);
Map.addLayer(  // 以紅、綠、藍波段顯示成真色彩
  landsatFirst,
  { bands: ['B4', 'B3', 'B2'], min: 5000, max: 15000 },
  'First KH Landsat 8');

課堂操作 1 用 Inspector 在這幅高雄影像上點三個位置,把 B2、B3、B4、B5 的值記在腳本註解中:

水體:蓮池潭、澄清湖或高雄港內。

建成區:三多商圈、楠梓加工區。

植生:美濃平原農田、壽山或大樹的果園。

結果應與第 1 週的光譜反射曲線一致:植生在 B5(近紅外)最高,水體在 B5 最低。

課堂操作 2 把 filterDate 改為 2024 年 7–8 月(雨季)再跑一次,比較集合大小與第一幅影像的雲量。這說明了為什麼第 8 週要學雲遮罩與合成。

肆、瀏覽 Data Catalog:以高雄地形為例

Data Catalog 有個別衛星影像、預製合成、土地覆蓋圖、氣候、人口、地形等資料集 (Nicolau 等, 2024, §3.2)。本節以 NASADEM 示範「怎麼找、怎麼讀、怎麼載入」;其他資料集做法相同,專題選題時依需要自行查閱。

一、資料集頁面要看的四件事

在 Code Editor 頂端搜尋列輸入關鍵字(例如 NASADEM),或到 https://developers.google.com/earth-engine/datasets 瀏覽:

欄位要確認的內容
Earth Engine Snippet可直接複製的 ID,並確認是 ee.Image(單幅)或 ee.ImageCollection(集合)。NASADEM 為 ee.Image('NASA/NASADEM_HGT/001')。
Bands波段名稱、單位、值域與比例係數。NASADEM 的 elevation 單位為公尺,min/max 依此設定。
Dataset Availability時間範圍。NASADEM 為單一時間點;Landsat、Sentinel 等集合會列出起迄日期。
Image Properties影像屬性,是 filter 的依據。例如 Sentinel-2 的 CLOUDY_PIXEL_PERCENTAGE(雲量百分比),本週作業會用到。

二、載入並以調色盤顯示

palette 是一串顏色字串,最小值對應第一個顏色、最大值對應最後一個,中間依序漸變;只能用於單一波段 (Nicolau 等, 2024, §3.2.4, §3.2.6)。

// ee.Image:載入全球數值高程模型(單幅,不必 filter)
var nasadem = ee.Image('NASA/NASADEM_HGT/001');
print('NASADEM:', nasadem);  // 確認波段:elevation、num、swb
 
var demVis = {
  bands: ['elevation'],
  min: 0,
  max: 3000,
  palette: ['006633', 'E5FFCC', '662A00', 'D8D8D8', 'F5F5F5']
};
 
// Map.setCenter:置中於高雄(經度, 緯度, 縮放等級)
Map.setCenter(120.60, 22.90, 9);
Map.addLayer(nasadem, demVis, 'NASADEM 高程');  // 以綠—褐—白配色顯示高程

課堂操作 3 自行搜尋 COPERNICUS/S2_SR_HARMONIZED,在腳本註解中記下四件事:(1) 是 Image 還是 ImageCollection;(2) B2、B3、B4、B8 的中心波長與空間解析度;(3) 反射率的比例係數;(4) CLOUDY_PIXEL_PERCENTAGE 的意義。這四項就是完成本週作業所需的全部資訊。

伍、分享腳本連結:權限設定

作業一律以腳本連結繳交。兩種分享方式的權限行為不同:

方式做法權限與限制
Get Link (本週採用)按 Save → 按工具列 Get Link → 複製網址(形如 code.earthengine.google.com/xxxxxxxx)。是「按下當時」的程式碼快照,任何有 Earth Engine 帳號的人都能開啟。之後修改腳本不會同步,改完須重新 Get Link。
分享儲存庫Scripts 面板將滑鼠移到 GO402 儲存庫 → 齒輪圖示 → Share → 加入對方帳號並給 Reader。對方看到最新版本,適合小組協作。忘記加入帳號時,教師開啟會出現 permission denied。

繳交前四項檢查 

  1. 先 Save,再 Get Link(順序顛倒會分享到舊版本)。
  2. 把連結貼到無痕視窗開啟,確認看得到程式碼且按 Run 能顯示地圖。
  3. 確認每個函式呼叫處都有 // 說明。
  4. 貼到 Google Classroom 本週作業的繳交欄位,不要貼在班級動態。教師無法開啟的連結視同未繳交。

注意 若腳本用到自己上傳的私有 Assets,對方仍看不到該資料,執行會失敗。本週作業只用公開資料集,不得使用私有資產。

陸、本週作業:繪製高雄的 Sentinel-2 多光譜影像

目標 新開腳本 w02_hw,從 Sentinel-2 地表反射率集合取出一幅雲量低、涵蓋高雄的影像,以真色彩與近紅外假色兩種合成顯示。

要求 

  1. 用 filterDate、filterBounds 與 ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10) 篩選(日期自訂,建議 2024-11 至 2025-02),再用 first 取一幅;print 後在註解中寫下取像日期與雲量。
  2. 顯示真色彩(B4, B3, B2)與近紅外假色(B8, B4, B3),min/max 依課堂操作 3 查到的比例係數設定(一般用 0–3000)。
  3. 用 Inspector 點高雄的一處植生、一處水體、一處建成區,在註解中記下 B2、B3、B4、B8 的值,並以一句話說明植生為何在假色合成中呈紅色。
  4. 每個函式呼叫處都有 // 說明(第壹節規則)。
  5. Save → Get Link → 依第伍節四項檢查 → 貼到 Google Classroom,下週上課前截止。

骨架如下,空白處(____)自行完成:

var pointKH = ee.Geometry.Point([120.30, 22.63]);  // ____
 
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')  // ____
  .filterDate('____', '____')                             // ____
  .filterBounds(pointKH)                                  // ____
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))    // ____
  .first();                                               // ____
print('Sentinel-2 影像:', s2);   // ____(取像日期:____,雲量:____ %)
 
Map.centerObject(s2, 11);   // ____
Map.addLayer(s2,            // ____
  { bands: ['B4', 'B3', 'B2'], min: 0, max: 3000 },
  '真色彩');
Map.addLayer(s2,            // ____
  { bands: ['____', '____', '____'], min: 0, max: 3000 },
  '近紅外假色');
 
// Inspector 記錄:植生 B2=__ B3=__ B4=__ B8=__;水體 …;建成區 …
// 植生在假色合成中呈紅色,因為 ____

提示 bands 清單依序送進紅、綠、藍三個色頻道;哪個波段的值相對最高,像元就偏向該頻道的顏色。真色彩把紅、綠、藍波段送進對應頻道,看起來如肉眼所見;近紅外假色把 B8 送進紅色頻道,健康植生因近紅外反射極強而呈鮮紅,水體因近紅外幾乎不反射而呈黑色 (Howarth, 2024, §2.1.3–2.1.5)。第 3 週正式介紹三種合成與加色系統。

評分項目內容配分
篩選與載入篩選條件正確、取出低雲量影像、日期與雲量註記完整30
兩種合成真色彩與近紅外假色皆正確、min/max 合理30
Inspector 與說明三類地物波段值完整、紅色成因說明正確20
註解與繳交函式呼叫處皆有 // 說明、連結可開啟、準時20

課後自我檢核

  1. Map.addLayer 的 min 與 max 作用是什麼?為什麼 Landsat SR 用 8000–17000、Sentinel-2 SR 用 0–3000?
  2. ee.Image 與 ee.ImageCollection 有何不同?print 一個未篩選的 ImageCollection 為什麼會出錯?
  3. filterDate、filterBounds、first 三者的順序可以互換嗎?
  4. palette 為什麼只能用在單一波段?
  5. Get Link 產生的連結,在之後修改腳本後還會更新嗎?

(參考答案要點:1. min 對應黑、max 對應白,中間線性拉伸;兩者的 DN 比例係數與值域不同。2. Image 是單幅多波段影像,ImageCollection 是許多 Image 的有序集合;print 會嘗試列出所有元素,超過 5000 個即中止。3. 兩個 filter 可互換,first() 必須最後。4. palette 是把一個數值對應一個顏色;三個波段時改用 RGB 頻道。5. 不會,連結是快照,修改後須重新 Get Link。)

下週預告

第 3 週實作:真色彩/假色合成與加色系統(Howarth, 2024, §2.1.3–2.1.5)、影像運算——select 取波段、波段算術、閾值與遮罩(Cardille 等, 2024, F2.0)。請先完成本週作業,並確認能在 Console 讀出 Sentinel-2 影像的 CLOUDY_PIXEL_PERCENTAGE。

參考資料

Cardille, J. A., Crowley, M. A., Saah, D., & Clinton, N. E. (Eds.). (2024). Cloud-based remote sensing with Google Earth Engine: Fundamentals and applications. Springer. https://doi.org/10.1007/978-3-031-26588-4(開放取用;全書亦可於 https://www.eefabook.org 免費閱讀;程式碼儲存庫 projects/gee-edu/book)

Gandhi, U. (2024). JavaScript and the Earth Engine API. In J. A. Cardille, M. A. Crowley, D. Saah, & N. E. Clinton (Eds.), Cloud-based remote sensing with Google Earth Engine: Fundamentals and applications (pp. 3–18). Springer. https://doi.org/10.1007/978-3-031-26588-4_1

Howarth, J. (2024). Exploring images. In J. A. Cardille, M. A. Crowley, D. Saah, & N. E. Clinton (Eds.), Cloud-based remote sensing with Google Earth Engine: Fundamentals and applications (pp. 19–39). Springer. https://doi.org/10.1007/978-3-031-26588-4_2

Nicolau, A. P., Dyson, K., Saah, D., & Clinton, N. (2024). Survey of raster datasets. In J. A. Cardille, M. A. Crowley, D. Saah, & N. E. Clinton (Eds.), Cloud-based remote sensing with Google Earth Engine: Fundamentals and applications (pp. 41–66). Springer. https://doi.org/10.1007/978-3-031-26588-4_3

Google. (n.d.). Earth Engine Data Catalog. https://developers.google.com/earth-engine/datasets(各資料集 ID、波段、比例係數與版本更新之查詢來源)

國立高雄師範大學地理學系 115 學年度第 1 學期|GO402 遙測學與影像處理。本講義供修課學生使用。