המדריך הזה מיועד למתחילים ומספק דרך מהירה להתחיל לתכנת באמצעות Earth Engine JavaScript API. במדריכים תוכלו למצוא מבוא ל-JavaScript ותרגילים מעמיקים יותר עם Earth Engine API. כדי לקבל המלצות לגבי סגנון הקוד של JavaScript, אפשר לעיין במדריך של Google לגבי סגנון JavaScript.
Google Earth Engine מאפשר למשתמשים להריץ אלגוריתמים על תמונות וקווים וקטוריים שמאומתים למיקום גיאוגרפי וששמורים בתשתית של Google. Google Earth Engine API מספק ספרייה של פונקציות שאפשר להחיל על נתונים כדי להציג אותם ולנתח אותם. קטלוג הנתונים הציבוריים של Earth Engine מכיל כמות גדולה של מערכי נתונים וקטעי וקטורים שזמינים לציבור. אפשר ליצור נכסים פרטיים גם בתיקיות האישיות של המשתמשים.
איך משתמשים במסמכים האלה
מסמכי התיעוד של Earth Engine מיועדים לאנשים שמכירים ניתוח נתונים גיאו-מרחביים. המסמכים מחולקים בעיקר לפי סוג הנתונים. לדוגמה, חלונית הניווט שמימין מכילה קישורים לקטעים או לדפים בנושא סוגים חשובים של נתונים, כמו Image
, ImageCollection
, Feature
, FeatureCollection
, Geometry
, Reducer
, Chart
, Join
ו-Array
. במדריך הזה נסביר רק את מה שצריך כדי להתחיל. יש גם קטעים בנושא למידת מכונה, אלגוריתמים מיוחדים או ספציפיים לחיישנים (למשל אלגוריתמים של Landsat), אפליקציות גלויות לכולם, ניהול נתונים (נכסים) ופרטים חשובים על התהליכים הפנימיים של Earth Engine.
לפני שמתחילים, כדאי להתחיל מכאן.
עורך הקוד
Code Editor הוא סביבה אינטראקטיבית לפיתוח אפליקציות של Earth Engine (איור 1). בחלונית המרכזית יש עורך קוד JavaScript. מעל לעורך מופיעים לחצנים לשמירת הסקריפט הנוכחי, להרצה שלו ולניקוי המפה. לחיצה על הלחצן Get Link יוצרת כתובת URL ייחודית לסקריפט בסרגל הכתובות. המפה בחלונית התחתונה מכילה את השכבות שנוספו על ידי הסקריפט. בחלק העליון של המסך מופיעה תיבת חיפוש למערכי נתונים ומקומות. בחלונית הימנית מופיעים דוגמאות קוד, הסקריפטים השמורים, מסמך עזרה לחיפוש ממשקי API ומנהל נכסים לנתונים פרטיים. בחלונית השמאלית יש בודק לשאילתות במפה, מסוף פלט ומנהל למשימות ממושכות. לחצן העזרה במדריך ל-Code Editor ובמדריך לקבלת עזרה.
בפינה השמאלית העליונה מכיל קישורים למדריך הזה ולמקורות מידע אחרים שיעזרו לכם. מידע נוסף זמין
פתיחה והרצה של קוד בעורך הקוד
בשלבים הבאים מוסבר איך לפתוח את Earth Engine ולהריץ סקריפט בהתאמה אישית שמוצגת בו תמונה. כדי לקבל את התוצאות הטובות ביותר, מומלץ להתקין את הגרסה העדכנית של Chrome, דפדפן האינטרנט של Google, שזמינה כאן.
- פותחים את Earth Engine Code Editor ��כתובת: code.earthengine.google.com.
- עוברים לכרטיסייה Scripts שנמצאת בקצה הימני של עורך הקוד. שם תמצאו אוסף של סקריפטים לדוגמה שמאפשרים לגשת לנתונים של Earth Engine, להציג אותם ולנתח אותם.
- בקטע 'אוסף תמונות', בוחרים בדוגמה 'תמונה מורכבת מסוננת'. סקריפט יופיע במסוף המרכזי. לוחצים על הלחצן Run כדי להריץ את הסקריפט. בדוגמה של תמונה מורכבת מסוננת, נבחרו תמונות Landsat 7 שנמצאות בתוך גבולות קולורדו ויוטה או חוצות אותם. לאחר מכן מוצג קומפוזיט של תמונות שנבחרו בצבעים אמיתיים. הדוגמאות כוללות שיטות נפוצות, כמו
filter()
,clip()
ו-Map.addLayer()
.
מבני נתונים ב-Earth Engine
שתי המבנים הבסיסיים ביותר של נתונים גיאוגרפיים ב-Earth Engine הם Image
ו-Feature
, שתואמים לסוגים של נתוני רסטר ונתוני וקטורים, בהתאמה. תמונות מורכבות מפסגות וממילון של מאפיינים.
תכונות מורכבות מ-Geometry
וממילון של מאפיינים. ImageCollection
מטפל בסטאק של תמונות (למשל, סדרת תמונות לאורך זמן). אוסף של תכונות מטופלות על ידי FeatureCollection
. מבני נתונים בסיסיים אחרים ב-Earth Engine הם Dictionary
, List
, Array
, Date
, Number
ו-String
(במדריך הזה מוסבר בהרחבה על סוגי נתונים בסיסיים). חשוב לזכור שכל אלה הם אובייקטים בצד השרת, ולא ניתן לבצע בהם מניפולציות באותו אופן שבו מבצעים מניפולציות באובייקטים של JavaScript בצד הלקוח (מידע נוסף).
אלגוריתמים של Earth Engine
יש כמה דרכים להריץ פעולות ב-API:
- קריאה ל-methods שמצורפים לאובייקטים.
- קריאה לאלגוריתמים.
- קריאה לפונקציות ספציפיות של Code Editor.
- הגדרת פונקציות חדשות.
בכרטיסייה Docs (מסמכים) של Code Editor מפורטים השיטות של כל סוג API. לדוגמה, למחלקה Image
יש שיטה add()
:
Code Editor (JavaScript)
var image3 = image1.add(image2);
השיטה הזו מוסיפה את הלהקות של image2
ללהקות של image1
.
הקטגוריה ee.Algorithms
מכילה רשימה של אלגוריתמים נתמכים כרגע לעיבוד מיוחד או עיבוד ספציפי לדומיין. לדוגמה, כדי ליצור שכבות טופוגרפיות מתוך מודל גובה דיגיטלי (DEM) של קלט:
Code Editor (JavaScript)
var terrainImage = ee.Algorithms.Terrain(dem);
פונקציות ספציפיות ל-Code Editor כוללות את השיטות Map
ו-Export
, שמאפשרות לקבוע איך שכבות מתווספות לחלונית המפה או מיוצאות ל-Google Drive, בהתאמה. אפשר ליצור פונקציות ב-JavaScript גם באמצעות
Code Editor (JavaScript)
var myFunction = function(args) { // do something return something; };
כפי שמתואר בקטע 'מיפוי', פונקציות שהוגדרו על ידי משתמשים מועילות ליצירת פונקציונליות בהתאמה אישית או לשינוי הרכיבים של אוסף באמצעות:
Code Editor (JavaScript)
var collection2 = collection1.map(aFunction);
בקטעים הבאים נסביר את המושגים האלה באמצעות תרחישים פשוטים לדוגמה.
'Hello world!' JavaScript
הדפסת מידע במסוף היא משימה בסיסית לקבלת מידע על אובייקט, להצגת התוצאה המספרית של חישוב, להצגת מטא-נתונים של אובייקט או לעזרה בניפוי באגים. הדוגמה המוכרת 'Hello World!' בכלי לעריכת קוד היא:
Code Editor (JavaScript)
print('Hello world!');
מעתיקים את השורה הזו לעורך הקוד של Code Editor ולוחצים על Run. שימו לב שהפלט מוצג בכרטיסייה מסוף, שמשמאל ל-Code Editor. דוגמה רלוונטית יותר לתחום הרגישות מרחוק: הפקודה הבאה מדפיסה את המטא-נתונים של תמונה מ-Landsat 8:
Code Editor (JavaScript)
print(ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318'));
בודקים היטב את הפלט במסוף כדי לראות אילו מטא-נתונים זמינים לתמונות Landsat.
הוספת נתונים למפה
בנוסף להדפסת מידע במסוף, הוספת נתונים ל-Map
היא הדרך להציג נתונים גיאוגרפיים באופן חזותי. כדי לעשות זאת, משתמשים ב-Map.addLayer()
. בדוגמה הבאה, נוצר אובייקט Image
(איך למצוא את התמונות האלה מוסבר בהמשך) באמצעות ee.Image()
, הוא מתווסף למפה באמצעות Map.addLayer()
והמפה ממוקמת במרכז התמונה:
Code Editor (JavaScript)
// Load an image. var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318'); // Center the map on the image. Map.centerObject(image, 9); // Display the image. Map.addLayer(image);
הפרמטר השני של Map.centerObject()
הוא רמת התצוגה, כאשר מספרים גבוהים יותר מציינים קנה מידה גדול יותר (תצוגה מוגדלת יותר). הפרמטרים של הפונקציות Map
מתוארים בפירוט במסמך העזרה של ה-API, שאפשר לגשת אליו בכרטיסייה Docs. אם המראה של התמונה לא מספק, אפשר להגדיר את פרמטרים התצוגה באמצעות ארגומנט נוסף ל-Map.addLayer()
. לדוגמה:
Code Editor (JavaScript)
// Load the image from the archive. var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318'); // Define visualization parameters in an object literal. var vizParams = {bands: ['B5', 'B4', 'B3'], min: 0.02, max: 0.4, gamma: 1.3}; // Center the map on the image and display. Map.centerObject(image, 9); Map.addLayer(image, vizParams, 'Landsat 8 false color');
שימו לב שהפרמטרים של התצוגה החזותית מוגדרים על ידי אובייקט לטרלי, שכולל רשימה של פסים להצגה, ערך מינימלי ומקסימלי של רפלקטיביות וערך גמא. (כאן אפשר לקרוא מידע נוסף על פסגות Landsat). כאן אפשר לקרוא מידע נוסף על ויזואליזציה של תמונות).
משתמשים ב-Map.addLayer()
כדי להוסיף למפה תכונות וקולקציות של תכונות. לדוגמה:
Code Editor (JavaScript)
var counties = ee.FeatureCollection('TIGER/2018/Counties'); Map.addLayer(counties, {}, 'counties');
חיפוש תמונות, אוספים של תמונות ואוספים של תכונות
אפשר למצוא תמונות, אוספים של תמונות ואוספים של תכונות בחיפוש ב-Earth Engine Data Catalog. לדוגמה, הזנת 'Landsat 8' בשדה החיפוש תגרום להצגת רשימה של מערכי נתונים רסטריים. (הרשימה המלאה של מערכי הנתונים של Earth Engine מופיעה במאגר הנתונים של Earth Engine). לוחצים על שם מערך הנתונים כדי לקבל תיאור קצר, מידע על הזמינות הזמנית, ספק הנתונים ומזהה האוסף. לוחצים על הלחצן Import כדי ליצור באופן אוטומטי קטע Imports בחלק העליון של הסקריפט עם משתנה לאוסף הזה.
לחלופין, מעתיקים את מזהה הקולקציה ומדביקים אותו בקוד. לדוגמה, בוחרים את תוצאת ה-TOA ברמה 1 בחיפוש 'Landsat 8' ומעתיקים את המזהה באופן הבא:
Code Editor (JavaScript)
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
מכיוון שמדובר באוסף של תמונות רבות שכוללות את פני השטח של כדור הארץ, כדי למצוא תמונה ספציפית באוסף צריך לסנן את התוצאות כדי לצמצם את החיפוש. לחלופין, אפשר לצמצם את אוסף התמונות לתמונה אחת באמצעות שיטות של יצירת קומפוזיציה ומוזיקת. מידע נוסף על סינון ועל שילוב (ראו צמצום) זמין בקטעים הבאים.
אוספים של תכונות זמינים גם דרך Data Catalog. התצוגה שלהם קטנה יותר מזו של אוספי תמונות, אבל תוכלו למצוא בהם, בין היתר, גבולות של תחומים בינלאומיים, אזורי מפגש מים, אזורים מוגנים וגבולות של מפקד אוכלוסין. כאן אפשר לקרוא מידע נוסף על ייבוא מערכי נתונים של וקטורים.
סינון ומיון
לרוב צריך לסנן את האוסף לפי מיקום ו/או זמן כדי להגביל את מספר התוצאות. לדוגמה, נניח שרוצים למיין את אוסף התמונות של Landsat 8 כדי למצוא תמונה ללא עננים של סן פרנסיסקו. קודם כול, צריך להגדיר את אזור העניין. לרוב, נקודה היא שימושית למטרה הזו. מפעילים את הכרטיסייה Inspector בצד שמאל של Code Editor, לוחצים ליד מרכז אזור העניין, מעתיקים את הקואורדינטות מהכרטיסייה Inspector ובונים Point
באמצעות:
Code Editor (JavaScript)
var point = ee.Geometry.Point(-122.262, 37.8719);
יוצרים את תאריכי ההתחלה והסיום:
Code Editor (JavaScript)
var start = ee.Date('2014-06-01'); var finish = ee.Date('2014-10-01');
מסננים את האוסף של Landsat 8 באמצעות הנקודה והתאריכים, וא�� ממינים לפי מאפיין של המטא-נתונים (שנתגלה במהלך בדיקת המטא-נתונים של הסצנה ב-Landsat 8):
Code Editor (JavaScript)
var filteredCollection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') .filterBounds(point) .filterDate(start, finish) .sort('CLOUD_COVER', true);
אפשר להדפיס ולבדוק את הקולקציה הזו בבטחה. (אם האוסף מכיל יותר מדי תמונות, ההדפסה תהיה איטית מאוד, יפוג הזמן הקצוב להדפסה או תו��י�� ש��יאה). שימו לב שהתמונות באוסף הן List
שמאוחסנות במאפיין 'features' של ImageCollection
. אפשר להעתיק את המזהה של כל תמונה בקולקציה לתוך המבנה הגנרטיבי Image
, כפי שמתואר למעלה. לחלופין, אפשר לקבל את התמונה הראשונה (הכי פחות עננים):
Code Editor (JavaScript)
var first = filteredCollection.first();
כדי לגשת לפונקציונליות המלאה של סינון ב-Earth Engine, משתמשים בפונקציה filter()
עם ee.Filter
כארגומנט. (השיטות filterBounds()
ו-filterDate()
שצוינו למעלה הן קיצורי דרך). לדוגמה, הפקודה הבאה יוצרת Filter
, משתמשת בו כדי לסנן FeatureCollection
ומציגה את התוצאה:
Code Editor (JavaScript)
// Load a feature collection. var featureCollection = ee.FeatureCollection('TIGER/2016/States'); // Filter the collection. var filteredFC = featureCollection.filter(ee.Filter.eq('NAME', 'California')); // Display the collection. Map.setCenter(-119.604, 37.798, 6); Map.addLayer(filteredFC, {}, 'California');
מתמטיקה של Band
ביצוע פעולות מתמטיות על תמונות באמצעות שיטות Image
. אלה יכולים להיות שילובים של פס (מדדים ספקטראליים), הפרש בין תמונות או פעולות מתמטיות כמו כפל במספר קבוע. לדוגמה, חישוב ההבדל בין תמונות של אינדקס הפרש מנורמל של צמחייה (NDVI) שנלקחו במרווח זמן של 20 שנה:
Code Editor (JavaScript)
// This function gets NDVI from Landsat 5 imagery. var getNDVI = function(image) { return image.normalizedDifference(['B4', 'B3']); }; // Load two Landsat 5 images, 20 years apart. var image1 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_19900604'); var image2 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_20100611'); // Compute NDVI from the scenes. var ndvi1 = getNDVI(image1); var ndvi2 = getNDVI(image2); // Compute the difference in NDVI. var ndviDifference = ndvi2.subtract(ndvi1);
שימו לב לשימוש ב-function
שהוגדר על ידי משתמש בדוגמה הזו. מידע נו��ף על פונקציות מופיע בקטע הבא.
מיפוי (מה עושים במקום לולאת for)
משתמשים ב-map()
כדי לבצע איטרציה על הפריטים באוסף. (לולאות For הן לא הדרך הנכונה לעשות זאת ב-Earth Engine, ומומלץ להימנע מהן). אפשר להחיל את הפונקציה map()
על ImageCollection
, על FeatureCollection
או על List
, והיא מקבלת function
בתור הארגומנט שלה. הארגומנט של הפונקציה הוא רכיב מהאוסף שאליו הוא ממופה. האפשרות הזו שימושית כדי לשנות כל רכיב בקולקציה באותו אופן, למשל הוספה. לדוגמה, הקוד הבא מוסיף פס NDVI לכל תמונה ב-ImageCollection
:
Code Editor (JavaScript)
// This function gets NDVI from Landsat 8 imagery. var addNDVI = function(image) { return image.addBands(image.normalizedDifference(['B5', 'B4'])); }; // Load the Landsat 8 TOA data, filter by location and date. var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') .filterBounds(ee.Geometry.Point(-122.262, 37.8719)) .filterDate('2014-06-01', '2014-10-01'); // Map the function over the collection. var ndviCollection = collection.map(addNDVI);
משימה נפוצה נוספת היא הוספת נכס חדש (או 'מאפיין' או 'שדה') לתכונות ב-FeatureCollection
. בדוגמה הבאה, הנכס החדש הוא חישוב שמבוסס על שני מאפיינים קיימים:
Code Editor (JavaScript)
// This function creates a new property that is the sum of two existing properties. var addField = function(feature) { var sum = ee.Number(feature.get('property1')).add(feature.get('property2')); return feature.set({'sum': sum}); }; // Create a FeatureCollection from a list of Features. var features = ee.FeatureCollection([ ee.Feature(ee.Geometry.Point(-122.4536, 37.7403), {property1: 100, property2: 100}), ee.Feature(ee.Geometry.Point(-118.2294, 34.039), {property1: 200, property2: 300}), ]); // Map the function over the collection. var featureCollection = features.map(addField); // Print a selected property of one Feature. print(featureCollection.first().get('sum')); // Print the entire FeatureCollection. print(featureCollection);
שימו לב להמרה ל-ee.Number
שנדרשת כדי שערכו של הנכס יזוהה כמספר, וכך יהיה אפשר להשתמש בשיטה add()
). אפשר לשנות את סוג האוסף באמצעות map()
. לדוגמה:
Code Editor (JavaScript)
// This function returns the image centroid as a new Feature. var getGeom = function(image) { return ee.Feature(image.geometry().centroid(), {foo: 1}); }; // Load a Landsat 8 TOA collection. var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') .filterBounds(ee.Geometry.Point(-122.262, 37.8719)) .filterDate('2014-06-01', '2014-10-01'); // Map the function over the ImageCollection. var featureCollection = ee.FeatureCollection(collection.map(getGeom)); // Print the collection. print(featureCollection);
שימו לב לנכס שנוסף (foo
) לכל מאפיין שנוצר ממרכז הכובד של התמונה. בשורה האחרונה, ההמרה מאפשרת לזהות את האוסף שנוצר בתור FeatureCollection
.
צמצום
צמצום הוא הדרך לצבור נתונים לאורך זמן, במרחב, בתחומים, במערכים ובמבנים אחרים של נתונים ב-Earth Engine. יש כמה שיטות לצורך זה ב-API. לדוגמה, כדי ליצור תמונה מורכבת של ImageCollection
, משתמשים ב-reduce()
כדי לצמצם את התמונות באוסף לתמונה אחת. דוגמה פשוטה היא יצירה של תמונה משולבת של חציון מחמש הסצנות עם הכי פחות עננים באוסף Landsat 8 שהוגדר קודם:
Code Editor (JavaScript)
// Load a Landsat 8 TOA collection. var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') // Filter by date and location. .filterBounds(ee.Geometry.Point(-122.262, 37.8719)) .filterDate('2014-01-01', '2014-12-31') // Sort by increasing cloudiness. .sort('CLOUD_COVER'); // Compute the median of each pixel for each band of the 5 least cloudy scenes. var median = collection.limit(5).reduce(ee.Reducer.median());
הפחתה היא גם הדרך לקבל נתונים סטטיסטיים של תמונה באזורים שמוגדרים על ידי Feature
או FeatureCollection
. נניח שהמשימה היא לחשב את ערכי הפיקסלים הממוצעים בתוך אזור עניין. לשם כך, צריך להשתמש ב-reduceRegion()
. לדוגמה:
Code Editor (JavaScript)
// Load and display a Landsat TOA image. var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318'); Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], max: 0.3}); // Create an arbitrary rectangle as a region and display it. var region = ee.Geometry.Rectangle(-122.2806, 37.1209, -122.0554, 37.2413); Map.addLayer(region); // Get a dictionary of means in the region. Keys are bandnames. var mean = image.reduceRegion({ reducer: ee.Reducer.mean(), geometry: region, scale: 30 });
מידע נוסף על reducers זמין במאמר על reducers.
מסקינג
לכל פיקסל ב-ee.Image
יש ערך ומסכה בטווח שבין 0 (אין נתונים) ל-1. פיקסלים עם מסכה (שבהם mask==0) נחשבים ללא נתונים. לפיקסלים עם 0 < mask ≤ 1 יש ערך, אבל הוא מקבל משקל לפי המסכה לצורך חישובים מספריים.
אפשר להפוך פיקסלים לשקופים או להחריג אותם מהניתוח באמצעות מסיכות. הפיקסלים מוסתרים כשערך המסכה הוא אפס. בהמשך לדוגמה של ההבדלים בין תמונות, אפשר להשתמש במסכה כדי להציג אזורים שבהם מדד NDVI עלה או ירד במהלך מרווח הזמן של ההבדלים:
// This function gets NDVI from Landsat 5 imagery. var getNDVI = function(image) { return image.normalizedDifference(['B4', 'B3']); }; // Load two Landsat 5 images, 20 years apart. var image1 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_19900604'); var image2 = ee.Image('LANDSAT/LT05/C02/T1_TOA/LT05_044034_20100611'); // Compute NDVI from the scenes. var ndvi1 = getNDVI(image1); var ndvi2 = getNDVI(image2); // Compute the difference in NDVI. var ndviDifference = ndvi2.subtract(ndvi1); // Load the land mask from the SRTM DEM. var landMask = ee.Image('CGIAR/SRTM90_V4').mask(); // Update the NDVI difference mask with the land mask. var maskedDifference = ndviDifference.updateMask(landMask); // Display the masked result. var vizParams = {min: -0.5, max: 0.5, palette: ['FF0000', 'FFFFFF', '0000FF']}; Map.setCenter(-122.2531, 37.6295, 9); Map.addLayer(maskedDifference, vizParams, 'NDVI difference');
בדוגמה הזו, שימו לב שהמסכה של ההפרש ב-NDVI מתעדכנת באמצעות מסכת היבשה עם updateMask()
. הפונקציה הזו מגדירה את המסכה של הפיקסלים של ההפרש ב-NDVI למסכת היבשה בכל מקום שבו המסכה של ההפרש ב-NDVI שונה מאפס.
אנו משתמשים בהסתרה גם כדי להחריג נתונים מהניתוח. אפשר להיעזר בדוגמה reduceRegion()
בקטע צמצום. נניח שהמשימה היא לחשב את הערך הממוצע העונתי של NDVI במחוז סנטה קלרה, קליפורניה, לא כולל פיקסלים מעוננים. בדוגמה הבאה מוצגים כמה מושגים: filtering, mapping, reducing והשימוש במסכה של ענן:
Code Editor (JavaScript)
// This function gets NDVI from a Landsat 8 image. var addNDVI = function(image) { return image.addBands(image.normalizedDifference(['B5', 'B4'])); }; // This function masks cloudy pixels. var cloudMask = function(image) { var clouds = ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud']); return image.updateMask(clouds.lt(10)); }; // Load a Landsat collection, map the NDVI and cloud masking functions over it. var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') .filterBounds(ee.Geometry.Point([-122.262, 37.8719])) .filterDate('2014-03-01', '2014-05-31') .map(addNDVI) .map(cloudMask); // Reduce the collection to the mean of each pixel and display. var meanImage = collection.reduce(ee.Reducer.mean()); var vizParams = {bands: ['B5_mean', 'B4_mean', 'B3_mean'], min: 0.02, max: 0.4}; Map.addLayer(meanImage, vizParams, 'mean'); // Load a region in which to compute the mean and display it. var counties = ee.FeatureCollection('TIGER/2018/Counties'); var santaClara = ee.Feature(counties.filter(ee.Filter.eq('NAME', 'Santa Clara')).first()); Map.addLayer(santaClara); // Get the mean of NDVI in the region. var mean = meanImage.select(['nd_mean']).reduceRegion({ reducer: ee.Reducer.mean(), geometry: santaClara.geometry(), scale: 30 }); // Print mean NDVI for the region. mean.get('nd_mean').evaluate(function(val){ print('Santa Clara spring mean NDVI:', val); });