שכבת המעבר של המים מתעדת שינויים בין שלושה סוגים של מים (לא מים, מים עונתיים ומים קבועים), יחד עם שני סוגים נוספים של מים זמניים (זמניים קבועים וזמניים עונתיים).
בקטע הזה של המדריך נסביר:
- להוסיף שכבת מפה להמחשת מעבר המים,
- ליצור פונקציית צמצום מקובצת לסיכום השטח של כל סיווג מעבר באזור מוגדר, ו
- ליצור תרשים שמסכם את האזור לפי סוג המעבר.
תרשים להמחשה בסיסי
בקטע Asset List (רשימת נכסים) של הסקריפט, מוסיפים את ההצהרה הבאה שיוצרת
אובייקט תמונה של פס יחיד בשם transition
:
עורך הקוד (JavaScript)
var transition = gsw.select('transition');
התמונות של GSW מכילות מטא-נתונים על מספרי השכבות ושמותיהן, ופלטת ברירת מחדל לעיצוב השכבות. כשמוסיפים את שכבת המעבר למפה, נעשה שימוש אוטומטי בפרמטרים האלה של ההדמיה.
בתחתית הקטע Map Layers (שכבות מפה) בתסריט, מוסיפים את ההצהרה הבאה שמוסיפה שכבת מפה חדשה שמציגה את סוגי המעברים:
עורך הקוד (JavaScript)
Map.setCenter(105.26, 11.2134, 9); // Mekong River Basin, SouthEast Asia Map.addLayer({ eeObject: transition, name: 'Transition classes (1984-2015)', });
כשמריצים את הסקריפט, מוצגת שכבת המעבר.

מקש המפה של מחלקות המעבר הוא:
ערך | סמל | תווית |
---|---|---|
0 | לא מים | |
1 | קבוע | |
2 | חדש קבוע | |
3 | הפריט אבד באופן סופי | |
4 | עונתי | |
5 | עונתיות חדשה | |
6 | Lost seasonal | |
7 | מעונתי לקבוע | |
8 | קבוע לעונתי | |
9 | קבוע זמני | |
10 | זמני ורלוונטי לתקופה בשנה |
סיכום של אזור לפי סיווג מעבר
בקטע הזה נשתמש שוב בכלי של פוליגון גיאומטרי כדי להגדיר אזור שמעניין אותנו. אם רוצים לנתח מיקום חדש, קודם צריך לבחור את הפוליגון המקורי שציירתם ולמחוק אותו, כדי שלא יתקבלו תוצאות מהאזורים המשולבים. הסבר על שינוי גיאומטריות מופיע בקטע Geometry tools במסמכי Code Editor.
בדוגמה הזו נצייר מצולע חדש בדלתא של נהר המקונג.

כדי לחשב את השטח שמכוסה על ידי חלקים בתמונה, נוסיף פס נוסף לאובייקט של תמונת המעבר שמזהה את הגודל של כל פיקסל במטרים רבועים באמצעות השיטה ee.Image.pixelArea.
עורך הקוד (JavaScript)
var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition);
אובייקט התמונה שמתקבל (area_image_with_transition_class
) הוא תמונה עם שני פסים, שבה הפס הראשון מכיל את פרטי האזור ביחידות של מטרים רבועים (נוצר על ידי השיטה
ee.Image.pixelArea
code>
), והפס השני מכיל את פרטי סיווג המעבר.
לאחר מכן אנחנו מסכמים את המעברים בין הסיווגים באזור העניין (roi
) באמצעות השיטה
ee.Image.reduceRegion
ו
grouped reducer שפועל לסיכום השטח בכל סיווג מעבר:
עורך הקוד (JavaScript)
var reduction_results = area_image_with_transition_class.reduceRegion({ reducer: ee.Reducer.sum().group({ groupField: 1, groupName: 'transition_class_value', }), geometry: roi, scale: 30, bestEffort: true, }); print('reduction_results', reduction_results);
עכשיו הפלט של כרטיסיית המסוף מציג את reduction_results
. שימו לב שתצטרכו להרחיב את העץ כמה רמות כדי לראות את נתוני הסיכום של האזור.

