تصاویری که یک ImageCollection را تشکیل میدهند میتوانند بهصورت پویانمایی یا مجموعهای از تصاویر کوچک که «نوار فیلم» نامیده میشوند، تجسم شوند. این روشها ارزیابی سریع محتویات یک ImageCollection و رسانهای مؤثر برای مشاهده تغییرات فضایی-زمانی را فراهم میکنند (شکل ۱).
getVideoThumbURL()مجموعهای از تصاویر پویانماییشده تولید میکندgetFilmstripThumbURL()مجموعهای از ریزعکسها را تولید میکند
بخشهای زیر نحوه آمادهسازی ImageCollection را برای
دیداریسازی شرح میدهند، کد نمونه برای هر روش دیداریسازی مجموعه ارائه میدهند،
و چندین تکنیک پویانمایی پیشرفته را پوشش میدهند.

شکل ۱. پویانمایی نشاندهنده پیشرفت سهروزه طوفانهای اقیانوس اطلس در سپتامبر ۲۰۱۷.
آمادهسازی مجموعه
تصاویر را در یک مجموعه فیلتر، ترکیب، مرتبسازی و سبکبندی کنید تا فقط تصاویر موردعلاقه نمایش داده شوند یا پدیدهای برجسته شود. هر ImageCollection را میتوان بهعنوان ورودی برای توابع تجسم ارائه کرد، اما مجموعهای منتخب با درنظر گرفتن محدودههای تاریخ بینسالی و درونسالی، فاصله مشاهده، گستره منطقهای، کیفیت، و نمایش میتواند نتایج بهتری بهدست آورد.
فیلتر کردن
مجموعه تصویر را فیلتر کنید تا فقط دادههای مربوطی را که از هدف مصورسازی پشتیبانی میکند دربرگیرد. تاریخها، گستره فضایی، کیفیت، و سایر ویژگیهای مختص مجموعه دادههای خاص را درنظر بگیرید.
برای مثال، مجموعه بازتاب سطحی Sentinel-2 را براساس موارد زیر فیلتر کنید:
یک محدوده تاریخ،
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') .filterDate('2018-01-01', '2019-01-01');
محدوده روز سال سریالی،
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') .filter(ee.Filter.calendarRange(171, 242, 'day_of_year'));
منطقه موردعلاقه،
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') .filterBounds(ee.Geometry.Point(-122.1, 37.2));
یا ویژگی تصویر.
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 50));
چند فیلتر را زنجیرهای کنید.
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') .filterDate('2018-01-01', '2019-01-01') .filterBounds(ee.Geometry.Point(-122.1, 37.2)) .filter('CLOUDY_PIXEL_PERCENTAGE < 50');
ترکیب کردن
محدودههای تاریخ درونسالی و میانسالی را ترکیب کنید تا تعداد تصاویر در مجموعه کاهش یابد و کیفیت بهبود یابد. برای مثال، فرض کنید میخواهید تصویرسازی NDVI سالانه را برای آفریقا ایجاد کنید. یک گزینه این است که بهسادگی یک مجموعه NDVI ۱۶ روزه MODIS را فیلتر کنید تا همه مشاهدات سال ۲۰۱۸ را شامل شود.
ویرایشگر کد (جاوا اسکریپت)
var ndviCol = ee.ImageCollection('MODIS/061/MOD13A2') .filterDate('2018-01-01', '2019-01-01') .select('NDVI');
ترکیب بینسالانه با فیلتر و کاهش
تجسم مجموعه بالا نوفه قابلتوجهی را در مناطق جنگلی که پوشش ابری سنگین است نشان میدهد (شکل ۲الف). با کاهش دادن محدودههای تاریخ سریالی براساس میانه در همه سالهای مجموعه MODIS، میتوان به نمایش بهتری دست یافت.
ویرایشگر کد (جاوا اسکریپت)
// Make a day-of-year sequence from 1 to 365 with a 16-day step. var doyList = ee.List.sequence(1, 365, 16); // Import a MODIS NDVI collection. var ndviCol = ee.ImageCollection('MODIS/061/MOD13A2').select('NDVI'); // Map over the list of days to build a list of image composites. var ndviCompList = doyList.map(function(startDoy) { // Ensure that startDoy is a number. startDoy = ee.Number(startDoy); // Filter images by date range; starting with the current startDate and // ending 15 days later. Reduce the resulting image collection by median. return ndviCol .filter(ee.Filter.calendarRange(startDoy, startDoy.add(15), 'day_of_year')) .reduce(ee.Reducer.median()); }); // Convert the image List to an ImageCollection. var ndviCompCol = ee.ImageCollection.fromImages(ndviCompList);
پویانمایی حاصل از این مجموعه نویز کمتری دارد، زیرا هر تصویر نشاندهنده میانه ترکیب NDVI ۱۶ روزه برای بیشاز ۲۰ سال داده است (شکل ۱ب). برای اطلاعات بیشتر درباره این پویانمایی، این آموزش گامبهگام را ببینید.
![]() |
![]() |
|---|---|
| شکل ۲الف. NDVI سالانه بدون ترکیببندی بینسالانه. | شکل ۲ب. NDVI سالانه با ترکیببندی بینسالانه. |
ترکیب درونسالی با فیلتر و کاهش
مثال قبلی ترکیببندی بینسالانه را اعمال میکند. همچنین ترکیب کردن مجموعهای از مشاهدات درونسالی میتواند مفید باشد. برای مثال، دادههای Landsat هر شانزده روز یکبار برای صحنهای مشخص در هر حسگر جمعآوری میشود، اما اغلب بخشی از تصاویر با ابر پوشانده شده است. با پوشاندن ابرها و ترکیب کردن چند تصویر از یک فصل میتوان تصویری با ابرهای کمتر تولید کرد. مثال زیر را درنظر بگیرید که در آن تصاویر Landsat 5 مربوط به ژوئیه و اوت بااستفاده از میانه برای هر سال از ۱۹۸۵ تا ۲۰۱۱ ترکیب شدهاند.
ویرایشگر کد (جاوا اسکریپت)
// Assemble a collection of Landsat surface reflectance images for a given // region and day-of-year range. var lsCol = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2') .filterBounds(ee.Geometry.Point(-122.9, 43.6)) .filter(ee.Filter.dayOfYear(182, 243)) // Add the observation year as a property to each image. .map(function(img) { return img.set('year', ee.Image(img).date().get('year')); }); // Define a function to scale the data and mask unwanted pixels. function maskL457sr(image) { // Bit 0 - Fill // Bit 1 - Dilated Cloud // Bit 2 - Unused // Bit 3 - Cloud // Bit 4 - Cloud Shadow var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0); var saturationMask = image.select('QA_RADSAT').eq(0); // Apply the scaling factors to the appropriate bands. var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2); var thermalBand = image.select('ST_B6').multiply(0.00341802).add(149.0); // Replace the original bands with the scaled ones and apply the masks. return image.addBands(opticalBands, null, true) .addBands(thermalBand, null, true) .updateMask(qaMask) .updateMask(saturationMask); } // Define a list of unique observation years from the image collection. var years = ee.List(lsCol.aggregate_array('year')).distinct().sort(); // Map over the list of years to build a list of annual image composites. var lsCompList = years.map(function(year) { return lsCol // Filter image collection by year. .filterMetadata('year', 'equals', year) // Apply cloud mask. .map(maskL457sr) // Reduce image collection by median. .reduce(ee.Reducer.median()) // Set composite year as an image property. .set('year', year); }); // Convert the image List to an ImageCollection. var lsCompCol = ee.ImageCollection.fromImages(lsCompList);
ترکیب درونسالی با پیوستن و کاهش دادن
توجه داشته باشید که دو روش ترکیببندی قبلی درطول List روز و سال نگاشت میشوند تا بهصورت افزایشی تاریخهای جدیدی را برای فیلتر کردن و ترکیببندی تعریف کنند.
اعمال پیوستن روش دیگری برای انجام این عملیات است. در قطعه کد زیر، یک مجموعه سال یکتا تعریف شده است و سپس یک پیوند saveAll اعمال میشود تا همه تصاویر مربوط به یک سال مشخص شناسایی شوند.
تصاویر متعلق به یک سال معین در یک شیء List گروهبندی میشوند که بهعنوان ویژگی نماینده سال مربوطه در مجموعه سال متمایز ذخیره میشود. ترکیبهای سالانه از این فهرستها با کاهش
ImageCollections تعریفشده توسط آنها در تابعی که روی مجموعه سال متمایز نگاشت شده است، تولید میشوند.
ویرایشگر کد (جاوا اسکریپت)
// Assemble a collection of Landsat surface reflectance images for a given // region and day-of-year range. var lsCol = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2') .filterBounds(ee.Geometry.Point(-122.9, 43.6)) .filter(ee.Filter.dayOfYear(182, 243)) // Add the observation year as a property to each image. .map(function(img) { return img.set('year', ee.Image(img).date().get('year')); }); // Make a distinct year collection; one image representative per year. var distinctYears = lsCol.distinct('year').sort('year'); // Define a join filter; one-to-many join on ‘year’ property. var filter = ee.Filter.equals({leftField: 'year', rightField: 'year'}); // Define a join. var join = ee.Join.saveAll('year_match'); // Apply the join; results in 'year_match' property being added to each distinct // year representative image. The list includes all images in the collection // belonging to the respective year. var joinCol = join.apply(distinctYears, lsCol, filter); // Define a function to scale the data and mask unwanted pixels. function maskL457sr(image) { // Bit 0 - Fill // Bit 1 - Dilated Cloud // Bit 2 - Unused // Bit 3 - Cloud // Bit 4 - Cloud Shadow var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0); var saturationMask = image.select('QA_RADSAT').eq(0); // Apply the scaling factors to the appropriate bands. var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2); var thermalBand = image.select('ST_B6').multiply(0.00341802).add(149.0); // Replace the original bands with the scaled ones and apply the masks. return image.addBands(opticalBands, null, true) .addBands(thermalBand, null, true) .updateMask(qaMask) .updateMask(saturationMask); } // Map over the distinct years collection to build a list of annual image // composites. var lsCompList = joinCol.map(function(img) { // Get the list of images belonging to the given year. return ee.ImageCollection.fromImages(img.get('year_match')) // Apply cloud mask. .map(maskL457sr) // Reduce image collection by median. .reduce(ee.Reducer.median()) // Set composite year as an image property. .copyProperties(img, ['year']); }); // Convert the image List to an ImageCollection. var lsCompCol = ee.ImageCollection(lsCompList);
ترکیب همان روز با پیوستن و کاهش
مورد دیگری برای ترکیب کردن، ایجاد موزاییکهای تصویری پیوسته فضایی است. فرض کنید منطقه موردعلاقه شما دو ردیف Landsat را در یک مسیر دربرمیگیرد و هدف شما نمایش موزاییک تصویری از دو تصویر برای هر مدار Landsat 8 در سالهای ۲۰۱۷ و ۲۰۱۸ است. در اینجا، پساز فیلتر کردن مجموعه براساس مسیر و ردیف، از عملیات پیوستن برای موزاییک کردن تصاویر Landsat از همان مدار، که براساس تاریخ دریافت تعریف شده است، استفاده میشود.
ویرایشگر کد (جاوا اسکریپت)
var lsCol = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2') .filterDate('2017-01-01', '2019-01-01') .filter('WRS_PATH == 38 && (WRS_ROW == 28 || WRS_ROW == 29)') .map(function(img) { var date = img.date().format('yyyy-MM-dd'); return img.set('date', date); }); var distinctDates = lsCol.distinct('date').sort('date'); var filter = ee.Filter.equals({leftField: 'date', rightField: 'date'}); var join = ee.Join.saveAll('date_match'); var joinCol = join.apply(distinctDates, lsCol, filter); var lsColMos = ee.ImageCollection(joinCol.map(function(col) { return ee.ImageCollection.fromImages(col.get('date_match')).mosaic(); }));
مرتبسازی
مجموعه را براساس زمان مرتب کنید تا از توالی زمانی مناسب مطمئن شوید، یا براساس ویژگی انتخابی خودتان مرتب کنید. بهطور پیشفرض، سری قابهای تجسمسازی
بهترتیب طبیعی مجموعه مرتب شده است. ترتیب مجموعه را میتوان بااستفاده از روش مجموعه sort تغییر داد، که در آن یک ویژگی Image برای مرتبسازی به ترتیب صعودی یا نزولی انتخاب میشود. برای مثال، برای مرتبسازی براساس زمان مشاهده، از ویژگی همهجاحاضر system:time_start استفاده کنید.
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') .filterBounds(ee.Geometry.Point(-122.1, 37.2)) .sort('system:time_start');
یا شاید ترتیب باید براساس افزایش ابری بودن تعریف شود، مانند این مورد از تصاویر Sentinel-2.
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') .filterBounds(ee.Geometry.Point(-122.1, 37.2)) .sort('CLOUDY_PIXEL_PERCENTAGE');
ترتیب را میتوان با ویژگی مشتقشدهای مثل میانگین NDVI منطقهای نیز تعریف کرد. در اینجا، NDVI منطقهای بهعنوان ویژگی به هر تصویر در تابع نگاشتشده اضافه میشود، و سپس ویژگی جدید مرتب میشود.
ویرایشگر کد (جاوا اسکریپت)
// Define an area of interest geometry. var aoi = ee.Geometry.Point(-122.1, 37.2).buffer(1e4); // Filter MODIS NDVI image collection by a date range. var ndviCol = ee.ImageCollection('MODIS/061/MOD13A1') .filterDate('2018-01-01', '2019-01-01') .select('NDVI') // Map over the image collection to calculate regional mean NDVI and add // the result to each image as a property. .map(function(img) { var meanNdvi = img.reduceRegion({ reducer: ee.Reducer.mean(), geometry: aoi, scale: 500}); return img.set('meanNdvi', meanNdvi.get('NDVI')); }) // Sort the collection by descending regional mean NDVI. .sort('meanNdvi', false);
نمایش تصویری تصویر
تجسم تصویر اعداد را به رنگ تبدیل میکند. سه روش برای کنترل نحوه نمایش دادههای تصویر بهعنوان رنگ در روشهای تجسم مجموعه وجود دارد:
- آرگومانهای نمایش دیداری را مستقیماً به
getVideoThumbURLوgetFilmstripThumbURLارائه دهید. - روش تصویر
visualizeرا قبلاز اعمالgetVideoThumbURLوgetFilmstripThumbURLروی مجموعه تصویر نگاشت کنید. - روش تصویر
sldStyleرا قبلاز اعمالgetVideoThumbURLوgetFilmstripThumbURLروی مجموعه تصویر نگاشت کنید. برای اطلاعات بیشتر، توصیفکننده لایه سبکدار را ببینید.
نمونههای این راهنما از گزینههای ۱ و ۲ استفاده میکنند که در آنها نمایش دیداری با نگاشت سه باند تصویری از یک تصویر چندباندی به کانالهای رنگی قرمز، سبز، و آبی یا درجهبندی خطی مقادیر یک باند در امتداد یک پالت رنگی حاصل میشود. پارامترهای نمایش دیداری عبارتاند از:
| پارامتر | شرح | نوع |
|---|---|---|
| باند | فهرست جداشده با کاما از سه نام باند برای نگاشت به RGB | فهرست |
| دقیقه | مقدار(هایی) که به ۰ نگاشت میشود | عدد یا فهرست سه عدد، یکی برای هر باند |
| max | مقدار(ها) برای نگاشت به ۲۵۵ | عدد یا فهرست سه عدد، یکی برای هر باند |
| بهره | مقدار(هایی) که هر مقدار پیکسل باید در آن ضرب شود | عدد یا فهرست سه عدد، یکی برای هر باند |
| bias | مقدار(هایی) که باید به هر DN اضافه شود | عدد یا فهرست سه عدد، یکی برای هر باند |
| gamma | عامل(های) اصلاح گاما | عدد یا فهرست سه عدد، یکی برای هر باند |
| پالت | فهرست رشتههای رنگی سبک CSS (فقط تصاویر تکباندی) | فهرست جداشده با کاما از رشتههای بر مبنای شانزده |
| ماتی | ماتی لایه (۰٫۰ کاملاً شفاف و ۱٫۰ کاملاً مات است) | شماره |
از شناسه bands برای انتخاب باند(های) موردنظر برای تجسم استفاده کنید. فهرستی
از یک یا سه نام گروه ارائه دهید. درخصوص تصاویر چندباندی،
سه باند اول بهطور پیشفرض انتخاب میشوند. ترتیب نام باند تعیینکننده
اختصاص رنگ است؛ اولین، دومین، و سومین باند فهرستشده بهترتیب به
قرمز، سبز، و آبی نگاشت میشوند.
مقیاسبندی محدوده دادهها نکته مهمی است که باید هنگام تجسم تصاویر درنظر گرفته شود. بهطور پیشفرض، مقادیر داده ممیز شناور بین ۰ و ۱ (شامل این دو عدد) بین ۰ و ۲۵۵ (شامل این دو عدد) مقیاسبندی میشوند. مقادیر خارج از این محدوده، بسته به اینکه کمتر از ۰ یا بیشتر از ۱ باشند، بهترتیب به ۰ و ۲۵۵ تبدیل میشوند. With regard to integer data, the full capacity defined by its
type is scaled between 0 and 255 (e.g., signed 16-bit data has a range from
−32,768 to 32,767, which scales to [0, 255], by default). پذیرفتن
پیشفرضها اغلب میتواند منجر به تجسمهایی با کنتراست کم یا بدون کنتراست
بین ویژگیهای تصویر شود. از min و max برای بهبود کنتراست و تأکید بر
گستره داده خاصی استفاده کنید. یک قانون سرانگشتی خوب این است که min و max را روی مقادیری تنظیم کنید که نشاندهنده صدک دوم و نودوهشتم دادهها در منطقه موردنظر شما باشد. مثال زیر را برای محاسبه این مقادیر برای مدل ارتفاع دیجیتال ببینید.
ویرایشگر کد (جاوا اسکریپت)
// Import NASADEM global elevation model. var demImg = ee.Image('NASA/NASADEM_HGT/001').select('elevation'); // Define a rectangular area of interest. var aoi = ee.Geometry.Polygon( [[ [-103.84153083119054, 49.083004219142886], [-103.84153083119054, 25.06838270664608], [-85.64817145619054, 25.06838270664608], [-85.64817145619054, 49.083004219142886] ]], null, false); // Calculate the 2nd and 98th percentile elevation values from rescaled (to // 500m) pixels intersecting the area of interest. A Dictionary is returned. var percentClip = demImg.reduceRegion({ reducer: ee.Reducer.percentile([2, 98]), geometry: aoi, scale: 500, maxPixels: 3e7 }); // Print the regional 2nd and 98th percentile elevation values. Get the // dictionary keys and use them to get the values for each percentile summary. var keys = percentClip.keys(); print('Set vis min to:', ee.Number(percentClip.get(keys.get(0))).round()); print('Set vis max to:', ee.Number(percentClip.get(keys.get(1))).round());
پارامتر palette رنگهایی را تعریف میکند که تصویر دیداریسازی ۸ بیتی را نشان میدهند. این پارامتر فقط برای نمایشهای تکباندی اعمال میشود؛
مشخص کردن آن با تصویر چندباندی منجر به خطا میشود.
اگر دادهها تکباندی هستند یا میخواهید یک باند را از یک تصویر چندباندی تجسم کنید، پارامتر forceRgbOutput را روی true تنظیم کنید (اگر آرگومان palette ارائه شده باشد، نیازی نیست). از پارامترهای min و max برای
تعریف محدوده مقادیر برای مقیاسبندی خطی بین ۰ و ۲۵۵ استفاده کنید.
مثالی از نگاشت تابع دیداریسازی روی مجموعه تصویر تکباندی در زیر آمده است. یک مجموعه MODIS NDVI وارد میشود، آرگومانهای تجسم برای روش visualization تنظیم میشوند، و تابعی که مقادیر را به نمایشهای تصویر RGB تبدیل میکند، روی مجموعه NDVI نگاشت میشود.
ویرایشگر کد (جاوا اسکریپت)
// Filter MODIS NDVI image collection by a date range. var ndviCol = ee.ImageCollection('MODIS/061/MOD13A1') .filterDate('2018-01-01', '2019-01-01') .select('NDVI'); // Define visualization arguments. var visArgs = { min: 0, max: 9000, palette: [ 'FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901', '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01', '012E01', '011D01', '011301' ] }; // Define a function to convert an image to an RGB visualization image and copy // properties from the original image to the RGB image. var visFun = function(img) { return img.visualize(visArgs).copyProperties(img, img.propertyNames()); }; // Map over the image collection to convert each image to an RGB visualization // using the previously defined visualization function. var ndviColVis = ndviCol.map(visFun);
در اینجا مثالی از نگاشت تابع نمایش دیداری روی مجموعه تصویر چندباندی آورده شده است:
ویرایشگر کد (جاوا اسکریپت)
// Assemble a collection of Sentinel-2 surface reflectance images for a given // region and date range. var s2col = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') .filterBounds(ee.Geometry.Point(-96.9037, 48.0395)) .filterDate('2019-06-01', '2019-10-01'); // Define visualization arguments. var visArgs = {bands: ['B11', 'B8', 'B3'], min: 300, max: 3500}; // Define a function to convert an image to an RGB visualization image and copy // properties from the original image to the RGB image. var visFun = function(img) { return img.visualize(visArgs).copyProperties(img, img.propertyNames()); }; // Map over the image collection to convert each image to an RGB visualization // using the previously defined visualization function. var s2colVis = s2col.map(visFun);
در این مورد، هیچ آرگومان پالت ارائه نشده است زیرا سه باند داده شده است،
که شدت را برای هر لایه RGB تعریف میکند. توجه داشته باشید که هر دو مثال از پارامترهای min و max برای کنترل اینکه چه مقادیری تا حدود دادههای RGB ۸ بیتی گسترش مییابند استفاده میکنند.
ریزعکس ویدیو
تابع getVideoThumbURL() پویانماییای از همه تصاویر در ImageCollection تولید میکند که در آن هر تصویر نشاندهنده یک قاب است. گردش کار کلی برای تولید پویانمایی بهصورت زیر است:
Geometryرا تعریف کنید که مرزهای آن گستره منطقهای پویانمایی را تعیین میکند.ImageCollectionرا تعریف کن.- تصویرسازی تصویر را درنظر بگیرید: یا تابع تصویرسازی تصویر را روی مجموعه نگاشت کنید یا آرگومانهای تصویرسازی تصویر را به مجموعه آرگومانهای پویانمایی اضافه کنید.
- متغیرهای مستقل پویانمایی را تعریف کنید و روش
getVideoThumbURLرا فراخوانی کنید.
نتیجه getVideoThumbURL یک نشانی وب است. نشانی وب را در کنسول چاپ کنید و
روی آن کلیک کنید تا سرورهای Earth Engine شروع به تولید پویانمایی درلحظه در
زبانه جدید مرورگر کنند. یا اینکه پویانمایی را در کنسول «ویرایشگر کد» با فراخوانی تابع ui.Thumbnail در مجموعه و آرگومانهای پویانمایی مربوط به آن مشاهده کنید. پساز پردازش، پویانمایی برای بارگیری دردسترس است. برای بارگیری، روی آن کلیک راست کنید و گزینههای مناسب را از منوِ زمینهای آن انتخاب کنید.
مثال زیر تولید پویانماییای را نشان میدهد که دمای جهانی را درطول ۲۴ ساعت بهتصویر میکشد. توجه داشته باشید که این مثال شامل
متغیرهای مستقل تجسم بههمراه متغیرهای مستقل پویانمایی است، برخلاف ابتدا
نگاشت کردن تابع تجسم روی ImageCollection. پساز اجرای این اسکریپت، پویانمایی مشابه شکل ۳ باید در کنسول Code Editor ظاهر شود.
ویرایشگر کد (جاوا اسکریپت)
// Define an area of interest geometry with a global non-polar extent. var aoi = ee.Geometry.Polygon( [[[-179.0, 78.0], [-179.0, -58.0], [179.0, -58.0], [179.0, 78.0]]], null, false); // Import hourly predicted temperature image collection for northern winter // solstice. Note that predictions extend for 384 hours; limit the collection // to the first 24 hours. var tempCol = ee.ImageCollection('NOAA/GFS0P25') .filterDate('2018-12-22', '2018-12-23') .limit(24) .select('temperature_2m_above_ground'); // Define arguments for animation function parameters. var videoArgs = { dimensions: 768, region: aoi, framesPerSecond: 7, crs: 'EPSG:3857', min: -40.0, max: 35.0, palette: ['blue', 'purple', 'cyan', 'green', 'yellow', 'red'] }; // Print the animation to the console as a ui.Thumbnail using the above defined // arguments. Note that ui.Thumbnail produces an animation when the first input // is an ee.ImageCollection instead of an ee.Image. print(ui.Thumbnail(tempCol, videoArgs)); // Alternatively, print a URL that will produce the animation when accessed. print(tempCol.getVideoThumbURL(videoArgs));

