تم تصميم Earth Engine بطريقة لا تستدعي القلق بشأن إسقاطات الخرائط عند إجراء العمليات الحسابية. كما هو الحال مع المقياس، يتم تحديد الإسقاط الذي تتم فيه العمليات الحسابية على أساس "السحب". على وجه التحديد، يتم طلب الإدخالات في عرض الإخراج. يمكن تحديد الناتج من خلال مَعلمة دالة (مثل crs)، أو كائنَي "محرّر الرموز" وgeemap (اللذين يتضمّنان إسقاط خرائط
مركاتور (EPSG:3857))، أو باستخدام استدعاء reproject(). عند عرض الصور في "محرّر التعليمات البرمجية" أو geemap، يتم طلب الإدخالات في إسقاط مركاتور في الخرائط. ضع في اعتبارك العملية التالية على صورة MODIS، التي تحتوي على إسقاط جيبي:
أداة تعديل الرموز (JavaScript)
// 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
Colab (Python)
# 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. يُرجى العِلم بأنّ إسقاط الإدخال يتم تحديده من خلال الإخراج، وتحديدًا إسقاط Mercator الخاص بعرض الخريطة في "محرّر الرموز". ينتقل هذا الإسقاط إلى الخلف خلال تسلسل العمليات، بحيث يتم طلب المدخلات في إسقاط مركاتور، بمقياس يحدّده مستوى تكبير/تصغير الخريطة.
في Earth Engine، يتم تحديد أنظمة الإسقاط من خلال نظام مرجعي للإحداثيات (CRS أو المَعلمة crs للعديد من الطرق). يمكنك التحقّق من عرض صورة من خلال استدعاء projection() عليها:
أداة تعديل الرموز (JavaScript)
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
Colab (Python)
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 بمقياس درجة واحدة.
على سبيل المثال:
أداة تعديل الرموز (JavaScript)
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
Colab (Python)
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic() display(mosaic.projection())
إذا حاولت استخدام صورة من هذا النوع في عملية حسابية، قد تظهر لك رسالة خطأ مثل:
بشكل عام، لا يُنصح باستخدام تجميع بمقياس درجة واحدة، لذا يقدّم لك Earth Engine هذا التذكير الودي لتوفير مواصفات كاملة للناتج.
يجد المستخدمون غالبًا أنّ هذا السلوك مربك ويقلقون بشأن معلومات العرض "المفقودة"، ولكن في الواقع، لا يتم احتساب وحدات البكسل إلا عند الحاجة إليها (مزيد من المعلومات)، وفي هذه الحالة، يكون هناك دائمًا عرض ناتج مصاحب للطلب الذي يحدّد كيفية احتساب الصورة المركّبة.
في معظم حالات الاستخدام، لا يشكّل عدم توفّر إسقاط مشكلة، بل هو في الواقع تحسين قيّم، لأنّه يتيح معاينة النتائج بأي مستوى تكبير/تصغير بدون الحاجة إلى انتظار اكتمال عملية احتساب الدقة الكاملة. ولكن هذا يعني أنّ الناتج يمكن أن يظهر بشكل مختلف عند مستويات تكبير أو تصغير مختلفة.
إذا لم تكن صورة العرض المحسّنة كافية، يمكن فرض عملية الحساب في إسقاط معيّن من خلال إعادة إسقاط الناتج كما هو موضّح في القسم التالي.
إعادة العرض
يمكنك فرض تنفيذ العمليات في عرض محدّد باستخدام طريقة reproject(). يؤدي استخدام reproject() إلى طلب الإدخالات في العرض المحدّد في استدعاء reproject().
سيتم إجراء العمليات الحسابية في الرمز قبل استدعاء reproject()
في عملية العرض المحدّدة. على سبيل المثال، لفرض إنشاء صورة مركّبة في إسقاط معيّن:
أداة تعديل الرموز (JavaScript)
// 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
Colab (Python)
# 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، ثم إعادة إسقاطها إلى إسقاط Web Mercator لعرضها في خريطة "محرّر التعليمات البرمجية":
أداة تعديل الرموز (JavaScript)
// 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
Colab (Python)
# 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 سير العمليات المرتبطة بمثال إعادة العرض البسيط هذا. يُرجى العِلم أنّ عملية إعادة العرض الأولى تكون صريحة، كما هو محدّد في طلب reproject(). أما عملية إعادة العرض الثانية، فهي ضمنية، وتنفّذها Earth Engine تلقائيًا من أجل عرض النتيجة على الخريطة. لاحظ أيضًا أنّ المعلومات حول نوع العرض الذي سيتم استخدامه تنتقل من الطلب إلى الإدخال.