لایه انتقال آب تغییرات بین سه طبقه وقوع آب (نه آب، آب فصلی و آب دائمی) را به همراه دو کلاس اضافی برای آب زودگذر (دوام زودگذر و فصلی زودگذر) ثبت میکند.
این بخش از آموزش به شرح زیر خواهد بود:
- یک لایه نقشه برای تجسم انتقال آب اضافه کنید،
- یک کاهنده گروه بندی شده برای جمع مساحت هر کلاس انتقال در یک منطقه مورد علاقه خاص ایجاد کنید، و
- نموداری ایجاد کنید که منطقه را بر اساس کلاس انتقال خلاصه می کند.
تجسم اولیه
در بخش Asset List از اسکریپت، عبارت زیر را اضافه کنید که یک شیء تصویر باندی به نام transition
ایجاد می کند:
ویرایشگر کد (جاوا اسکریپت)
var transition = gsw.select('transition');
تصاویر GSW حاوی ابرداده در اعداد و نامهای کلاس انتقال و یک پالت پیشفرض برای استایلسازی کلاسهای انتقال است. هنگامی که لایه انتقال به نقشه اضافه می شود، این پارامترهای تجسم به طور خودکار استفاده می شوند.
در پایین بخش Map Layers اسکریپت خود، عبارت زیر را اضافه کنید که یک لایه نقشه جدید اضافه می کند که کلاس های انتقال را نمایش می دهد:
ویرایشگر کد (جاوا اسکریپت)
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 | فصلی را از دست داد | |
7 | فصلی تا دائمی | |
8 | دائمی تا فصلی | |
9 | دائمی زودگذر | |
10 | فصلی زودگذر |
خلاصه کردن منطقه بر اساس کلاس انتقال
در این بخش یک بار دیگر از ابزار هندسه چند ضلعی برای تعریف منطقه مورد علاقه استفاده خواهیم کرد. اگر میخواهید یک مکان جدید را تجزیه و تحلیل کنید، ابتدا باید چند ضلعی اصلی را که ترسیم کردهاید انتخاب و حذف کنید تا از مناطق ترکیبی نتیجه نگیرید. بخش ابزارهای هندسه اسناد ویرایشگر کد را از اطلاعات نحوه اصلاح هندسه ها ببینید.
برای این مثال یک چند ضلعی جدید در دلتای رودخانه مکونگ ترسیم می کنیم.

برای محاسبه مساحت تحت پوشش بخشهایی از یک تصویر، یک نوار اضافی به شی تصویر انتقالی اضافه میکنیم که اندازه هر پیکسل را بر حسب متر مربع با استفاده از روش ee.Image.pixelArea مشخص میکند.
ویرایشگر کد (جاوا اسکریپت)
var area_image_with_transition_class = ee.Image.pixelArea().addBands(transition);
شی تصویر حاصل ( area_image_with_transition_class
) یک تصویر دو باندی است که باند اول حاوی اطلاعات مساحت بر حسب واحد متر مربع است (تولید شده با روش ee.Image.pixelArea
code> )، و باند دوم حاوی اطلاعات کلاس انتقال است.
سپس با استفاده از روش ee.Image.reduceRegion
و یک کاهنده گروهبندی که برای جمعبندی منطقه در هر کلاس انتقال عمل میکند، انتقالهای کلاس در یک منطقه مورد علاقه ( roi
) را خلاصه میکنیم:
ویرایشگر کد (جاوا اسکریپت)
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
حاوی اطلاعاتی در مورد ناحیه تحت پوشش هر کلاس انتقال است، خواندن آن به خصوص آسان نیست. در بخش بعدی مشاهده نتایج را آسان تر خواهیم کرد.
ایجاد یک نمودار خلاصه
در این بخش نموداری برای خلاصه کردن بهتر نتایج ایجاد می کنیم. برای شروع، ابتدا لیستی از کلاس های انتقال را با مناطق به شرح زیر استخراج می کنیم:
ویرایشگر کد (جاوا اسکریپت)
var roi_stats = ee.List(reduction_results.get('groups'));
نتیجه کاهنده گروه بندی شده ( reduction_results
) یک فرهنگ لغت حاوی لیستی از فرهنگ لغت است. برای هر کلاس انتقال یک فرهنگ لغت در لیست وجود دارد. این عبارات از روش ee.Dictionary.get برای استخراج نتایج کاهنده گروهبندی شده از آن فرهنگ لغت استفاده میکنند و نتایج را به یک نوع داده ee.List میفرستند تا بتوانیم به دیکشنریهای جداگانه دسترسی داشته باشیم.
به منظور استفاده از توابع نموداری ویرایشگر کد ، یک FeatureCollection می سازیم که حاوی اطلاعات لازم است. برای انجام این کار ابتدا دو دیکشنری جستجو و دو تابع کمکی ایجاد می کنیم. کدی که دیکشنری های جستجو را ایجاد می کند را می توان در بالای بخش "محاسبات" به صورت زیر قرار داد:
ویرایشگر کد (جاوا اسکریپت)
////////////////////////////////////////////////////////////// // 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
مقادیر کلاس انتقال را با تعاریف رنگ مرتبط می کند.
دو تابع کمکی را می توان در بخش کد جدیدی به نام "توابع کمکی" قرار داد. ویرایشگر کد (جاوا اسکریپت)
//////////////////////////////////////////////////////////////
// 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
یک دیکشنری (شامل ناحیه و کلاس انتقال آب) می گیرد و یک ویژگی مناسب برای ترسیم نمودار برمی گرداند. تابع createPieChartSliceDictionary
با استفاده از قالب مورد انتظار نمودار دایره ای، فهرستی از رنگ ها را ایجاد می کند که با کلاس های انتقال مطابقت دارند.
در مرحله بعد، ما تابع createFeature
را بر روی هر فرهنگ لغت در لیست اعمال می کنیم ( roi_stats
)، با استفاده از ee.List.map برای اعمال تابع کمکی به هر عنصر از لیست.
ویرایشگر کد (جاوا اسکریپت)
var transition_fc = ee.FeatureCollection(roi_stats.map(createFeature)); print('transition_fc', transition_fc);
اکنون که یک FeatureCollection حاوی ویژگیهایی داریم که میخواهیم در نمودار نمایش دهیم، میتوانیم یک شی نمودار ایجاد کنیم و آن را در کنسول چاپ کنیم.
ویرایشگر کد (جاوا اسکریپت)
// 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 باشد.

اسکریپت نهایی
کل اسکریپت این بخش به شرح زیر است:
ویرایشگر کد (جاوا اسکریپت)
////////////////////////////////////////////////////////////// // 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)', });
این آموزش در مورد مجموعه داده های آب سطحی جهانی به پایان می رسد. توجه داشته باشید که این آموزش نحوه کار با تنها سه لایه داده (وقوع، شدت تغییر و انتقال) را که در مجموعه داده های آب سطحی جهانی موجود است، نشان داده است. میتوانید در مورد سایر لایههای داده موجود در راهنمای کاربران داده (v2) مطالعه کنید.
تجزیه و تحلیل مبارک!