تصاویری که یک ImageCollection
را تشکیل میدهند میتوانند به عنوان یک انیمیشن یا مجموعهای از تصاویر کوچک بهعنوان «نوار فیلم» تجسم شوند. این روش ها یک ارزیابی سریع از محتویات یک ImageCollection
و یک رسانه موثر برای مشاهده تغییرات مکانی و زمانی ارائه می کنند (شکل 1).
-
getVideoThumbURL()
یک سری تصاویر متحرک تولید می کند -
getFilmstripThumbURL()
یک سری تصویر کوچک تولید می کند
بخشهای زیر نحوه آمادهسازی ImageCollection
برای تجسم، ارائه کد نمونه برای هر روش تجسم مجموعه و چندین تکنیک پیشرفته انیمیشن را توضیح میدهند.
شکل 1. انیمیشنی که پیشرفت سه روزه طوفان های اقیانوس اطلس را در سپتامبر 2017 نشان می دهد.
آماده سازی مجموعه
فیلتر، ترکیب، مرتبسازی، و استایل کردن تصاویر در یک مجموعه برای نمایش تنها موارد مورد علاقه یا تاکید بر یک پدیده. هر ImageCollection
می توان به عنوان ورودی برای توابع تجسم ارائه کرد، اما یک مجموعه انتخاب شده با در نظر گرفتن محدوده تاریخ بین سالانه و درون سالانه، فاصله مشاهده، وسعت منطقه ای، کیفیت و نمایش می تواند به نتایج بهتری دست یابد.
فیلتر کردن
یک مجموعه تصویر را فیلتر کنید تا فقط دادههای مرتبطی را شامل شود که از هدف تجسم پشتیبانی میکنند. تاریخ ها، وسعت مکانی، کیفیت و سایر ویژگی های خاص یک مجموعه داده را در نظر بگیرید.
به عنوان مثال، مجموعه بازتاب سطح Sentinel-2 را با استفاده از موارد زیر فیلتر کنید:
یک محدوده تاریخ واحد،
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR') .filterDate('2018-01-01', '2019-01-01');
محدوده روز از سال سریال،
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR') .filter(ee.Filter.calendarRange(171, 242, 'day_of_year'));
منطقه مورد علاقه،
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR') .filterBounds(ee.Geometry.Point(-122.1, 37.2));
یا یک ویژگی تصویر
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR') .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 50));
چندین فیلتر زنجیره ای
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR') .filterDate('2018-01-01', '2019-01-01') .filterBounds(ee.Geometry.Point(-122.1, 37.2)) .filter('CLOUDY_PIXEL_PERCENTAGE < 50');
ترکیب کردن
محدوده تاریخ درون و بین سالی ترکیبی برای کاهش تعداد تصاویر در یک مجموعه و بهبود کیفیت. برای مثال، فرض کنید میخواهید تصویری از NDVI سالانه برای آفریقا ایجاد کنید. یک گزینه این است که به سادگی یک مجموعه NDVI 16 روزه MODIS را فیلتر کنید تا همه مشاهدات 2018 را شامل شود.
ویرایشگر کد (جاوا اسکریپت)
var ndviCol = ee.ImageCollection('MODIS/006/MOD13A2') .filterDate('2018-01-01', '2019-01-01') .select('NDVI');
کامپوزیت بین سالانه توسط فیلتر و کاهش
تجسم مجموعه فوق سر و صدای قابل توجهی را در مناطق جنگلی که پوشش ابر سنگین است نشان می دهد (شکل 2a). نمایش بهتری را می توان با کاهش محدوده تاریخ سریال با میانگین در تمام سال ها در مجموعه 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/006/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 16 روزه را برای بیش از 20 سال داده را نشان می دهد (شکل 1b). برای اطلاعات بیشتر در مورد این انیمیشن به این آموزش مراجعه کنید.
![]() | ![]() |
---|---|
شکل 2 الف. NDVI سالانه بدون ترکیب بین سالانه. | شکل 2b. NDVI سالانه با ترکیب بین سالانه. |
کامپوزیت داخل سالانه توسط فیلتر و کاهش
مثال قبلی ترکیب بین سالانه را اعمال می کند. همچنین ترکیب یک سری مشاهدات درون سالانه می تواند مفید باشد. به عنوان مثال، داده های Landsat هر شانزده روز برای یک صحنه معین در هر حسگر جمع آوری می شوند، اما اغلب بخشی از تصاویر توسط ابرها پنهان می شوند. پوشاندن ابرها و ترکیب چندین تصویر از یک فصل می تواند نمایشی بدون ابر ایجاد کند. مثال زیر را در نظر بگیرید که در آن تصاویر Landsat 5 از جولای و آگوست با استفاده از میانگین هر سال از سال 1985 تا 2011 ترکیب شده اند.
ویرایشگر کد (جاوا اسکریپت)
// 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
از روزها و سالها ترسیم میشوند تا تاریخهای جدیدی برای فیلتر کردن و ترکیب کردن بهصورت تدریجی تعریف شود. استفاده از Join روش دیگری برای دستیابی به این عملیات است. در قطعه زیر، یک مجموعه سال منحصر به فرد تعریف شده است و سپس یک saveAll
join اعمال می شود تا تمام تصاویر مربوط به یک سال مشخص را شناسایی کند. تصاویر متعلق به یک سال معین در یک شی 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 در سال های 2017 و 2018 است. در اینجا، پس از فیلتر کردن مجموعه بر اساس مسیر و ردیف، از عملیات Join برای موزاییک کردن تصاویر Landsat از همان تاریخ obit استفاده می شود که توسط acqui تعریف شده است.
ویرایشگر کد (جاوا اسکریپت)
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') .filterBounds(ee.Geometry.Point(-122.1, 37.2)) .sort('system:time_start');
یا شاید ترتیب باید با افزایش ابری تعریف شود، مانند این مورد از تصاویر Sentinel-2.
ویرایشگر کد (جاوا اسکریپت)
var s2col = ee.ImageCollection('COPERNICUS/S2_SR') .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
ارائه دهید. - قبل از استفاده از
getVideoThumbURL
وgetFilmstripThumbURL
، روشvisualize
تصویر را روی مجموعه تصویر ترسیم کنید. - قبل از استفاده از
getVideoThumbURL
وgetFilmstripThumbURL
، روش تصویرsldStyle
را روی مجموعه تصویر ترسیم کنید. برای اطلاعات بیشتر به Styled Layer Descriptor مراجعه کنید.
مثالهای موجود در این راهنما از گزینههای 1 و 2 استفاده میکنند، جایی که تجسم با نگاشت سه باند تصویر از یک تصویر چند باند به کانالهای رنگی قرمز، سبز و آبی یا درجهبندی مقادیر یک باند به صورت خطی در امتداد یک پالت رنگی به دست میآید. پارامترهای تجسم عبارتند از:
پارامتر | توضیحات | تایپ کنید |
---|---|---|
باندها | فهرستی با کاما از سه نام باند که باید به RGB نگاشت شوند | فهرست |
دقیقه | مقدار(ها) برای نگاشت به 0 | شماره یا لیستی از سه عدد، یکی برای هر باند |
حداکثر | مقدار(های) برای نگاشت به 255 | شماره یا لیستی از سه عدد، یکی برای هر باند |
به دست آوردن | مقدار(هایی) که در آن مقدار هر پیکسل ضرب می شود | شماره یا لیستی از سه عدد، یکی برای هر باند |
تعصب | ارزش(های) برای افزودن به هر DN | شماره یا لیستی از سه عدد، یکی برای هر باند |
گاما | فاکتور(های) تصحیح گاما | شماره یا لیستی از سه عدد، یکی برای هر باند |
پالت | لیست رشته های رنگی به سبک CSS (فقط تصاویر تک باند) | لیست رشته های هگزا جدا شده با کاما |
کدورت | کدورت لایه (0.0 کاملاً شفاف و 1.0 کاملاً مات است) | شماره |
از آرگومان bands
برای انتخاب باند(های) مورد نظر برای تجسم استفاده کنید. فهرستی از یک یا سه نام گروه ارائه دهید. با توجه به تصاویر چند باندی، سه باند اول به طور پیش فرض انتخاب می شوند. ترتیب نام باند تعیین کننده انتساب رنگ است. باندهای فهرست شده اول، دوم و سوم به ترتیب به رنگ قرمز، سبز و آبی نگاشت می شوند.
مقیاس بندی محدوده داده ها در هنگام تجسم تصاویر یک نکته مهم است. به طور پیش فرض، مقادیر داده های ممیز شناور بین 0 و 1 (شامل) بین 0 و 255 (شامل) مقیاس بندی می شوند. مقادیر خارج از این محدوده بسته به اینکه به ترتیب کمتر از 0 یا بزرگتر از 1 باشند به 0 و 255 مجبور می شوند. با توجه به داده های عدد صحیح، ظرفیت کامل تعریف شده بر اساس نوع آن بین 0 تا 255 مقیاس بندی می شود (به عنوان مثال، داده های 16 بیتی علامت دار دارای محدوده ای از 32768- تا 32767 هستند که به طور پیش فرض تا [0، 255] مقیاس می شود). پذیرش پیشفرضها اغلب میتواند منجر به تجسمهایی با تضاد کم یا بدون تضاد بین ویژگیهای تصویر شود. min
و max
برای بهبود کنتراست و تأکید بر یک محدوده داده خاص استفاده کنید. یک قانون سرانگشتی خوب این است که min
و max
را روی مقادیری تنظیم کنید که نشان دهنده صدک دوم و 98 از داده ها در منطقه مورد علاقه شما باشد. مثال زیر را برای محاسبه این مقادیر برای یک مدل ارتفاعی دیجیتال ببینید.
ویرایشگر کد (جاوا اسکریپت)
// Import SRTM global elevation model. var demImg = ee.Image('USGS/SRTMGL1_003'); // 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
رنگ ها را برای نمایش تصویر تجسم 8 بیتی تعریف می کند. این فقط برای نمایش های تک باند اعمال می شود. مشخص کردن آن با یک تصویر چند باندی منجر به خطا می شود. اگر دادهها تک باند هستند یا میخواهید یک باند را از یک تصویر چند باندی تجسم کنید، پارامتر forceRgbOutput
را روی true
تنظیم کنید (در صورت ارائه آرگومان palette
غیرضروری). از پارامترهای min
و max
برای تعریف محدوده مقادیر به صورت خطی بین 0 تا 255 استفاده کنید.
نمونه ای از نگاشت یک تابع تجسم بر روی یک مجموعه تصویر تک باندی در زیر آمده است. یک مجموعه 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') .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 8 بیتی کشیده میشوند.
شست ویدیو
تابع getVideoThumbURL()
یک انیمیشن از تمام تصاویر یک ImageCollection
تولید می کند که در آن هر تصویر یک فریم را نشان می دهد. گردش کار کلی برای تولید یک انیمیشن به شرح زیر است:
-
Geometry
ای را تعریف کنید که مرزهای آن وسعت منطقه ای انیمیشن را تعیین می کند. - یک
ImageCollection
تعریف کنید. - تجسم تصویر را در نظر بگیرید: یا یک تابع تجسم تصویر را روی مجموعه ترسیم کنید یا آرگومان های تجسم تصویر را به مجموعه آرگومان های انیمیشن اضافه کنید.
- آرگومان های انیمیشن را تعریف کنید و متد
getVideoThumbURL
را فراخوانی کنید.
نتیجه getVideoThumbURL
یک URL است. URL را در کنسول چاپ کنید و روی آن کلیک کنید تا سرورهای Earth Engine شروع به تولید انیمیشن در یک برگه مرورگر جدید کنند. همچنین، انیمیشن را در کنسول Code Editor با فراخوانی تابع ui.Thumbnail
در مجموعه و آرگومان های انیمیشن مربوطه مشاهده کنید. پس از رندر کردن، انیمیشن با کلیک راست روی آن و انتخاب گزینه های مناسب از منوی زمینه آن برای دانلود در دسترس است.
مثال زیر تولید انیمیشنی را نشان می دهد که دمای کره زمین را در طی 24 ساعت به تصویر می کشد. توجه داشته باشید که این مثال شامل آرگومانهای تجسم به همراه آرگومانهای انیمیشن میشود، برخلاف اولین نقشهبرداری یک تابع تجسم روی ImageCollection
. پس از اجرای این اسکریپت، یک انیمیشن شبیه به شکل 3 باید در کنسول 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));
شکل 3. دمای سطح ساعتی برای انقلاب زمستانی شمالی به عنوان یک تصویر متحرک GIF نشان داده شده است.
نوار فیلم
تابع getFilmstripThumbUrl
یک تصویر ثابت تولید می کند که نشان دهنده الحاق همه تصاویر در یک ImageCollection
به یک سری شمال به جنوب است. توالی فریم های نوار فیلم از نظم طبیعی مجموعه پیروی می کند.
نتیجه getFilmstripThumbUrl
یک URL است. URL را در کنسول چاپ کنید و روی آن کلیک کنید تا سرورهای Earth Engine شروع به تولید تصویر در یک برگه مرورگر جدید کنند. پس از رندر، تصویر با کلیک راست روی آن و انتخاب گزینه های مناسب از منوی زمینه آن برای دانلود در دسترس است.
قطعه کد زیر از مجموعه ای مشابه با مثال شست ویدیوی بالا استفاده می کند. پس از اجرای این اسکریپت، یک نوار فیلم مشابه شکل 4 باید در کنسول 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 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));
شکل 4. دمای سطح ساعتی برای انقلاب زمستانی شمالی به عنوان یک تصویر 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
که در آن پیکسل های همپوشانی از دو تصویر بر اساس ماسک آنها ترکیب می شوند، همپوشانی کرد.
پوشش برداری
افزودن چند ضلعی های مرزی اداری و سایر هندسه ها به یک تصویر می تواند زمینه فضایی ارزشمندی را فراهم کند. انیمیشن دمای سطح روزانه جهانی را در بالا در نظر بگیرید (شکل 3). مرزهای بین خشکی و اقیانوس تا حدودی قابل تشخیص است، اما می توان با افزودن یک پوشش چند ضلعی از کشورها، آنها را آشکار کرد.
داده های برداری ( Features
) با استفاده از روش paint
به تصاویر کشیده می شوند. ویژگیها را میتوان روی یک تصویر موجود نقاشی کرد، اما تمرین بهتر این است که آنها را در یک تصویر خالی رنگ کنید، به آن استایل دهید و سپس نتیجه را با لایههای تصویر استایلدار دیگر ترکیب کنید. پردازش هر لایه از پشته تجسم به طور مستقل کنترل بیشتری بر یک ظاهر طراحی می کند.
مثال زیر ترسیم مرزهای کشور آمریکای جنوبی را به یک Image
خالی نشان می دهد و نتیجه را با هر Image
از مجموعه دمای روزانه جهانی ترکیب می کند (شکل 5). مرزهای کشور پوشیده شده، زمین را از آب متمایز می کند و زمینه را برای الگوهای دما فراهم می کند.
ویرایشگر کد (جاوا اسکریپت)
// 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));
شکل 5. اضافه کردن پوشش های برداری به تصاویر در یک مجموعه برای ارائه زمینه فضایی.
پوشش تصویر
برای دستیابی به سبک دلخواه می توان چندین تصویر را روی هم گذاشت. فرض کنید می خواهید بر یک منطقه مورد علاقه تأکید کنید. میتوانید یک کپی بیصدا از تجسم تصویر به عنوان لایه پایه ایجاد کنید و سپس یک نسخه بریده شده از تجسم اصلی را روی هم قرار دهید. با تکیه بر مثال قبلی، اسکریپت زیر شکل 6 را تولید می کند.
ویرایشگر کد (جاوا اسکریپت)
// 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));
شکل 6. با بریدن تصویر و پوشاندن آن روی یک کپی خاموش، بر ناحیه مورد علاقه تأکید کنید.
همچنین میتوانید دادههای تصویر را با یک لایه پایه تپهای ترکیب کنید تا زمین را نشان دهد و به تجسم کمی عمق بدهید (شکل 7).
ویرایشگر کد (جاوا اسکریپت)
// Define a hillshade layer from SRTM digital elevation model. var hillshade = ee.Terrain.hillshade(ee.Image('USGS/SRTMGL1_003') // 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));
شکل 7. زمین را با پوشاندن داده های تصویر نیمه شفاف روی یک لایه سایه تپه نشان دهید.
انتقال ها
یک مجموعه تصویر را برای تولید انیمیشن هایی سفارشی کنید که با استفاده از انتقال محو، سوسو زدن و اسلاید، تفاوت بین دو تصویر را در یک مجموعه نشان می دهد. هر یک از مثالهای زیر از همان تجسم پایه تولید شده توسط اسکریپت زیر استفاده میکنند:
ویرایشگر کد (جاوا اسکریپت)
// 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
را تنظیم کنید تا سرعت سوسو زدن را افزایش یا کاهش دهید. آرگومان های تجسم زیر که در مجموعه فوق اعمال می شود، شکل 8 را ایجاد می کند.
ویرایشگر کد (جاوا اسکریپت)
// 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));
شکل 8. مثالی از سوسو زدن بین دمای سطح 12 بعد از ظهر به وقت گرینویچ برای انقلاب شمالی و زمستانی.
محو شدن
انتقال محو بین دو لایه با کاهش همزمان کدورت یک لایه در حالی که تیرگی لایه دیگر را بر روی یک توالی افزایش کدورت از نزدیک به 0 به 1 افزایش میدهد به دست میآید (شکل 9).
ویرایشگر کد (جاوا اسکریپت)
// 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));
شکل 9. نمونه ای از محو شدن بین دمای سطح 12 بعد از ظهر به وقت گرینویچ برای انقلاب تابستانی و زمستانی.
لغزنده
یک انتقال لغزنده به تدریج لایه تصویر زیرین را نشان داده و پنهان می کند. با تنظیم مکرر کدورت تصویر پوشاننده در محدوده طول جغرافیایی به دست می آید (شکل 10).
ویرایشگر کد (جاوا اسکریپت)
// 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));
شکل 10. نمونه ای از انتقال لغزشی بین دمای سطح 12 بعد از ظهر به وقت گرینویچ برای انقلاب تابستانی و زمستانی.