شکل ۳. دمای ساعتی سطح برای انقلاب زمستانی شمالی
بهصورت تصویر گیف پویانماییشده نشان داده شده است.
نوار فیلم
تابع getFilmstripThumbUrl یک تصویر ثابت واحد تولید میکند که نشاندهنده الحاق همه تصاویر در یک ImageCollection به یک سری شمال-جنوب است. توالی قابهای نوار فیلم از ترتیب طبیعی مجموعه پیروی میکند.
نتیجه getFilmstripThumbUrl یک نشانی وب است. نشانی وب را در کنسول چاپ کنید
و روی آن کلیک کنید تا سرورهای Earth Engine شروع به تولید تصویر در لحظه در
زبانه جدید مرورگر کنند. پساز پردازش، تصویر برای بارگیری دردسترس است. برای بارگیری، روی آن کلیک راست کنید و گزینههای مناسب را از منوِ زمینهای آن انتخاب کنید.
تکهکد زیر از همان مجموعه مثال تصویر کوچک ویدیو در بالا استفاده میکند. پساز اجرای این اسکریپت، یک نوار فیلم مشابه شکل ۴ باید در کنسول «ویرایشگر کد» ظاهر شود.
ویرایشگر کد (جاوا اسکریپت)
// Define an area of interest geometry with a global non-polar extent. var aoi = ee.Geometry.Polygon( [[[-179.0, 78.0], [-179.0, -58.0], [179.0, -58.0], [179.0, 78.0]]], null, false); // Import hourly predicted temperature image collection for northern winter // solstice. Note that predictions extend for 384 hours; limit the collection // to the first 24 hours. var tempCol = ee.ImageCollection('NOAA/GFS0P25') .filterDate('2018-12-22', '2018-12-23') .limit(24) .select('temperature_2m_above_ground'); // Define arguments for the getFilmstripThumbURL function parameters. var filmArgs = { dimensions: 128, region: aoi, crs: 'EPSG:3857', min: -40.0, max: 35.0, palette: ['blue', 'purple', 'cyan', 'green', 'yellow', 'red'] }; // Print a URL that will produce the filmstrip when accessed. print(tempCol.getFilmstripThumbURL(filmArgs));

