אירוע שיטפון (1984-2015)

מערך הנתונים GSW מכיל שכבות רבות של נתונים שמציגות את נתוני המים העיליים בדרכים שונות. נתחיל בהצגה חזותית של שכבת המים, שמספקת סיכום של המקומות שבהם היו מים על פני השטח, ובאיזו תדירות, לאורך כל התקופה שבין מרץ 1984 לאוקטובר 2015.

בקטע הזה של המדריך נסביר:

  1. להוסיף שכבת מפה להמחשת התרחשות של מים עיליים,
  2. להראות איך לשלוח שאילתה לגבי ערכים של שכבת המפה,
  3. להוסיף עיצוב בהתאמה אישית כדי לשפר את התצוגה החזותית,
  4. ליצור שכבת מסכת מים בינארית באמצעות ערך סף,
  5. למרכז את המפה בחלקים מעניינים בעולם, וגם
  6. תראה לי איך לשנות את הסקריפט כדי שיהיה קריא וקל יותר לתחזוקה.

יצירת תרשים בסיסי

מתחילים בהעתקת ההצהרות הבאות אל עורך הקוד:

עורך הקוד (JavaScript)

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');
Map.addLayer(occurrence);

ההצהרה הראשונה מתייחסת לאובייקט התמונה של Earth Engine עבור מערך הנתונים GSW, ו מאחסנת אותו במשתנה בשם gsw. ההצהרה השנייה בוחרת שכבה אחת של מערך הנתונים GSW ומאחסנת אותה במשתנה שנקרא occurrence. ההצהרה השלישית מוסיפה את תמונת המקרה למפה האינטראקטיבית של עורך הקוד.

לוחצים על הלחצן 'הפעלה' בכלי לעריכת קוד, ואחרי כמה שניות אמורה להופיע מפה עם צבע אפור לאורך קו החוף, בדומה לאיור 1.

המחשה שמוגדרת כברירת מחדל
איור 1. תצוגה חזותית של שכבת הנתונים של התרחשות מים עיליים גלובלית.

ברוב האזורים, מערך הנתונים של GSW נראה שקוף, כי מיקומים שבהם לא נאספו תמונות Landsat (כלומר אזורים באוקיינוס) או שבהם לא זוהו מים באף אחת מהתצפיות ב-32 השנים האחרונות מוסתרים.

בדיקת ערכים

כדי לבדוק את הערכים של שכבת המים, נשתמש בכרטיסיית הבדיקה של עורך הקוד. קודם לוחצים על הכרטיסייה של כלי הבדיקה, ואז לוחצים על המפה כדי לבחור מיקום. בכרטיסייה 'כלי הבדיקה' יוצג מידע על כל אחת מהשכבות שמוצגות במקום שבו לחצתם.

כרטיסיית כלי הבדיקה
איור 2. פלט לדוגמה של הכרטיסייה Inspector.

בדוגמה שלמעלה, הערך של השכבה שנקראת value הוא 98. היחידות הן נקודות אחוז, כך שבערך ב-98% מהזמן המיקום סווג כמיקום מכוסה במים. הערך הוא הממוצע של כל הערכים החודשיים של הימצאות מים על פני השטח, שמנורמל ביחס לשינויים עונתיים, כפי שמתואר ב מדריך למשתמשי נתונים (גרסה 2) .

שיפור הקוד באמצעות רפקטורינג

הסקריפט שלנו מכיל רק שתי הצהרות, אבל כבר עכשיו יש לנו הזדמנות לבצע רפקטורינג של הקוד כדי שהסקריפט הסופי יהיה קל יותר לקריאה ולתחזוקה לאורך זמן. בשלב הזה, הפקודה Map.addLayer() מעבירה ארגומנט יחיד occurrence, שהוא אובייקט התמונה של Earth Engine שאנחנו רוצים להציג במפה. עם זאת, השיטה Map.addLayer() מאפשרת גם להעביר אליה ארגומנטים נוספים. כדי לראות במהירות אילו ארגומנטים זמינים, מציבים את הסמן אחרי הסוגריים הפותחים ולוחצים על מקש הקיצור 'הצגת הצעות לקוד' כדי להציג את מסמך העזרה של השיטה addLayer. (כדי לראות את מקשי הקיצור, בוחרים בתפריט עזרה -> קיצורי דרך).

הארגומנטים של Map.addLayer
איור 3. צילום מסך שבו מוצגים הארגומנטים של השיטה addLayer.

מקשי הקיצור מראים שיש חמישה ארגומנטים שאפשר להעביר אל Map.addLayer: eeObject,‏ visParams,‏ name,‏ shown ו-opacity. בסקריפט הנוכחי אנחנו מעבירים משתנה יחיד occurrence שמתפרש כארגומנט הראשון, eeObject. כדי להעביר גם את אובייקט המשתנה וגם ארגומנט נוסף שכולל את שם השכבה, אפשר לשנות את הקוד כך שישתמש ב'ארגומנטים עם שם' (eeObject ו-name) שמועברים לשיטה מתוך מבנה נתונים בפורמט JSON , כמו בדוגמה הבאה:

