NDVI، نگاشت تابع روی مجموعه، موزاییک‌سازی کیفیت

قبلاً یاد گرفتید که چگونه با انجام کاری شبیه به این، صحنه‌های Landsat را به‌صورت جداگانه دریافت کنید، که در آن l8 و point نشان‌دهنده واردات Landsat 8 TOA مجموعه و هندسه منطقه موردعلاقه هستند:

ویرایشگر کد (جاوا اسکریپت)

// 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 + قرمز) است. این امر منجر به عددی بین ۱ و ۱- می‌شود، که در آن پیکسل‌های دارای فعالیت فتوسنتزی بالا، NDVI بالایی دارند. این یکی از روش‌های محاسبه NDVI در Earth Engine است:

ویرایشگر کد (جاوا اسکریپت)

// 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');

نتیجه باید چیزی شبیه به شکل ۸ باشد. توجه داشته باشید که از تابع select() که در بخش قبلی درباره ماسک‌گذاری با آن آشنا شدید برای دریافت باندهای NIR و قرمز استفاده می‌کنیم، سپس NDVI را بااستفاده از عملگرهای ریاضی تصویر که قبلاً در بخش مربوط به ریاضیات Image دیده‌اید محاسبه می‌کنیم. درنهایت، تصویر را با پالت نمایش دهید. در اینجا به‌جای رشته‌های هگزادسیمال از نام رنگ‌ها در پالت استفاده کرده‌ایم. (برای جزئیات، این مرجع خارجی درباره رنگ CSS را ببینید.)

Tutorial_api_08_ndvi.png
شکل ۸. NDVI برای یک صحنه Landsat. آبی نشان‌دهنده NDVI پایین و سبز نشان‌دهنده NDVI بالا است.

عملیات تفاوت نرمال‌شده در سنجش از دور بسیار رایج است، یک تابع میان‌بر در ee.Image وجود دارد که برای ساده‌سازی کد در مثال قبلی مفید است:

ویرایشگر کد (جاوا اسکریپت)

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

نگاشت تابع روی مجموعه

اکنون فرض کنید می‌خواهید NDVI را به هر تصویر در مجموعه تصویر اضافه کنید. روش انجام این کار در Earth Engine map() کردن تابع روی مجموعه است. map() را با شیء Map اشتباه نگیرید. مورد اول روشی در مجموعه است و از map در مفهوم محاسبات موازی برای اعمال تابع به هر عنصر در مجموعه استفاده می‌کند. تابع، عملیاتی را که بر هر عنصر در مجموعه اعمال خواهد شد تعریف می‌کند. یک تابع ساده را در آموزش جاوا اسکریپت دیده‌اید، اما اکنون می‌خواهیم تابعی بسازیم که شامل عملکرد Earth Engine باشد. برای مثال، کد NDVI قبلی را در تابعی کپی کنید که تصویر ورودی را با باند NDVI برمی‌گرداند:

ویرایشگر کد (جاوا اسکریپت)

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 به هر تصویر در مجموعه اضافه شود. اغلب مفید است که ابتدا تابع را روی یک تصویر آزمایش کنید تا مطمئن شوید که تابع طبق انتظار شما رفتار می‌کند. وقتی تابع را روی یک تصویر تکی آزمایش کردید و مطمئن شدید که کار موردنظرتان را انجام می‌دهد، می‌توانید آن را روی مجموعه نگاشت کنید:

ویرایشگر کد (جاوا اسکریپت)

var withNDVI = l8.map(addNDVI);

برای تأیید اینکه این کار واقعاً یک باند NDVI را در هر تصویر در این مجموعه قرار می‌دهد، می‌توانید مجموعه withNDVI را به نقشه اضافه کنید و یک مکان تصادفی را با برگه بازرس جستجو کنید. باید متوجه شوید که هر تصویر در مجموعه اکنون باندی به‌نام NDVI دارد.

ساختن ترکیب پیکسل سبزترین

اکنون که مجموعه تصویری ساخته‌اید که هر تصویر آن دارای باند NDVI است، می‌توانیم روش جدیدی را برای ساختن ترکیب‌ها کاوش کنیم: qualityMosaic(). ممکن است متوجه ناپیوستگی‌هایی بین مسیرهای Landsat شده باشید، حتی در ترکیب پیکسل میانه. بخشی از دلیل آن ممکن است به‌خاطر تفاوت در زیست‌گاه‌شناسی باشد که درنتیجه جمع‌آوری تصاویر در مسیرهای مجاور در زمان‌های مختلف (به‌طور خاص، با فاصله ۸ روز) ایجاد می‌شود. یک راه برای به‌حداقل رساندن این مشکل این است که سعی کنید مقادیر پیکسل را در ترکیب از تقریباً همان مرحله فنولوژیکی تنظیم کنید، برای مثال زمان حداکثر سبزی گیاهان (زمانی که برگ‌ها روی گیاه هستند و ازنظر فتوسنتزی فعال هستند). اگر اجازه دهیم حداکثر سبزی با حداکثر NDVI تعریف شود، می‌توانیم از qualityMosaic() برای ساختن ترکیبی استفاده کنیم که در آن هر پیکسل حاوی حداکثر پیکسل NDVI از مجموعه باشد. اکنون می‌توانید از باند NDVI اضافه‌شده در مجموعه withNDVI خود استفاده کنید:

ویرایشگر کد (جاوا اسکریپت)

// 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');

نتیجه این کد باید چیزی شبیه به شکل ۹ باشد. با مقایسه شکل ۹ با ترکیب میانه نشان‌داده‌شده در شکل ۶، مشاهده می‌کنید که ترکیب سبزترین پیکسل واقعاً بسیار سبزتر است. بااین‌حال، بررسی دقیق پهنه‌های آبی باید مشکل دیگری را آشکار کند. به‌طور مشخص، پهنه‌های آبی اکنون ابری به‌نظر می‌رسند. این به‌دلیل نحوه عملکرد روش qualityMosaic() است: در هر مکان، کل سری زمانی بررسی می‌شود و پیکسل با حداکثر مقدار در باند NDVI به‌عنوان مقدار ترکیبی تنظیم می‌شود. چون NDVI روی ابرها بیشتر از آب است، مناطق آبی پیکسل‌های ابری دریافت می‌کنند، درحالی‌که مناطق گیاهی همگی سبز ظاهر می‌شوند چون NDVI زمانی بالاترین است که گیاهان در پیکسل ازنظر فتوسنتزی فعال باشند.

Tutorial_api_09_greenest.png
شکل ۹. ترکیب سبزترین پیکسل Landsat 8.

اکنون چندین روش برای ترکیب و موزاییک کردن تصاویر در Earth Engine دیده‌اید. می‌توانید ترکیب‌های مقدار اخیر، میانه، یا سبزترین پیکسل را از تصاویر فیلترشده براساس زمان و مکان یا همه تصاویر موجود در مجموعه بسازید. با نحوه انجام محاسبات روی تصاویر و استخراج اطلاعات آشنا شدید. صفحه بعدی روش‌های دریافت اطلاعات از Earth Engine را پوشش می‌دهد، برای مثال به‌صورت نمودار یا مجموعه داده صادرشده به پوشه Google Drive شما.