شکل ۴. دمای سطح زمین در بازههای زمانی یک ساعته برای انقلاب زمستانی شمالی
بهصورت تصویر PNG نوار فیلم نمایش داده شده است. توجه داشته باشید که نوار فیلم برای نمایش به چهار بخش تقسیم شده است؛ نتیجه getFilmstripThumbURL یک سری تکی از تصاویر مجموعه است که از شمال به جنوب به هم متصل شدهاند.
تکنیکهای پیشرفته
بخشهای زیر نحوه استفاده از برش، شفافیت، و ترکیب لایه را برای بهبود تجسمها با افزودن مرزهای چندضلعی، تأکید بر مناطق مورد علاقه، و مقایسه تصاویر در یک مجموعه شرح میدهند.
توجه داشته باشید که همه مثالهای زیر در این بخش از همان پایه
ImageCollection تعریفشده در اینجا استفاده میکنند:
ویرایشگر کد (جاوا اسکریپت)
// Import hourly predicted temperature image collection for northern winter // solstice. Note that predictions extend for 384 hours; limit the collection // to the first 24 hours. var tempCol = ee.ImageCollection('NOAA/GFS0P25') .filterDate('2018-12-22', '2018-12-23') .limit(24) .select('temperature_2m_above_ground'); // Define visualization arguments to control the stretch and color gradient // of the data. var visArgs = { min: -40.0, max: 35.0, palette: ['blue', 'purple', 'cyan', 'green', 'yellow', 'red'] }; // Convert each image to an RGB visualization image by mapping the visualize // function over the image collection using the arguments defined previously. var tempColVis = tempCol.map(function(img) { return img.visualize(visArgs); }); // Import country features and filter to South American countries. var southAmCol = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017') .filterMetadata('wld_rgn', 'equals', 'South America'); // Define animation region (South America with buffer). var southAmAoi = ee.Geometry.Rectangle({ coords: [-103.6, -58.8, -18.4, 17.4], geodesic: false});
همپوشانی ها
بااستفاده از روش blend Image میتوان چندین تصویر را رویهم قرار داد که در آن پیکسلهای همپوشان دو تصویر براساس ماسکهایشان (کدری) باهم ترکیب میشوند.
رونهاد برداری
افزودن چندضلعیهای مرز اداری و سایر هندسهها به تصویر میتواند بافت فضایی ارزشمندی ارائه دهد. پویانمایی دمای سطح روزانه جهانی در بالا (شکل ۳) را درنظر بگیرید. مرزهای بین خشکی و اقیانوس تاحدودی قابلتشخیص هستند، اما میتوان آنها را با افزودن همپوشانی چندضلعی کشورها صریحتر کرد.
دادههای برداری (Features) با اعمال روش paint به تصاویر تبدیل میشوند.
ویژگیها را میتوان روی تصویر موجود نقاشی کرد، اما روش بهتر این است که آنها را روی تصویر خالی نقاشی کنید، به آن سبک بدهید، و سپس نتیجه را با لایههای تصویر سبکدار دیگر ترکیب کنید. برخورد مستقل با هر لایه از پشته تجسم، کنترل بیشتری بر سبکبندی فراهم میکند.
مثال زیر نشان میدهد که چگونه مرزهای کشورهای آمریکای جنوبی را روی یک Image خالی رنگآمیزی کنیم و نتیجه را با هر Image از مجموعه دمای روزانه جهانی ترکیب کنیم (شکل ۵). مرزهای کشورها که روی نقشه قرار گرفتهاند
خشکی را از آب متمایز میکنند و زمینهای برای الگوهای دما فراهم میکنند.
ویرایشگر کد (جاوا اسکریپت)
// Define an empty image to paint features to. var empty = ee.Image().byte(); // Paint country feature edges to the empty image. var southAmOutline = empty .paint({featureCollection: southAmCol, color: 1, width: 1}) // Convert to an RGB visualization image; set line color to black. .visualize({palette: '000000'}); // Map a blend operation over the temperature collection to overlay the country // border outline image on all collection images. var tempColOutline = tempColVis.map(function(img) { return img.blend(southAmOutline); }); // Define animation arguments. var videoArgs = { dimensions: 768, region: southAmAoi, framesPerSecond: 7, crs: 'EPSG:3857' }; // Display the animation. print(ui.Thumbnail(tempColOutline, videoArgs));

