العمليات الحسابية

يمكن إجراء العمليات الحسابية على الصور باستخدام عوامل مثل add() و subtract()، ولكن بالنسبة إلى العمليات الحسابية المعقدة التي تحتوي على أكثر من عنصرَين، توفّر الدالة expression() بديلاً جيدًا. اطّلِع على الأقسام التالية للحصول على مزيد من المعلومات عن المشغِّلات و التعبيرات.

عوامل التشغيل

تُجري عوامل التشغيل الحسابية عمليات حسابية أساسية على نطاقات الصور. تأخذ هذه الوظائف مدخلتَين: إما صورتَين أو صورة واحدة ومصطلح ثابت، يتم تفسيره على أنّه صورة ثابتة أحادية النطاق بدون أيّ بكسل مُخفَّى. يتم تنفيذ العمليات لكل بكسل في كل نطاق.

على سبيل المثال الأساسي، نأخذ مهمة احتساب مؤشر الاختلاف النباتي (NDVI) باستخدام صور VIIRS، حيث يتم استخدام عوامل التشغيل add() وsubtract() وdivide():

محرِّر الرموز البرمجية (JavaScript)

// Load a VIIRS 8-day surface reflectance composite for May 2024.
var viirs202405 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-05-01', '2024-05-16')).first();

// Compute NDVI.
var ndvi202405 = viirs202405.select('SurfReflect_I2')
  .subtract(viirs202405.select('SurfReflect_I1'))
  .divide(viirs202405.select('SurfReflect_I2')
    .add(viirs202405.select('SurfReflect_I1')));

إعداد لغة Python

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

import ee
import geemap.core as geemap

Colab (Python)

# Load a VIIRS 8-day surface reflectance composite for May 2024.
viirs202405 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-05-01', '2024-05-16'))
    .first()
)

# Compute NDVI.
ndvi202405 = (
    viirs202405.select('SurfReflect_I2')
    .subtract(viirs202405.select('SurfReflect_I1'))
    .divide(
        viirs202405.select('SurfReflect_I2').add(
            viirs202405.select('SurfReflect_I1')
        )
    )
)

لا يتمّ اعتبار سوى تقاطع البكسلات غير المُعرَّاة بين الإدخالَين وإرجاعها على أنّها غير مُعرَّاة، ويتمّ حجب كلّ ما عدا ذلك. بشكل عام، إذا كان أيّ من الإدخالَين يحتوي على سحابة واحدة فقط، يتم استخدامها مع جميع السحابات في الإدخال الآخر. إذا كانت المدخلات تحتوي على عدد النطاقات نفسه، ولكن ليس الأسماء نفسها، يتم استخدامها بشكلٍ ثنائي بالترتيب الطبيعي. يتم تسمية نطاقات المخرج حسب المدخل الأطول، أو إذا كانا متساويين في الطول، يتم تسميتها بترتيب المدخل الأول. نوع وحدات البكسل الناتجة هو تجميع لأنواع الإدخال.

يوضّح المثال التالي لاقتطاع الصور المتعدّدة النطاقات كيفية مطابقة النطاقات تلقائيًا، ما يؤدي إلى إنشاء "متجه تغيير" لكل بكسل لكل نطاق متزامن.

محرِّر الرموز البرمجية (JavaScript)

// Load a VIIRS 8-day surface reflectance composite for September 2024.
var viirs202409 = ee.ImageCollection('NASA/VIIRS/002/VNP09H1').filter(
  ee.Filter.date('2024-09-01', '2024-09-16')).first();

// Compute multi-band difference between the September composite and the
// previously loaded May composite.
var diff = viirs202409.subtract(ndvi202405);
Map.addLayer(diff, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: -1,
  max: 1
}, 'difference');

// Compute the squared difference in each band.
var squaredDifference = diff.pow(2);
Map.addLayer(squaredDifference, {
  bands: ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
  min: 0,
  max: 0.7
}, 'squared diff.');

إعداد لغة Python

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

import ee
import geemap.core as geemap

Colab (Python)

# Load a VIIRS 8-day surface reflectance composite for September 2024.
viirs202409 = (
    ee.ImageCollection('NASA/VIIRS/002/VNP09H1')
    .filter(ee.Filter.date('2024-09-01', '2024-09-16'))
    .first()
)

