العمليات الحسابية باستخدام الصور

بعد أن تعرّفت على كيفية تحميل صورة وعرضها، حان الوقت لتطبيق عملية حسابية عليها. على سبيل المثال، يمكنك حساب ميل التضاريس من خلال تمرير صورة الارتفاع SRTM إلى طريقة slope في حزمة ee.Terrain.

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

// Load the SRTM image.
var srtm = ee.Image('CGIAR/SRTM90_V4');

// Apply an algorithm to an image.
var slope = ee.Terrain.slope(srtm);

// Display the result.
Map.setCenter(-112.8598, 36.2841, 9); // Center on the Grand Canyon.
Map.addLayer(slope, {min: 0, max :60}, 'slope');

يُرجى العِلم أنّه في الرمز ee.Terrain.slope(srtm)، يتم تقديم الصورة srtm كوسيطة لخوارزمية الانحدار. يجب أن تبدو النتيجة على النحو التالي الشكل 3.

Tutorial_api_03_slope.png
الشكل 3. صورة المنحدر

Image math

تتضمّن الفئة ee.Image أيضًا طرقًا يمكن استدعاؤها على كائن صورة. على سبيل المثال، لنفترض أنّك تريد إجراء بعض العمليات الحسابية باستخدام نطاقات الصور (تُعرف أحيانًا باسم العمليات الحسابية للنطاقات أو جبر الخرائط). على سبيل المثال، قد تكون مهتمًا بإجراء عمليات مثلثية على صورة نسبة العرض إلى الارتفاع. لإجراء ذلك، عليك أولاً تحويل صورة نسبة العرض إلى الارتفاع إلى راديان، ثم استدعاء sin() عليها. بإعادة استخدام صورة srtm،

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

// Get the aspect (in degrees).
var aspect = ee.Terrain.aspect(srtm);

// Convert to radians, compute the sin of the aspect.
var sinImage = aspect.divide(180).multiply(Math.PI).sin();

// Display the result.
Map.addLayer(sinImage, {min: -1, max: 1}, 'sin');

يجب أن تبدو النتيجة مشابهة للشكل 4. ننصحك بإلقاء نظرة عن كثب على aspect.divide(180).multiply(Math.PI).sin() الرمز. من خلال ربط طرق متعددة بهذه الطريقة، يقول الرمز البرمجي "اقسم نسبة العرض إلى الارتفاع على 180، واضرب الناتج في π، ثم احسب الجيب". يمكنك إجراء عمليات رياضية معقّدة على الصور من خلال الجمع بين الطرق بهذه الطريقة. يمكنك الاطّلاع على مستندات Image للحصول على قائمة كاملة بالعمليات الرياضية، مثل add() وsubtract() وmultiply() وغيرها.

Tutorial_api_04_sin.png
الشكل 4. جيب زاوية ميل التضاريس

إحصاءات الصور

تتضمّن فئة أخرى مفيدة من العمليات على الصور احتساب إحصاءات وحدات البكسل في مناطق الصور أو تراكبات الصور النقطية والمتجهة. لاحتساب الإحصاءات في Earth Engine، استخدِم مخفِّضًا كما هو ممثّل بفئات في الحزمة ee.Reducer. على سبيل المثال، لنفترض أنّك مهتم بمتوسط الارتفاع في منطقة معيّنة. يمكنك تحديد منطقة من خلال رسم مضلّع باستخدام أدوات رسم الأشكال الهندسية. لرسم منطقة بشكل تفاعلي، احصل على أداة رسم المضلّع ()، ثم رقمن مضلّعًا فوق المنطقة التي تهمّك وانقر على خروج عند الانتهاء. يُرجى العِلم أنّه يتم تلقائيًا تسمية العنصر الناتج ee.Geometry باسم geometry وإضافته كعملية استيراد في أعلى النص البرمجي. أعِد تسمية هذا المتغيّر إلى "polygon" من خلال النقر على اسم المتغيّر في عمليات الاستيراد وكتابة الاسم الجديد.

بعد ذلك، احصل على متوسط قيمة البكسل في المضلّع باستخدام الرمز التالي:

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