شکل ۵. برای ارائه بافت فضایی، همپوشانیهای برداری به تصاویر کلکسیون اضافه کنید.
رونهاد تصویر
برای دستیابی به سبک موردنظر، میتوان چندین تصویر را روی هم قرار داد. فرض کنید میخواهید بر منطقه موردعلاقهای تأکید کنید. میتوانید یک کپی بیصدا از یک تصویر بصریسازی را بهعنوان لایه پایه ایجاد کنید و سپس یک نسخه برشخورده از بصریسازی اصلی را روی آن قرار دهید. بااستفاده از مثال قبلی، دستورات زیر شکل ۶ را تولید میکند.
ویرایشگر کد (جاوا اسکریپت)
// Define an empty image to paint features to. var empty = ee.Image().byte(); // Paint country feature edges to the empty image. var southAmOutline = empty .paint({featureCollection: southAmCol, color: 1, width: 1}) // Convert to an RGB visualization image; set line color to black. .visualize({palette: '000000'}); // Map a blend operation over the temperature collection to overlay the country // border outline image on all collection images. var tempColOutline = tempColVis.map(function(img) { return img.blend(southAmOutline); }); // Define a partially opaque grey RGB image to dull the underlying image when // blended as an overlay. var dullLayer = ee.Image.constant(175).visualize({ opacity: 0.6, min: 0, max: 255, forceRgbOutput: true}); // Map a two-part blending operation over the country outline temperature // collection for final styling. var finalVisCol = tempColOutline.map(function(img) { return img // Blend the dulling layer with the given country outline temperature image. .blend(dullLayer) // Blend a clipped copy of the country outline temperature image with the // dulled background image. .blend(img.clipToCollection(southAmCol)); }); // Define animation arguments. var videoArgs = { dimensions: 768, region: southAmAoi, framesPerSecond: 7, crs: 'EPSG:3857' }; // Display the animation. print(ui.Thumbnail(finalVisCol, videoArgs));