אובייקט reduction_results
מכיל מידע על האזור שכל מחלקת מעבר מכסה, אבל לא קל לקרוא אותו. בקטע הבא
נציג את התוצאות בצורה ברורה יותר.
יצירת תרשים סיכום
בקטע הזה ניצור תרשים כדי לסכם את התוצאות בצורה טובה יותר. כדי להתחיל, אנחנו קודם מוציאים את רשימת הכיתות המועברות עם האזורים באופן הבא:
עורך הקוד (JavaScript)
var roi_stats = ee.List(reduction_results.get('groups'));
התוצאה של הפונקציה לצמצום קבוצות (reduction_results
) היא מילון שמכיל רשימה של מילונים.
ברשימה יש מילון אחד לכל מחלקת מעברים.
ההצהרות האלה משתמשות בשיטה
ee.Dictionary.get
כדי לחלץ את תוצאות ה-reducer המקובצות מהמילון הזה, ומבצעות המרה של התוצאות לסוג הנתונים ee.List, כדי שנוכל לגשת למילונים הנפרדים.
כדי להשתמש בפונקציות של עריכת תרשימים בכלי לעריכת קוד, ניצור FeatureCollection שמכיל את המידע הנדרש. כדי לעשות את זה, קודם יוצרים שני מילונים של חיפוש ושתי פונקציות עזר. אפשר למקם את הקוד שיוצר את מילוני החיפוש בחלק העליון של הקטע Calculations (חישובים) באופן הבא:
עורך הקוד (JavaScript)
////////////////////////////////////////////////////////////// // Calculations ////////////////////////////////////////////////////////////// // Create a dictionary for looking up names of transition classes. var lookup_names = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_names') ); // Create a dictionary for looking up colors of transition classes. var lookup_palette = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_palette') );
המילון lookup_names
משייך את ערכי מחלקת המעבר לשמות שלהם, והמילון lookup_palette
משייך את ערכי מחלקת המעבר להגדרות הצבע.
אפשר למקם את שתי פונקציות העזר בקטע קוד חדש שנקרא 'פונקציות עזר'.
עורך הקוד (JavaScript)
////////////////////////////////////////////////////////////// // Helper functions ////////////////////////////////////////////////////////////// // Create a feature for a transition class that includes the area covered. function createFeature(transition_class_stats) { transition_class_stats = ee.Dictionary(transition_class_stats); var class_number = transition_class_stats.get('transition_class_value'); var result = { transition_class_number: class_number, transition_class_name: lookup_names.get(class_number), transition_class_palette: lookup_palette.get(class_number), area_m2: transition_class_stats.get('sum') }; return ee.Feature(null, result); // Creates a feature without a geometry. } // Create a JSON dictionary that defines piechart colors based on the // transition class palette. // https://developers.google.com/chart/interactive/docs/gallery/piechart function createPieChartSliceDictionary(fc) { return ee.List(fc.aggregate_array("transition_class_palette")) .map(function(p) { return {'color': p}; }).getInfo(); } // Convert a number to a string. Used for constructing dictionary key lists // from computed number objects. function numToString(num) { return ee.Number(num).format(); }
הפונקציה createFeature
מקבלת מילון (שמכיל את האזור ואת
הסיווג של המעבר בין גופי מים) ומחזירה אובייקט Feature שמתאים לתרשים.
הפונקציה createPieChartSliceDictionary
יוצרת רשימה של צבעים שתואמים לסוגי המעבר, בפורמט שנדרש לתרשים העוגה.
לאחר מכן, נחיל את הפונקציה createFeature
על כל מילון ברשימה (roi_stats
), באמצעות ee.List.map כדי להחיל את פונקציית העזר על כל רכיב ברשימה.
עורך הקוד (JavaScript)
var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature)); print('transition_fc', transition_fc);
אחרי שיש לנו FeatureCollection שמכיל את המאפיינים שאנחנו רוצים להציג בתרשים, אנחנו יכולים ליצור אובייקט של תרשים ולהדפיס אותו במסוף.
עורך הקוד (JavaScript)
// Add a summary chart. var transition_summary_chart = ui.Chart.feature.byFeature({ features: transition_fc, xProperty: 'transition_class_name', yProperties: ['area_m2', 'transition_class_number'] }) .setChartType('PieChart') .setOptions({ title: 'Summary of transition class areas', slices: createPieChartSliceDictionary(transition_fc), sliceVisibilityThreshold: 0 // Don't group small slices. }); print(transition_summary_chart);
האפשרות slices
צובעת את הפלחים בתרשים העוגה כך שיוצגו באמצעות לוח הצבעים שמוגדר כברירת מחדל עבור מחלקות המעבר (מוצג קודם בטבלת מקרא המפה).
האפשרות sliceVisibilityThreshold
מונעת קיבוץ של פרוסות קטנות לקטגוריה 'אחר'.
התרשים שיתקבל צריך להיות דומה לתרשים שמוצג באיור 13.