עורך הקוד (JavaScript)

Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});

מריצים את הקוד שוב כדי לוודא שהוא עדיין פועל אחרי שינויי הרפקטורינג. המפה שמתקבלת לא אמורה להשתנות.

הוספת פרמטרים של תצוגה חזותית

לאחר מכן, נשפר את פרמטרי ההדמיה שמוגדרים כברירת מחדל, שגורמים למים להופיע באפור. מוסיפים הצהרה חדשה שיוצרת משתנה VIS_OCCURRENCE ומעבירים אותו כארגומנט נוסף לשיטה addLayer.

עורך הקוד (JavaScript)

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};

עורך הקוד (JavaScript)

Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

פרמטרים של ויזואליזציה שמאוחסנים במבנה JSON ‏VIS_OCCURRENCE מציינים שצריך להשתמש בצבע אדום לערך מינימלי של 0% ובצבע כחול לערך מקסימלי של 100%. הוספת .updateMask(occurrence.divide(100)) גורמת לכך שרמת האטימות או השקיפות של הפיקסלים מוגדרת על סמך ערך המופע.

מריצים את הסקריפט שוב וצופים בתוצאות המתוקנות של שינויי הסגנון.

Surface Water Occurrence
איור 4. צילום מסך של נתוני התרחשות מים בדלתא של נהר פרנה ליד בואנוס איירס, עם נקודת קצה של ערך מינימלי של 0% בצבע אדום שקוף ונקודת קצה של ערך מקסימלי בצבע כחול אחיד.

אזורי המים הם עכשיו כחולים! התקדמות!

יצירת שכבת סף

תמונת המידע על תדירות המים מכילה מידע על התדירות הצפויה של מים, באמצעות טווח ערכים מ-0 עד 100%. עם זאת, לעיתים קרובות כדאי להגדיר שכבת מים בינארית (כלומר, 'מים' לעומת 'לא מים') על סמך אחוז מסוים של התרחשות (כלומר, ערך סף). נשתמש בשכבה הבינארית הפשוטה הזו כשכבת רקע נקייה שמעליה אפשר להציב שכבות GSW אחרות. אפשר ליצור את שכבת הסף הזו באמצעות ההצהרות הבאות, שבהן נעשה שימוש בערך סף של 90% כדי להפריד בין מים לבין לא-מים.

קודם מגדירים משתנה חדש של רכיב חזותי VIS_WATER_MASK כדי להכיל מידע על הסגנון של מסכת המים:

עורך הקוד (JavaScript)

var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

לאחר מכן אנחנו מחשבים שכבת מסכת מים באמצעות אופרטור ההשוואה 'גדול מ' .gt(90), ואז מגדירים את האזורים שהוסתרו קודם לאפס באמצעות השיטה .unmask():

עורך הקוד (JavaScript)

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

ולבסוף, מוסיפים את השכבה למפה. כדי שהשכבה הזו תוצג מתחת לכל השכבות האחרות, צריך למקם את ההצהרה הבאה לפני כל הצהרה אחרת של Map.addLayer.

עורך הקוד (JavaScript)

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask'
});
90% water mask
איור 5. צילום מסך של מסכת מים בשיעור 90% בדלתא של נהר פרנה ליד בואנוס איירס.

מעבר לחלקים מעניינים בעולם

כיף להזיז את המפה ולשנות את הזום כדי לגלות את העולם, אבל העולם גדול ולפעמים כדאי לעבור ישירות למיקום מסוים. ריכזנו כאן סדרה של הצהרות שמספקות דוגמה קטנה של מיקומים מעניינים, מבחינת מים עיליים. פשוט מבטלים את ההערה של אחת מההצהרות בכל פעם, והסקריפט יפנה למיקום הזה כשהוא יופעל.

עורך הקוד (JavaScript)

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

זו רק דוגמה קטנה של מיקומים מעניינים. אתם מוזמנים להוסיף משלכם!

שוב מתבצע רפקטורינג...

לפני שנעבור לשכבה הבאה של מערך הנתונים של GSW, נבצע עוד קצת רפקטורינג של הקוד. במיוחד, נקבץ את ההצהרות הדומות שלנו יחד, ונוסיף כמה הערות שיחלקו את הקוד שלנו לקטעים של נכסים, קבועים, חישובים, מרכוז המפה והוספת שכבות מפה.

הנה הסקריפט הסופי אחרי השינוי:

עורך הקוד (JavaScript)

//////////////////////////////////////////////////////////////
// Asset List
//////////////////////////////////////////////////////////////

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');

//////////////////////////////////////////////////////////////
// Constants
//////////////////////////////////////////////////////////////

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};
var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

//////////////////////////////////////////////////////////////
// Calculations
//////////////////////////////////////////////////////////////

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

//////////////////////////////////////////////////////////////
// Initialize Map Location
//////////////////////////////////////////////////////////////

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

//////////////////////////////////////////////////////////////
// Map Layers
//////////////////////////////////////////////////////////////

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask',
  shown: false
});
Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

בקטע הבא נבדוק איך השתנה עם הזמן המיקום של מקורות המים.