# Compute multi-band difference between the September composite and the
# previously loaded May composite.
diff = viirs202409.subtract(ndvi202405)

m = geemap.Map()
m.add_layer(
    diff,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': -1,
        'max': 1,
    },
    'difference',
)

# Compute the squared difference in each band.
squared_difference = diff.pow(2)

m.add_layer(
    squared_difference,
    {
        'bands': ['SurfReflect_I1', 'SurfReflect_I2', 'SurfReflect_I3'],
        'min': 0,
        'max': 0.7,
    },
    'squared diff.',
)
display(m)

في الجزء الثاني من هذا المثال، يتم احتساب الفرق المربّع باستخدام image.pow(2). للاطّلاع على القائمة الكاملة للعوامل الحسابية التي تتعامل مع العمليات الحسابية الأساسية والدوالّ المثلثية والأسس والعمليات التقريبية وعمليات التحويل والعمليات على الوحدات البتية وغيرها، يُرجى الاطّلاع على مستندات واجهة برمجة التطبيقات.

التعبيرات

لتنفيذ تعبيرات رياضية أكثر تعقيدًا، ننصحك باستخدام image.expression()، الذي يفكّر تمثيلًا نصيًا لعملية رياضية. يستخدِم المثال التالي expression() لاحتساب مُعدّل الغطاء النباتي المحسَّن (EVI):

محرِّر الرموز البرمجية (JavaScript)

// Load a Landsat 8 image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');

// Compute the EVI using an expression.
var evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {
      'NIR': image.select('B5'),
      'RED': image.select('B4'),
      'BLUE': image.select('B2')
});

Map.centerObject(image, 9);
Map.addLayer(evi, {min: -1, max: 1, palette: ['a6611a', 'f5f5f5', '4dac26']});

إعداد لغة Python

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

import ee
import geemap.core as geemap

Colab (Python)

# Load a Landsat 8 image.
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')

# Compute the EVI using an expression.
evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',
    {
        'NIR': image.select('B5'),
        'RED': image.select('B4'),
        'BLUE': image.select('B2'),
    },
)

# Define a map centered on San Francisco Bay.
map_evi = geemap.Map(center=[37.4675, -122.1363], zoom=9)

# Add the image layer to the map and display it.
map_evi.add_layer(
    evi, {'min': -1, 'max': 1, 'palette': ['a6611a', 'f5f5f5', '4dac26']}, 'evi'
)
display(map_evi)

يُرجى ملاحظة أنّ الوسيطة الأولى للدالة expression() هي التمثيل النصي للعملية الحسابية، والوسيطة الثانية هي قاموس تتألف مفاتيحه من أسماء المتغيّرات المستخدَمة في التعبير والقيم هي نطاقات الصورة التي يجب ربط المتغيّرات بها. قد تتم الإشارة إلى النطاقات في الصورة باسم b("band name") أو b(index)، على سبيل المثال b(0)، بدلاً من تقديم القاموس. يمكن تحديد النطاقات من صور أخرى غير الصورة المُدخلة عند استخدام قاموس خريطة النطاقات. يُرجى العِلم أنّ دالة expression() تستخدِم "القسمة الصحيحة" التي تتجاهل الباقي وتُعرِض عددًا صحيحًا عند قسمة عددَين صحيحَين. على سبيل المثال، 10 / 20 = 0. لتغيير هذا السلوك، اضرب أحد الم Operand بأحد القيم التالية: 1.0: 10 * 1.0 / 20 = 0.5. لا يتمّ أخذ سوى تقاطع البكسلات غير المُعرَّاة في الاعتبار، ويتمّ عرضها على أنّها غير مُعرَّاة عند تقييم نطاقات من أكثر من صورة مصدر واحدة. يتم إدراج عوامل التعبيرات المتوافقة في الجدول التالي.

عوامل التشغيل في expression()
النوع الرمز الاسم
الحساب + - * / % ** إضافة وطرح وضرب وقسمة ومعامل وعدد أسي
العلاقات == != < > <= >= يساوي، لا يساوي، أقل من، أكبر من، وما إلى ذلك
منطقي && || ! ^ And وOr وNot وXor
ثلاثي ? : If then else