NDVI, การแมปฟังก์ชันเหนือคอลเล็กชัน, การต่อภาพโมเสกคุณภาพ

ก่อนหน้านี้ คุณได้เรียนรู้วิธีรับภาพ Landsat แต่ละภาพโดยทำสิ่งต่อไปนี้ โดยที่ l8 และ point เป็นการนำเข้าที่แสดงถึงคอลเล็กชัน Landsat 8 TOA และเรขาคณิตของพื้นที่ที่สนใจ

ตัวแก้ไขโค้ด (JavaScript)

// Define a point of interest. Use the UI Drawing Tools to import a point
// geometry and name it "point" or set the point coordinates with the
// ee.Geometry.Point() function as demonstrated here.
var point = ee.Geometry.Point([-122.292, 37.9018]);

// Import the Landsat 8 TOA image collection.
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');

// Get the least cloudy image in 2015.
var image = ee.Image(
  l8.filterBounds(point)
    .filterDate('2015-01-01', '2015-12-31')
    .sort('CLOUD_COVER')
    .first()
);

สมมติว่าตอนนี้คุณต้องการคำนวณภาพดัชนีพืชพรรณที่ปรับให้เป็นมาตรฐาน (NDVI) จากภาพ Landsat พืชพรรณจะสะท้อนแสงในส่วนอินฟราเรดใกล้ (NIR) ของสเปกตรัมแม่เหล็กไฟฟ้า และดูดซับแสงในส่วนสีแดง (ดูข้อมูลเพิ่มเติมเกี่ยวกับการสะท้อน NIR จากพืชพรรณ) NDVI ใช้ข้อมูลนี้เพื่อสร้างค่าเดียวที่สะท้อนถึงกิจกรรมการสังเคราะห์แสงที่เกิดขึ้นที่พิกเซลโดยประมาณ การคำนวณคือ (NIR - แดง) / (NIR + แดง) ซึ่งจะให้ผลลัพธ์เป็นตัวเลขระหว่าง 1 ถึง -1 โดยพิกเซลที่มีกิจกรรมการสังเคราะห์แสงสูงจะมี NDVI สูง วิธีหนึ่งในการคำนวณ NDVI ใน Earth Engine มีดังนี้

ตัวแก้ไขโค้ด (JavaScript)

// Compute the Normalized Difference Vegetation Index (NDVI).
var nir = image.select('B5');
var red = image.select('B4');
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('NDVI');

// Display the result.
Map.centerObject(image, 9);
var ndviParams = {min: -1, max: 1, palette: ['blue', 'white', 'green']};
Map.addLayer(ndvi, ndviParams, 'NDVI image');

ผลลัพธ์ควรมีลักษณะคล้ายกับรูปที่ 8 โปรดทราบว่าเราใช้ฟังก์ชัน select() ที่คุณได้เรียนรู้ในส่วนก่อนหน้าเกี่ยวกับการมาสก์เพื่อรับย่านความถี่ NIR และย่านความถี่สีแดง จากนั้นคำนวณ NDVI โดยใช้โอเปอเรเตอร์ทางคณิตศาสตร์ของรูปภาพที่คุณเคยเห็นมาก่อนในส่วนเกี่ยวกับคณิตศาสตร์ Image สุดท้าย ให้แสดงรูปภาพด้วยชุดสี ในตัวอย่างนี้ เราใช้ชื่อสีแทนสตริงฐานสิบหกในชุดสี (ดูรายละเอียดได้ที่ข้อมูลอ้างอิงภายนอกเกี่ยวกับสี CSS)

Tutorial_api_08_ndvi.png
รูปที่ 8 NDVI สำหรับฉาก Landsat ฉากเดียว สีน้ำเงินคือ NDVI ต่ำและสีเขียวคือ NDVI สูง

การดำเนินการหาความแตกต่างที่ปรับมาตรฐานแล้วเป็นที่นิยมอย่างมากในการสำรวจระยะไกล จึงมีฟังก์ชันทางลัดใน ee.Image ซึ่งมีประโยชน์ในการลดความซับซ้อนของโค้ดในตัวอย่างก่อนหน้านี้

ตัวแก้ไขโค้ด (JavaScript)

var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');

การแมปฟังก์ชันกับคอลเล็กชัน

สมมติว่าตอนนี้คุณต้องการเพิ่ม NDVI ลงในรูปภาพทุกรูปในคอลเล็กชันรูปภาพ วิธีดำเนินการใน Earth Engine คือmap()ฟังก์ชันในคอลเล็กชัน อย่าสับสนระหว่าง map() กับออบเจ็กต์ Map โดยวิธีแรกเป็นเมธอดในคอลเล็กชัน และใช้ map ในความหมายของการประมวลผลแบบขนานของการใช้ฟังก์ชันกับทุกองค์ประกอบในคอลเล็กชัน ฟังก์ชันจะกำหนดการดำเนินการที่จะใช้กับทุกองค์ประกอบในคอลเล็กชัน คุณได้เห็นฟังก์ชันง่ายๆ ในบทแนะนำ JavaScript แล้ว แต่ตอนนี้เราจะสร้างฟังก์ชันที่มีฟังก์ชันการทำงานของ Earth Engine เช่น คัดลอกโค้ด NDVI ก่อนหน้าลงในฟังก์ชันที่แสดงผลรูปภาพอินพุตที่มีแบนด์ NDVI ดังนี้

ตัวแก้ไขโค้ด (JavaScript)

var addNDVI = function(image) {
  var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
  return image.addBands(ndvi);
};

// Test the addNDVI function on a single image.
var ndvi = addNDVI(image).select('NDVI');