شکل ۶. با قیچی کردن تصویر و همپوشانی آن روی نسخهای بیصدا، بر منطقه موردعلاقه تأکید کنید.
همچنین میتوانید دادههای تصویر را با لایه پایه سایهزنی تپه ترکیب کنید تا زمین را نشان دهید و به تجسم عمق دهید (شکل ۷).
ویرایشگر کد (جاوا اسکریپت)
// Define a hillshade layer from NASADEM digital elevation model. var hillshade = ee.Terrain.hillshade(ee.Image('NASA/NASADEM_HGT/001') // Exaggerate the elevation to increase contrast in hillshade. .multiply(100)) // Clip the DEM by South American boundary to clean boundary between // land and ocean. .clipToCollection(southAmCol); // Map a blend operation over the temperature collection to overlay a partially // opaque temperature layer on the hillshade layer. var finalVisCol = tempColVis.map(function(img) { return hillshade .blend(img.clipToCollection(southAmCol).visualize({opacity: 0.6})); }); // Define animation arguments. var videoArgs = { dimensions: 768, region: southAmAoi, framesPerSecond: 7, crs: 'EPSG:3857' }; // Display the animation. print(ui.Thumbnail(finalVisCol, videoArgs));

شکل ۷. نمایش زمین با همپوشانی دادههای تصویری نیمهشفاف روی
لایه سایهتپه.
انتقالات
مجموعه تصویری را سفارشیسازی کنید تا پویانماییهایی تولید کنید که تفاوتهای بین دو تصویر را در یک مجموعه بااستفاده از گذارهای محو شدن، چشمک زدن، و لغزیدن نشان دهد. هریک از مثالهای زیر از همان تجسم پایه استفاده میکنند که توسط دستورگان زیر تولید شده است:
ویرایشگر کد (جاوا اسکریپت)
// Define an area of interest geometry with a global non-polar extent. var aoi = ee.Geometry.Polygon( [[[-179.0, 78.0], [-179.0, -58.0], [179.0, -58.0], [179.0, 78.0]]], null, false); // Import hourly predicted temperature image collection. var temp = ee.ImageCollection('NOAA/GFS0P25') // Define a northern summer solstice temperature image. var summerSolTemp = temp .filterDate('2018-06-21', '2018-06-22') .filterMetadata('forecast_hours', 'equals', 12) .first() .select('temperature_2m_above_ground'); // Define a northern winter solstice temperature image. var winterSolTemp = temp .filterDate('2018-12-22', '2018-12-23') .filterMetadata('forecast_hours', 'equals', 12) .first() .select('temperature_2m_above_ground'); // Combine the solstice images into a collection. var tempCol = ee.ImageCollection([ summerSolTemp.set('season', 'summer'), winterSolTemp.set('season', 'winter') ]); // Import international boundaries feature collection. var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); // Define visualization arguments. var visArgs = { min: -40.0, max: 35.0, palette: ['blue', 'purple', 'cyan', 'green', 'yellow', 'red'] }; // Convert the image data to RGB visualization images. // The clip and unmask combination sets ocean pixels to black. var tempColVis = tempCol.map(function(img) { return img .visualize(visArgs) .clipToCollection(countries) .unmask(0) .copyProperties(img, img.propertyNames()); });
لرزش تصویر
وقتی فقط دو تصویر در مجموعه وجود دارد، مانند این مورد، لرزش نمایش پیشفرض در پویانمایی مجموعه است. آرگومان پویانمایی
framesPerSecond را تنظیم کنید تا نرخ چشمک زدن را
افزایش یا کاهش دهید. آرگومانهای تجسم زیر که بر مجموعه بالا اعمال شده است
شکل ۸ را تولید میکند.
ویرایشگر کد (جاوا اسکریپت)
// Define arguments for animation function parameters. var videoArgs = { dimensions: 768, region: aoi, framesPerSecond: 2, crs: 'EPSG:3857' }; // Display animation to the Code Editor console. print(ui.Thumbnail(tempColVis, videoArgs));

