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

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

โปรแกรมแก้ไขโค้ด (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คณิตศาสตร์ สุดท้าย ให้แสดงรูปภาพพร้อมจานสี ในที่นี้ เราใช้ชื่อสีแทนสตริงเลขฐาน 16 ในจานสี (ดูรายละเอียดได้ที่ข้อมูลอ้างอิงภายนอกนี้ เกี่ยวกับสี 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 ไดรฟ์