التوقعات

تم تصميم 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');

إعداد Python

راجِع صفحة بيئة Python للحصول على معلومات حول واجهة برمجة التطبيقات Python واستخدام geemap للتطوير التفاعلي.

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 الخاص بعرض الخريطة في "محرّر الرموز". ينتقل هذا الإسقاط إلى الخلف خلال تسلسل العمليات، بحيث يتم طلب المدخلات في إسقاط مركاتور، بمقياس يحدّده مستوى تكبير/تصغير الخريطة.

projection
الشكل 1. مخطط انسيابي للعمليات التي تتوافق مع عرض صورة MODIS في خريطة "أداة تعديل الرموز" يتم تحديد التوقّعات (الجانب الأيمن من المخطط الانسيابي) لكل عملية من خلال الناتج. تشير الخطوط المنحنية إلى تدفّق المعلومات إلى إعادة العرض، وتحديدًا إلى العرض الناتج ومقياسه.

في 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());

إعداد Python

راجِع صفحة بيئة Python للحصول على معلومات حول واجهة برمجة التطبيقات Python واستخدام geemap للتطوير التفاعلي.

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 بمقياس درجة واحدة. إذا لم يكن هذا الإسقاط التلقائي مناسبًا للتحليل (على سبيل المثال، إذا كان غير دقيق أو إذا كنت بحاجة إلى منع تشوّهات إعادة أخذ العينات في العمليات الحسابية اللاحقة، مثل تحليل التضاريس)، يمكنك ضبط قيمة تلقائية مختلفة باستخدام image.setDefaultProjection(crs). يضمن ذلك أنّه إذا احتاجت Earth Engine إلى اختيار إسقاط لحساب يتضمّن الصورة، ستستخدم الإسقاط المحدّد بدلاً من 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());

إعداد Python

راجِع صفحة بيئة Python للحصول على معلومات حول واجهة برمجة التطبيقات Python واستخدام geemap للتطوير التفاعلي.

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);

إعداد Python

راجِع صفحة بيئة Python للحصول على معلومات حول واجهة برمجة التطبيقات Python واستخدام geemap للتطوير التفاعلي.

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 (مثل slope وaspect وhillshade) إلى حساب القيم استنادًا إلى وحدات البكسل المجاورة، وهي حساسة لتأثيرات إعادة التشكيل التي تحدث أثناء إعادة العرض. عندما يختلف إسقاط الحساب عن الإسقاط الأصلي لنموذج التضاريس الرقمي، يمكن أن يؤدي إعادة أخذ العينات باستخدام طريقة أقرب جار تلقائيًا إلى إنشاء أنماط اصطناعية في الناتج. للحصول على أفضل النتائج، عليك إجراء تحليل التضاريس باستخدام نظام الإسقاط الأصلي لنموذج التضاريس الرقمي. في حال العمل باستخدام ImageCollection من مربّعات DEM، أنشئ فسيفساء واستخدِم setDefaultProjection() مع الإسقاط الأصلي للمجموعة لضمان تنفيذ التحليل على الشبكة الصحيحة، كما هو موضّح في قسم الإسقاط التلقائي.

هناك عدة أسباب تجعلك تتجنّب استخدام 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');

إعداد Python

راجِع صفحة بيئة Python للحصول على معلومات حول واجهة برمجة التطبيقات Python واستخدام geemap للتطوير التفاعلي.

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 تلقائيًا من أجل عرض النتيجة على الخريطة. لاحظ أيضًا أنّ المعلومات حول نوع العرض الذي سيتم استخدامه تنتقل من الطلب إلى الإدخال.

إعادة العرض
الشكل 2. مخطط انسيابي للعمليات التي تتوافق مع إعادة عرض صورة MODIS في خريطة "محرّر الأكواد" تشير الخطوط المنحنية إلى تدفق المعلومات إلى عمليات إعادة العرض، وتحديدًا إلى عرض الإخراج ومقياسه.