شکل ۸. نمونهای از چشمک زدن بین دمای سطح ۱۲ بعدازظهر بهوقت گرینویچ برای
انقلاب شمالی و زمستانی.
محو کردن
گذر محو بین دو لایه با کاهش همزمان ماتی یک لایه و افزایش ماتی لایه دیگر درطول توالی افزایش ماتی از نزدیک ۰ تا ۱ حاصل میشود (شکل ۹).
ویرایشگر کد (جاوا اسکریپت)
// Define a sequence of decreasing opacity increments. Note that opacity cannot // be 0, so near 1 and 0 are used. Near 1 is needed because a compliment is // calculated in a following step that can result in 0 if 1 is an element of the // list. var opacityList = ee.List.sequence({start: 0.99999, end: 0.00001, count: 20}); // Filter the summer and winter solstice images from the collection and set as // image objects. var summerImg = tempColVis.filter(ee.Filter.eq('season', 'summer')).first(); var winterImg = tempColVis.filter(ee.Filter.eq('season', 'winter')).first(); // Map over the list of opacity increments to iteratively adjust the opacity of // the two solstice images. Returns a list of images. var imgList = opacityList.map(function(opacity) { var opacityCompliment = ee.Number(1).subtract(ee.Number(opacity)); var winterImgFade = winterImg.visualize({opacity: opacity}); var summerImgFade = summerImg.visualize({opacity: opacityCompliment}); return summerImgFade.blend(winterImgFade).set('opacity', opacity); }); // Convert the image list to an image collection; the forward phase. var fadeForward = ee.ImageCollection.fromImages(imgList); // Make a copy of the collection that is sorted by ascending opacity to // represent the reverse phase. var fadeBackward = fadeForward.sort({property: 'opacity'}); // Merge the forward and reverse phase frame collections. var fadeCol = fadeForward.merge(fadeBackward); // Define animation arguments. var videoArgs = { dimensions: 768, region: aoi, framesPerSecond: 25, crs: 'EPSG:3857' }; // Display the animation. print(ui.Thumbnail(fadeCol, videoArgs));