// Compute the mean elevation in the polygon.
var meanDict = srtm.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: polygon,
  scale: 90
});

// Get the mean from the dictionary and print it.
var mean = meanDict.get('elevation');
print('Mean elevation', mean);

هناك عدة نقاط يجب أخذها في الاعتبار هنا. في البداية، لاحظ أنّ reduceRegion() هي دالة متاحة لكائنات Image (مزيد من المعلومات حول تقليل المناطق هنا). ثانيًا، يتم تقديم وسيطات الطريقة في كائن JavaScript يتم تمريره كوسيطة واحدة. (على وجه التحديد، تكون مفاتيح العنصر هي أسماء مَعلمات الطريقة. القيم هي وسيطات الطريقة). ثانيًا، تحدّد المَعلمة reducer نوع الإحصاء المطلوب احتسابه، وتحدّد المَعلمة geometry المنطقة التي سيتم احتساب الإحصاء فيها. المَعلمة scale هي حجم البكسل بالمتر الذي سيتم استخدامه. لتجنُّب الغموض، عليك دائمًا تحديد المقياس عند إجراء عمليات التصغير، لأنّ Earth Engine قد لا يتمكّن من تحديد المقياس المناسب تلقائيًا من المدخلات. (مزيد من المعلومات حول المقياس في Earth Engine)

أخيرًا، القيمة المعروضة للدالة reduceRegion() هي قاموس تكون فيه المفاتيح هي أسماء النطاقات والقيم هي إحصاءات البكسل للنطاقات. تعرض الطريقة get() في القاموس القيمة المقابلة للمفتاح المقدَّم كوسيطة. في هذه الحالة، تحتوي الصورة srtm على نطاق واحد، وهو "الارتفاع"، لذا يحصل رمز المثال على هذه الإحصائية من القاموس ويعرضها.

عند تشغيل هذه الرمز، إذا ظهر لك خطأ يشبه ما يلي:

لا تقلق! هناك عدّة إجراءات يمكنك اتّخاذها لحلّ الخطأ. تتضمّن طريقة reduceRegion() عملية تحقّق للتأكّد من أنّك أخذت في الاعتبار ما إذا كنت تريد حقًا تضمين العديد من وحدات البكسل في عملية الحساب. والهدف من ذلك هو منعك من تنفيذ إجراءات غير منطقية عن طريق الخطأ، مثل محاولة حساب متوسط قيمة كل بكسل يبلغ طول ضلعه مترًا واحدًا في العالم (لا تفعل ذلك). لحلّ الخطأ، يمكنك ضبط المَعلمة bestEffort على true من خلال إضافة bestEffort: true إلى قاموس المَعلمات، أو ضبط المَعلمة maxPixels على قيمة أعلى من القيمة التلقائية البالغة 10 ملايين بكسل، أو إجراء كلا الإجراءَين. إذا كانت قيمة bestEffort هي True، ستعيد Earth Engine تلقائيًا احتساب المقياس بحيث لا تتجاوز القيمة maxPixels.

استطراد: المقياس في Earth Engine

في المثال السابق، تم ضبط قيمة scale على الدقة الأصلية لصورة SRTM تقريبًا. يمكنك معرفة الدقة الأصلية للصورة من خلال:

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

var scale = srtm.projection().nominalScale();
print('SRTM scale in meters', scale);

إذا حدّدت مقياسًا أصغر من درجة الدقة الأصلية، ستعيد Earth Engine أخذ عينات من الصورة المدخلة باستخدام طريقة أقرب جار، ثم ستضمّن جميع وحدات البكسل الأصغر في العملية الحسابية. إذا ضبطت المقياس على قيمة أكبر، سيستخدم Earth Engine وحدات بكسل من نسخة مجمّعة من الإدخال (أي سيحصل على وحدات بكسل من مستوى أعلى من هرم الصور). مزيد من المعلومات حول طريقة تعامل Earth Engine مع المقياس في هذا المستند

حتى الآن، كنت تعمل على صورة واحدة بنطاق واحد. في الصفحة التالية، ستتعرّف على صور النطاقات المتعددة ومجموعات الصور.