Earth Engine طوری طراحی شده است که به ندرت در هنگام انجام محاسبات نگران پیش بینی نقشه باشید. همانند مقیاس، طرح ریزی که در آن محاسبات انجام می شود بر اساس "کشش" تعیین می شود. به طور خاص، ورودی ها در طرح ریزی خروجی درخواست می شوند. خروجی ممکن است از یک پارامتر تابع (مثلا crs
)، ویرایشگر کد و اشیاء نقشه geemap (که دارای یک نمایشگر نقشه (EPSG:3857) هستند) یا با یک فراخوانی reproject()
تعیین شود. هنگامی که تصاویر را در ویرایشگر کد یا geemap نمایش می دهید، ورودی ها در maps mercator درخواست می شوند. عملیات ساده زیر را روی یک تصویر MODIS که دارای یک برآمدگی سینوسی است در نظر بگیرید:
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Normalize the image and add it to the map. var rescaled = image.unitScale(-2000, 10000); var visParams = {min: 0.15, max: 0.7}; Map.addLayer(rescaled, visParams, 'Rescaled');
import ee import geemap.core as geemap
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Normalize the image and add it to the map. rescaled = image.unitScale(-2000, 10000) vis_params = {'min': 0.15, 'max': 0.7} m = geemap.Map() m.add_layer(rescaled, vis_params, 'Rescaled') m
ترتیب عملیات برای این نمونه کد در شکل 1 نشان داده شده است. توجه داشته باشید که پیش بینی ورودی توسط خروجی تعیین می شود، به ویژه پیش بینی مرکور نقشه ها از نمایش نقشه در ویرایشگر کد. این پیشبینی از طریق توالی عملیات منتشر میشود، به طوری که ورودیها در نقشههای مرکور، در مقیاسی که توسط سطح زوم نقشه تعیین میشود، درخواست میشوند.