הסקריפט הסופי
התסריט המלא של הקטע הזה הוא:
עורך הקוד (JavaScript)
////////////////////////////////////////////////////////////// // Asset List ////////////////////////////////////////////////////////////// var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater'); var occurrence = gsw.select('occurrence'); var change = gsw.select("change_abs"); var transition = gsw.select('transition'); var roi = ee.Geometry.Polygon( [[[105.531921, 10.412183], [105.652770, 10.285193], [105.949401, 10.520218], [105.809326, 10.666006]]]); ////////////////////////////////////////////////////////////// // Constants ////////////////////////////////////////////////////////////// var VIS_OCCURRENCE = { min: 0, max: 100, palette: ['red', 'blue'] }; var VIS_CHANGE = { min: -50, max: 50, palette: ['red', 'black', 'limegreen'] }; var VIS_WATER_MASK = { palette: ['white', 'black'] }; ////////////////////////////////////////////////////////////// // Helper functions ////////////////////////////////////////////////////////////// // Create a feature for a transition class that includes the area covered. function createFeature(transition_class_stats) { transition_class_stats = ee.Dictionary(transition_class_stats); var class_number = transition_class_stats.get('transition_class_value'); var result = { transition_class_number: class_number, transition_class_name: lookup_names.get(class_number), transition_class_palette: lookup_palette.get(class_number), area_m2: transition_class_stats.get('sum') }; return ee.Feature(null, result); // Creates a feature without a geometry. } // Create a JSON dictionary that defines piechart colors based on the // transition class palette. // https://developers.google.com/chart/interactive/docs/gallery/piechart function createPieChartSliceDictionary(fc) { return ee.List(fc.aggregate_array("transition_class_palette")) .map(function(p) { return {'color': p}; }).getInfo(); } // Convert a number to a string. Used for constructing dictionary key lists // from computed number objects. function numToString(num) { return ee.Number(num).format(); } ////////////////////////////////////////////////////////////// // Calculations ////////////////////////////////////////////////////////////// // Create a dictionary for looking up names of transition classes. var lookup_names = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_names') ); // Create a dictionary for looking up colors of transition classes. var lookup_palette = ee.Dictionary.fromLists( ee.List(gsw.get('transition_class_values')).map(numToString), gsw.get('transition_class_palette') ); // Create a water mask layer, and set the image mask so that non-water areas // are transparent. var water_mask = occurrence.gt(90).mask(1); // Generate a histogram object and print it to the console tab. var histogram = ui.Chart.image.histogram({ image: change, region: roi, scale: 30, minBucketWidth: 10 }); histogram.setOptions({ title: 'Histogram of surface water change intensity.' }); print(histogram); // Summarize transition classes in a region of interest. var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition); var reduction_results = area_image_with_transition_class.reduceRegion({ reducer: ee.Reducer.sum().group({ groupField: 1, groupName: 'transition_class_value', }), geometry: roi, scale: 30, bestEffort: true, }); print('reduction_results', reduction_results); var roi_stats = ee.List(reduction_results.get('groups')); var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature)); print('transition_fc', transition_fc); // Add a summary chart. var transition_summary_chart = ui.Chart.feature.byFeature({ features: transition_fc, xProperty: 'transition_class_name', yProperties: ['area_m2', 'transition_class_number'] }) .setChartType('PieChart') .setOptions({ title: 'Summary of transition class areas', slices: createPieChartSliceDictionary(transition_fc), sliceVisibilityThreshold: 0 // Don't group small slices. }); print(transition_summary_chart); ////////////////////////////////////////////////////////////// // Initialize Map Location ////////////////////////////////////////////////////////////// // Uncomment one of the following statements to center the map on // a particular location. // 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, shown: false }); Map.addLayer({ eeObject: change, visParams: VIS_CHANGE, name: 'occurrence change intensity', shown: false }); Map.addLayer({ eeObject: transition, name: 'Transition classes (1984-2015)', });
כאן מסתיים המדריך בנושא מערך הנתונים של מי תהום גלובליים. הערה: במדריך הזה הראינו איך לעבוד רק עם שלוש משכבות הנתונים (occurrence, change intensity, and transition) שזמינות במערך הנתונים Global Surface Water. אפשר לקרוא על שכבות הנתונים האחרות שזמינות ב מדריך למשתמשי נתונים (גרסה 2).
בהצלחה בהמשך הדרך!