בשלב הקודם למדתם איך לקבל סצנות ספציפיות של Landsat באמצעות פעולה כמו זו, שבה l8 ו-point הם ייבואים שמייצגים את אוסף TOA של Landsat 8 וגיאומטריה של אזור עניין:
Code Editor (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:
Code Editor (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).
פעולת ההפרש המנורמל נפוצה מאוד בחישה מרחוק, ויש פונקציית קיצור דרך ב-ee.Image שמועילה לפישוט הקוד בדוגמה הקודמת:
Code Editor (JavaScript)
var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
מיפוי פונקציה על אוסף
נניח שעכשיו אתם רוצים להוסיף NDVI לכל תמונה באוסף תמונות. כדי לעשות את זה ב-Earth Engine, צריך map() פונקציה על האוסף.
אל תבלבלו בין map() לבין האובייקט Map. הראשונה היא שיטה באוסף, והיא משתמשת ב-map במובן של מחשוב מקבילי של החלת פונקציה על כל רכיב באוסף. הפונקציה מגדירה את הפעולות שיחולו על כל רכיב באוסף. ראיתם פונקציה פשוטה במדריך ל-JavaScript, אבל עכשיו ניצור פונקציה שכוללת את הפונקציונליות של Earth Engine. לדוגמה, מעתיקים את קוד ה-NDVI הקודם לפונקציה שמחזירה את תמונת הקלט עם פס NDVI:
Code Editor (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 לכל תמונה באוסף. לרוב כדאי לבדוק קודם פונקציה על תמונה אחת, כדי לוודא שהיא פועלת כמו שצריך. אחרי שבודקים את הפונקציה על תמונה בודדת ומוודאים שהיא עושה את מה שרוצים, אפשר למפות אותה על האוסף:
Code Editor (JavaScript)
var withNDVI = l8.map(addNDVI);
כדי לוודא שהפעולה הזו אכן מוסיפה פס NDVI לכל תמונה באוסף, אפשר להוסיף את האוסף withNDVI למפה ולשאול לגבי מיקום אקראי באמצעות הכרטיסייה Inspector. שימו לב שלכל תמונה באוסף יש עכשיו פס שנקרא NDVI.
יצירת קומפוזיציה של הפיקסל הירוק ביותר
עכשיו, אחרי שיצרתם אוסף תמונות שבו לכל תמונה יש פס NDVI, אפשר לבחון דרך חדשה ליצירת תמונות מורכבות: qualityMosaic(). יכול להיות ששמתם לב
לחוסר רציפות בין נתיבי Landsat, אפילו בתמונה המורכבת של הפיקסל החציוני. יכול להיות שהסיבה לכך היא הבדלים בפנולוגיה, כי התמונות בנתיבים סמוכים נאספו בזמנים שונים (ספציפית, בהפרש של 8 ימים). אחת הדרכים לצמצם את ההשפעה הזו היא לנסות להגדיר ערכי פיקסלים בקומפוזיציה מאותו שלב פנולוגי בערך, למשל הזמן שבו הצמחים הכי ירוקים (כשהעלים נמצאים על הצמח ופעילים מבחינה פוטוסינתטית). אם נגדיר את הירקות המקסימלית לפי ה-NDVI המקסימלי, נוכל להשתמש ב-qualityMosaic() כדי ליצור תמונה מורכבת שבה כל פיקסל מכיל את פיקסל ה-NDVI המקסימלי מהאוסף.
עכשיו אפשר להשתמש בערוץ ה-NDVI שנוסף לאוסף withNDVI:
Code Editor (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 הוא הגבוה ביותר כשהצמחייה בפיקסל פעילה מבחינה פוטוסינתטית.
עכשיו ראיתם כמה דרכים ליצור קומפוזיציות ופסיפסים של תמונות ב-Earth Engine. אפשר ליצור תמונות מורכבות של הערך האחרון, החציון או הפיקסל הירוק ביותר מתמונות שמסוננות לפי זמן ומקום, או מכל התמונות באוסף. למדתם איך לבצע חישובים על התמונות ולחלץ מידע. בדף הבא נסביר איך לקבל מידע מ-Earth Engine, למשל כתרשים או כקבוצת נתונים שמיוצאת לתיקיית Google Drive.