完成本週實作後,同學應能:
關於本講義的引用 本講義實作內容整理自開放教科書 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 週學過,// 之後的文字不會被執行(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本節先用教材原範例(上海,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)。
// 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 有個別衛星影像、預製合成、土地覆蓋圖、氣候、人口、地形等資料集 (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。 |
繳交前四項檢查
注意 若腳本用到自己上傳的私有 Assets,對方仍看不到該資料,執行會失敗。本週作業只用公開資料集,不得使用私有資產。
目標 新開腳本 w02_hw,從 Sentinel-2 地表反射率集合取出一幅雲量低、涵蓋高雄的影像,以真色彩與近紅外假色兩種合成顯示。
要求
骨架如下,空白處(____)自行完成:
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. 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、波段、比例係數與版本更新之查詢來源)