โค้ดนี้อาจไม่มีประสิทธิภาพในการคำนวณ NDVI สำหรับรูปภาพเดียว แต่ฟังก์ชันนี้สามารถใช้เป็นอาร์กิวเมนต์สำหรับ map() เพื่อเพิ่มแบนด์ NDVI ลงในรูปภาพทุกรูปในคอลเล็กชันได้ การทดสอบฟังก์ชันกับรูปภาพเดียวก่อนมักจะมีประโยชน์ เพื่อให้แน่ใจว่าฟังก์ชันทำงานตามที่คุณคาดหวัง เมื่อทดสอบฟังก์ชันกับรูปภาพแต่ละรูปและพิจารณาแล้วว่าฟังก์ชันทำงานตามที่ต้องการ คุณจะแมปฟังก์ชันกับคอลเล็กชันได้โดยทำดังนี้

ตัวแก้ไขโค้ด (JavaScript)

var withNDVI = l8.map(addNDVI);

หากต้องการยืนยันว่าการดำเนินการนี้จะใส่แบนด์ NDVI ในทุกรูปภาพในคอลเล็กชันนี้จริงๆ คุณสามารถเพิ่มคอลเล็กชัน withNDVI ลงในแผนที่และค้นหาตำแหน่งแบบสุ่มด้วยแท็บเครื่องมือตรวจสอบ คุณควรสังเกตเห็นว่าแต่ละรูปภาพในคอลเล็กชันมีแบนด์ชื่อ NDVI แล้ว

สร้างภาพรวมพิกเซลที่เขียวที่สุด

เมื่อคุณสร้างคอลเล็กชันรูปภาพที่แต่ละรูปมีแบนด์ NDVI แล้ว เราจะสำรวจวิธีใหม่ในการสร้างภาพรวม นั่นคือ qualityMosaic() คุณอาจสังเกตเห็นความไม่ต่อเนื่องระหว่างเส้นทาง Landsat แม้ในภาพรวมพิกเซลค่ามัธยฐาน สาเหตุส่วนหนึ่งอาจเกิดจากความแตกต่างในปรากฏการณ์วิทยา ซึ่งเป็นผลมาจากรูปภาพในเส้นทางที่อยู่ติดกันซึ่งรวบรวมในเวลาที่ต่างกัน (โดยเฉพาะห่างกัน 8 วัน) วิธีหนึ่งในการลดปัญหานี้คือการพยายามตั้งค่าพิกเซลในภาพรวมจากระยะฟีโนโลยีที่ใกล้เคียงกัน เช่น ช่วงเวลาที่พืชมีความเขียวมากที่สุด (เมื่อใบไม้ขึ้นและสังเคราะห์แสงได้) หากเรากำหนดให้ความเขียวสูงสุดเป็นค่า NDVI สูงสุด เราจะใช้ qualityMosaic() เพื่อสร้างภาพคอมโพสิตที่แต่ละพิกเซลมีพิกเซล NDVI สูงสุดจากคอลเล็กชันได้ ตอนนี้คุณสามารถใช้แบนด์ NDVI ที่เพิ่มเข้ามาในคอลเล็กชัน withNDVI ได้แล้ว

ตัวแก้ไขโค้ด (JavaScript)

// Make a "greenest" pixel composite.
var greenest = withNDVI.qualityMosaic('NDVI');

// Display the result.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};
Map.addLayer(greenest, visParams, 'Greenest pixel composite');

ผลลัพธ์ของโค้ดนี้ควรมีลักษณะดังรูปที่ 9 เมื่อเปรียบเทียบรูปที่ 9 กับภาพคอมโพสิตค่ามัธยฐานที่แสดงในรูปที่ 6 จะเห็นว่าภาพคอมโพสิตพิกเซลที่เขียวที่สุดนั้นเขียวกว่ามากจริงๆ อย่างไรก็ตาม การตรวจสอบแหล่งน้ำอย่างใกล้ชิดจะทำให้เห็นปัญหาที่แตกต่างออกไปอย่างชัดเจน โดยเฉพาะอย่างยิ่ง แหล่งน้ำจะปรากฏเป็นสีขุ่น ซึ่งเป็นผลมาจากวิธีการทำงานของเมธอด qualityMosaic() โดยระบบจะตรวจสอบอนุกรมเวลาทั้งหมดในแต่ละตำแหน่ง และตั้งค่าพิกเซลที่มีค่าสูงสุดในย่านความถี่ NDVI เป็นค่าคอมโพสิต เนื่องจาก NDVI เหนือเมฆสูงกว่าเหนือน้ำ พื้นที่น้ำจึงมีพิกเซลที่มีเมฆ ในขณะที่พื้นที่ที่มีพืชพรรณทั้งหมดปรากฏเป็นสีเขียวเนื่องจาก NDVI จะสูงที่สุดเมื่อพืชพรรณในพิกเซลมีการสังเคราะห์แสง

Tutorial_api_09_greenest.png
รูปที่ 9 องค์ประกอบพิกเซลที่เขียวที่สุดของ Landsat 8

ตอนนี้คุณได้เห็นวิธีต่างๆ ในการจัดองค์ประกอบและโมเสกรูปภาพใน Earth Engine แล้ว คุณสามารถสร้างภาพคอมโพสิตค่าล่าสุด ค่ามัธยฐาน หรือพิกเซลสีเขียวที่สุดจากรูปภาพที่กรองตามเวลาและสถานที่ หรือรูปภาพทั้งหมดในคอลเล็กชัน คุณได้เรียนรู้วิธีการคำนวณภาพและดึงข้อมูลแล้ว หน้าถัดไปจะครอบคลุมวิธีรับข้อมูลจาก Earth Engine เช่น เป็นแผนภูมิหรือชุดข้อมูลที่ส่งออกไปยังโฟลเดอร์ Google ไดรฟ์