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

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

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

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

יצירת תצוגה חזותית בסיסית

כדי להתחיל, מעתיקים את ההצהרות הבאות אל Code Editor:

Code Editor (JavaScript)

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

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

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

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

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

בדיקת ערכים

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

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

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

שכתוב קוד (Refactoring) לשיפור הקוד

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

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

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

Code Editor (JavaScript)

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

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

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

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

Code Editor (JavaScript)

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

Code Editor (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)) גורמת להגדרת האטימות/השקיפות של הפיקסלים על סמך ערך המופע.

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

אירועי שיטפון
איור 4. צילום מסך של מופעי מים בדלתא של נהר פרנה ליד בואנוס איירס, עם צבע אדום שקוף לנקודת הקצה של ערך המינימום (0%) וצבע כחול אטום לנקודת הקצה של ערך המקסימום.

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

יצירת שכבת סף

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

קודם נגדיר משתנה חדש להצגה חזותית VIS_WATER_MASK שיכיל את פרטי הסגנון של מסכת המים:

Code Editor (JavaScript)

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

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

Code Editor (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 אחרת.

Code Editor (JavaScript)

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

נסיעה למקומות מעניינים בעולם

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

Code Editor (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

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

Refactoring, again...

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

הנה הסקריפט הסופי אחרי שכתוב הקוד:

Code Editor (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
});

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