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 + قرمز) است. این منجر به عددی بین 1 و -1 می شود که در آن پیکسل هایی با فعالیت فتوسنتزی بالا دارای 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');

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

Tutorial_api_08_ndvi.png
شکل 8. NDVI برای یک صحنه منفرد Landsat. آبی کم و سبز NDVI زیاد است.

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

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

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

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

اکنون فرض کنید که می خواهید NDVI را به هر تصویر در مجموعه تصاویر اضافه کنید. روش انجام این کار در Earth Engine این است که یک تابع را روی مجموعه 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 را به نقشه اضافه کنید و یک مکان تصادفی را با زبانه Inspector جستجو کنید. باید توجه داشته باشید که هر تصویر در مجموعه اکنون دارای یک باند به نام NDVI است.

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

اکنون که مجموعه‌ای از تصاویر ساخته‌اید که در آن هر تصویر دارای یک باند NDVI است، می‌توانیم راه جدیدی برای ساخت کامپوزیت‌ها کشف کنیم: qualityMosaic() . ممکن است متوجه ناپیوستگی مسیرهای Landsat شده باشید، حتی در کامپوزیت پیکسل میانه. بخشی از دلیل آن ممکن است به دلیل تفاوت در فنولوژی در نتیجه جمع آوری تصاویر در مسیرهای مجاور در زمان های مختلف (مخصوصاً با فاصله 8 روز) باشد. یک راه برای به حداقل رساندن این امر این است که سعی کنید مقادیر پیکسل را در کامپوزیت تقریباً از همان مرحله فنولوژیکی تنظیم کنید، برای مثال زمان حداکثر سبز شدن گیاهان (زمانی که برگها روشن هستند و از نظر فتوسنتزی فعال هستند). اگر اجازه دهیم حداکثر سبزی با حداکثر 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');

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

Tutorial_api_09_greenest.png
شکل 9. لندست 8 سبزترین کامپوزیت پیکسل.

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