شکل ۹. نمونهای از محو شدن بین دمای سطح در ساعت ۱۲ بعدازظهر بهوقت گرینویچ برای انقلاب تابستانی
و زمستانی.
اسلایدر
انتقال لغزنده بهتدریج لایه تصویر زیرین را نشان میدهد و پنهان میکند. این کار با تنظیم مکرر ماتی تصویر رویی در محدودهای از طولهای جغرافیایی انجام میشود (شکل ۱۰).
ویرایشگر کد (جاوا اسکریپت)
// Define a sequence of longitude increments. Start and end are defined by the // min and max longitude of the feature to be provided to the region parameter // of the animation arguments dictionary. var lonSeq = ee.List.sequence({start: -179, end: 179, count: 20}); // Define a longitude image. var longitude = ee.Image.pixelLonLat().select('longitude'); // Filter the summer and winter solstice images from the collection and set as // image objects. var summerImg = tempColVis.filter(ee.Filter.eq('season', 'summer')).first(); var winterImg = tempColVis.filter(ee.Filter.eq('season', 'winter')).first(); // Map over the list of longitude increments to iteratively adjust the mask // (opacity) of the overlying image layer. Returns a list of images. var imgList = lonSeq.map(function(lon) { lon = ee.Number(lon); var mask = longitude.gt(lon); return summerImg.blend(winterImg.updateMask(mask)).set('lon', lon); }); // Convert the image list to an image collection; concealing phase. var sliderColForward = ee.ImageCollection.fromImages(imgList); // Make a copy of the collection that is sorted by descending longitude to // represent the revealing phase. var sliderColbackward = sliderColForward .sort({property: 'lon', ascending: false}); // Merge the forward and backward phase frame collections. var sliderCol = sliderColForward.merge(sliderColbackward); // Define animation arguments. var videoArgs = { dimensions: 768, region: aoi, framesPerSecond: 25, crs: 'EPSG:3857' }; // Display the animation. print(ui.Thumbnail(sliderCol, videoArgs));

شکل ۱۰. نمونهای از گذار لغزشی بین دمای سطحی ساعت ۱۲ بعدازظهر بهوقت گرینویچ
برای انقلاب تابستانی و زمستانی.