در Earth Engine، پیش بینی ها توسط یک سیستم مرجع مختصات (CRS یا پارامتر crs
بسیاری از روش ها) مشخص می شود. شما می توانید با فراخوانی projection()
روی آن، نمایش تصویر را بررسی کنید:
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0); print('Projection, crs, and crs_transform:', image.projection()); print('Scale in meters:', image.projection().nominalScale());
import ee import geemap.core as geemap
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0) display('Projection, crs, and crs_transform:', image.projection()) display('Scale in meters:', image.projection().nominalScale())
توجه داشته باشید که با فراخوانی nominalScale()
در ee.Projection
که توسط projection()
برگردانده می شود، می توانید وضوح تصویر را تعیین کنید. وضوح اصلی مقیاس پیکسل اسمی بر حسب متر از پایین ترین سطح هرم تصویر است. از آنجایی که هر باند از یک تصویر میتواند مقیاس و/یا نمایش متفاوتی داشته باشد، اگر projection()
روی تصویری با حداقل یک باند که دارای طرحبندی مشابه با بقیه نیست فراخوانی کنید، ممکن است خطایی مانند:
پیش بینی پیش فرض
مگر اینکه نیاز داشته باشید محاسبات شما در یک پروجکشن خاص اتفاق بیفتد، معمولاً نیازی به تعیین پیش بینی نیست. فقط برای خروجی مبهم، Earth Engine از شما می خواهد که یک طرح ریزی و/یا مقیاس مشخص کنید. ابهام می تواند ناشی از کاهش یک ImageCollection
حاوی تصاویر با پیش بینی های مختلف باشد (یعنی ایجاد یک ترکیب ). تصویری که ترکیبی یا موزاییکی از تصاویر ورودی با پیشبینیهای مختلف است، پیشفرض پیشفرض را خواهد داشت که WGS84 با مقیاس 1 درجه است. به عنوان مثال:
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA'); var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic(); print(mosaic.projection());
import ee import geemap.core as geemap
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic() display(mosaic.projection())
اگر سعی کنید از تصویری مانند این در محاسبات استفاده کنید، ممکن است با خطای زیر روبرو شوید:
به طور کلی، یک تجمع در مقیاس 1 درجه مورد نظر یا در نظر گرفته نشده است، بنابراین Earth Engine این یادآوری دوستانه را برای ارائه مشخصات کامل برای خروجی ارائه می دهد.
کاربران اغلب این رفتار را گیجکننده میبینند و نگران اطلاعات طرحریزی «از دست رفته» هستند، اما پیکسلها در واقع تا زمانی که مورد نیاز نباشند محاسبه نمیشوند ( بیشتر بدانید )، و در آن نقطه، همیشه یک پیشبینی خروجی همراه با درخواست وجود دارد که نحوه محاسبه ترکیب را مشخص میکند.
در اکثر موارد استفاده، نداشتن پروژکتور مشکلی نیست و در واقع یک بهینهسازی ارزشمند است، زیرا امکان پیشنمایش نتایج را در هر سطح بزرگنمایی بدون نیاز به منتظر ماندن برای تکمیل محاسبه وضوح کامل فراهم میکند. اما به این معنی است که خروجی می تواند در سطوح مختلف زوم متفاوت ظاهر شود.
اگر تصویر نمایش بهینه شده به نحوی کافی نباشد، محاسبات در یک طرح خاص میتواند با بازتاب مجدد خروجی همانطور که در بخش زیر توضیح داده شده است، مجبور شود.
بازپخش کردن
میتوانید با متد reproject()
عملیاتها را مجبور کنید در یک طرح خاص انجام شوند. استفاده از reproject()
منجر به درخواست ورودی ها در طرح مشخص شده در فراخوانی reproject()
می شود. محاسبات در کد شما قبل از فراخوانی reproject()
در طرح مشخص شده انجام می شود. به عنوان مثال، مجبور کردن یک کامپوزیت برای تولید در یک طرح خاص:
// Some projection that is suitable for your area of interest. var proj = ee.Projection(...); var output = collection.reduce(...).reproject(proj);
import ee import geemap.core as geemap
# Some projection that is suitable for your area of interest. proj = ee.Projection(...) output = collection.reduce(...).reproject(proj)
چند موردی که نیاز به پروجکشن ثابت دارند عبارتند از:
- محاسبه گرادیان (به عنوان مثال
ee.Terrain.gradient
یاee.Terrain.slope
). -
reduceResolution
، برای زمانی که می خواهید پیکسل های با وضوح بالاتر را در وضوح پایین تر جمع آوری کنید. ( در مورد کاهش وضوح بیشتر بدانید ).
دلایل مختلفی وجود دارد که باید از استفاده از reproject()
اجتناب کنید، مگر اینکه کاملاً نیاز داشته باشید. مثلاً فرض کنید چیزی را دوباره طرح کرده اید و به نقشه اضافه می کنید. اگر مقیاسی که در فراخوانی reproject()
مشخص کردهاید بسیار کوچکتر از سطح زوم نقشه باشد، Earth Engine همه ورودیها را در مقیاس بسیار کوچک، در گستره فضایی بسیار وسیع درخواست میکند. این می تواند منجر به درخواست داده های بیش از حد در یک زمان شود و منجر به خطا شود.
اگر خروجی نهایی در طرحی متفاوت از آنچه در فراخوانی reproject()
مشخص شده است باشد، منجر به بازپخش دیگری می شود. این یکی دیگر از دلایلی است که باید در مورد استفاده از reproject()
در کد خود محتاط باشید. مثال زیر را در نظر بگیرید، که تصویر MODIS را مجبور میکند ابتدا به WGS84 بازتاب داده شود، سپس برای نمایش در نقشه ویرایشگر کد، به mercator نقشه بازتاب داده شود:
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Operations *before* the reproject call will be done in the projection // specified by reproject(). The output results in another reprojection. var reprojected = image .unitScale(-2000, 10000) .reproject('EPSG:4326', null, 500); Map.addLayer(reprojected, {min: 0.15, max: 0.7}, 'Reprojected');
import ee import geemap.core as geemap
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Operations *before* the reproject call will be done in the projection # specified by reproject(). The output results in another reprojection. reprojected = image.unitScale(-2000, 10000).reproject('EPSG:4326', None, 500) m = geemap.Map() m.add_layer(reprojected, {'min': 0.15, 'max': 0.7}, 'Reprojected') m
شکل 2 نمودار جریان عملیات مربوط به این مثال ساده بازپرداخت را نشان می دهد. توجه داشته باشید که اولین reprojection واضح است، همانطور که در فراخوانی reproject()
مشخص شده است. بازپخش دوم به صورت ضمنی است که توسط Earth Engine به صورت خودکار انجام می شود تا نتیجه را روی نقشه نمایش دهد. همچنین توجه داشته باشید که اطلاعات مربوط به اینکه چه طرحی باید استفاده شود از درخواست به ورودی باز می گردد.
