كل المقالات
الاستشعار عن بعد
28 سبتمبر 2026 · قراءة 8 دقائق · أمين عدنان قاسم

رسم خرائط مخاطر الفيضانات على النيل الأزرق داخل المتصفح بالكامل

رادار Sentinel-1، والتضاريس، والأمطار، وأنهار OpenStreetMap، مجتمعة على جهاز المستخدم دون خادم

في الفيضان القياسي في سبتمبر 2020، ترصد اللوحة نحو 172 كم² من مياه الفيضان الجديدة على امتداد النيل الأزرق حول سنار والجزيرة. تنزيل الرادار، وفك ترميز التضاريس، وتحويلات المسافة، ونموذج المخاطر، كلها تجري في متصفح الزائر، في نحو 13 ثانية على حاسوب محمول.

افتح لوحة مخاطر فيضانات النيل الأزرق ←


لماذا بنيتها بهذه الطريقة

رسم خرائط الفيضانات يعني عادةً محطة عمل للاستشعار عن بعد، وبيئة Python مع GDAL، وخادمًا لنشر النتيجة. وهذه بنية تحتية كبيرة لمكتب ميداني أو فريق منظمة غير حكومية أو طالب في السودان.

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

منطقة الدراسة هي النيل الأزرق حول سنار والجزيرة (32–35° شرقًا، 12–15° شمالًا): نحو 330 × 330 كم من سهل طيني مستوٍ، يضم مشروع الجزيرة للري، حيث كان فيضان 2020 الأسوأ على الإطلاق.

ماذا وجدت

المقياس (الحدث الافتراضي)القيمة
تاريخ الفيضان مقابل خط الأساسسبتمبر 2020 مقابل يوليو 2020
مياه الفيضان الجديدة المرصودةنحو 172 كم²
شبكة التحليلخلايا نحو 300 م، 1,100 × 1,130 (1.2 مليون خلية)
دقة قراءة الرادارنحو 150 م
زمن المسار الكاملنحو 13 ثانية على حاسوب محمول
صورتا رادار من Sentinel-1 للنيل الأزرق قرب سنار. في سبتمبر 2020 تنتشر مياه الفيضان الجديدة (بالأزرق) على الضفتين؛ ومجرى النهر الدائم داكن في كلتيهما.
الشكل 1. قناة VV من Sentinel-1 قرب سنار، يوليو مقابل سبتمبر 2020. الأزرق يشير إلى مياه الفيضان الجديدة التي وجدتها قاعدة اللوحة: داكنة في VV وVH معًا، ولم تكن ماءً في يوليو.

عند التكبير قرب سنار، يظهر النيل الأزرق مياهًا دائمة، مع بقع مغمورة تنتشر على ضفتيه.

كيف يعمل

  1. الجلب: رادار Sentinel-1 لتاريخ خط أساس وتاريخ فيضان، وtiles التضاريس، والأمطار، وشبكة الأنهار.
  2. فك الترميز: كل tile إلى شبكة مشتركة واحدة، دون إعادة إسقاط.
  3. الاشتقاق: الانحدار، والمسافة إلى أقرب نهر، والارتفاع فوق ذلك النهر.
  4. الرصد: المياه في التاريخين، ثم فصل مياه الفيضان الجديدة عن المياه الدائمة.
  5. التقييم: كل خلية بنموذج مخاطر موزون وشفاف.
  6. الرسم: النتيجة على الخريطة؛ غيّر أي شريط تمرير وأعِد الحساب فورًا.
ستة مربعات من اليسار إلى اليمين: الجلب، فك الترميز، الاشتقاق، الرصد، التقييم، الرسم.
الشكل 2. مسار العمل ذو الخطوات الست، وكله يعمل في متصفح الزائر.

الحزمة التقنية

الطبقةالمكتبة / الخدمةالدور
الإطارNext.js 14، React 18، TypeScriptصفحة ثابتة، والحالة، والواجهة
الواجهةMaterial UI 5الشريط الجانبي، وأشرطة التمرير، وبطاقات الإحصاءات
الخريطةMapLibre GL JS 5 عبر react-map-gl 8خريطة WebGL، وتظليل التضاريس، وطبقات نقطية ومتجهية
الرادارMicrosoft Planetary Computer ‏(Sentinel-1 RTC)، أو واجهة Process API من Sentinel Hub / Copernicus Data Spaceالانتثار الراجع VV/VH
التضاريسAWS Terrain Tiles ‏(Terrarium) أو MapTiler Terrain-RGBالارتفاعات
الأمطارواجهة Open-Meteo للطقس التاريخيالهطول اليومي
الأنهارOpenStreetMap عبر Overpass APIشبكة الأنهار
المعالجةTypeScript عادي على مصفوفات typed، وCanvas 2D، وcreateImageBitmapفك الترميز، وتحويلات المسافة، والنموذج

لا توجد أي مكتبة نظم معلومات جغرافية في الحزمة: لا GDAL، ولا proj4، ولا محلل GeoTIFF. والشبكة هي ما يجعل ذلك ممكنًا.

شبكة واحدة تطابق الخريطة

كل طبقة تحليل موجودة على شبكة بكسلات Web Mercator لمستوى تكبير واحد، مقصوصة على منطقة الدراسة. وعند مستوى التكبير 9 يكون ذلك نحو 300 م للخلية.

ولأن tiles الخريطة تستخدم الشبكة نفسها تمامًا، يقع كل بكسل في الـtile على خلية واحدة بالضبط: لا إعادة إسقاط ولا إعادة معاينة. وحين تُرسم نتيجة على canvas، تنزل على الخريطة مصدرَ صورة في MapLibre بإحداثيات أركانه الأربعة وتتطابق تمامًا.

الجزء الدقيق الوحيد هو استخراج القيم الخام من الـtile. فالمتصفحات تدير ألوان الصور افتراضيًا، وهذا يفسد البيانات المرمّزة بصمت، لذا تُفك الـtiles هكذا:

const bitmap = await createImageBitmap(blob, {
  colorSpaceConversion: 'none',
  premultiplyAlpha: 'none',
});
ctx.drawImage(bitmap, 0, 0);
const pixels = ctx.getImageData(0, 0, bitmap.width, bitmap.height);

الارتفاعات من RGB

تخزّن tiles التضاريس الارتفاع في قنوات الألوان. ويفك المتصفح كل بكسل إلى Float32Array:

  • Terrarium (من AWS، بلا مفتاح): h = R × 256 + G + B / 256 − 32768
  • Terrain-RGB من Mapbox / MapTiler: h = (R × 65536 + G × 256 + B) × 0.1 − 10000

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

الأنهار وتحويل مسافة دقيق

تأتي شبكة الأنهار حية من OpenStreetMap عبر Overpass. وخوادم Overpass العامة مزدحمة غالبًا؛ فقد رأيت أثناء التطوير أخطاء 504 واستجابة استغرقت 85 ثانية. لذا تبدأ الصفحة من نسخة محفوظة مرفقة وتستبدلها بالنتيجة الحية حين يستجيب أحد الخوادم.

تُحوَّل خطوط الأنهار إلى خلايا على الشبكة. ثم يجري تحويل مسافة إقليدية دقيق (Felzenszwalb وHuttenlocher) في مرورين أحاديي البعد على 1.2 مليون خلية. ويعيد المسافة إلى أقرب نهر وأي خلية نهر هي، فيأتي الارتفاع فوق النهر بلا كلفة تقريبًا.

ويُطبَّق box blur على مستوى النهر المرجعي على 7.5 كم كي لا يقفز حيث تلتقي أحواض نهرين.

رصد الفيضانات بالرادار داخل المتصفح

يرى رادار Sentinel-1 عبر الغيوم، وهي بالضبط الظروف التي تحدث فيها الفيضانات. والمياه الهادئة تعمل كمرآة: تعكس نبضة الرادار بعيدًا عن القمر الصناعي (انعكاس مرآوي)، فتظهر داكنة جدًا في استقطابي VV وVH كليهما.

بلا مفتاح افتراضيًا. يمكن البحث في مجموعة sentinel-1-rtc في Planetary Computer ودمجها في موزاييك دون حساب. تسجّل الصفحة بحث STAC (المنطقة، والفترة الزمنية، والمشهد الأحدث أولًا) وتطلب الـtiles بتعبير لحساب النطاقات على الخادم يحوّل الانتثار الراجع إلى ديسيبل ويحجّمه إلى بايت:

expression = 10*log10(vv);10*log10(vh);10*log10(vv)
rescale    = -35,5
nodata     = -32768

نطاق 40 dB على 256 مستوى يعطي دقة نحو 0.16 dB، أقل بكثير من ضوضاء الرادار نفسه. يعيد المتصفح كل بايت إلى dB ويطبق القاعدة:

water           = VV < threshold AND VH < threshold
flood           = water on the flood date AND NOT water on the baseline date
permanent water = water on both dates

(الماء: VV وVH أقل من العتبة؛ الفيضان: ماء في تاريخ الفيضان ولم يكن ماءً في تاريخ خط الأساس؛ المياه الدائمة: ماء في التاريخين.)

ببيانات اعتماد. يستطيع الزوار الذين لديهم حساب في Sentinel Hub أو Copernicus Data Space تغيير المصدر. يعيد سكربت evalscript قيم VV/VH بالديسيبل للشبكة كلها في استدعاء واحد لواجهة Process API. ويجري تسجيل الدخول ببيانات عميل OAuth في المتصفح (نقطتا الرموز تسمحان بـCORS)، ولا يُخزَّن شيء.

درس من الاختبار. عند 300 م، يأخذ خادم الـtiles متوسط النهر مع ضفتيه، فيكفّ النيل الأزرق عن الظهور ماءً: نحو −16 dB بدل −20 إلى −25 dB. وكان الحل قراءة الرادار بمستوى تكبير أدق (نحو 150 م) وإعطاء النموذج نسبة الماء في كل خلية، بدل نعم/لا.

الأمطار بلا مفتاح

ليس لـCHIRPS ولا GPM IMERG واجهة يستطيع المتصفح استدعاءها دون هوية، لذا تأتي الأمطار من Open-Meteo. طلب واحد يغطي شبكة 7 × 7 من النقاط (49 موقعًا)؛ وتُجمع المجاميع على الفترة المختارة وتُستكمل خطيًا ثنائيًا لكل خلية.

نموذج مخاطر شفاف

يُحجَّم كل عامل إلى 0–1، حيث يعني 1 أكثر عرضة للفيضان:

  • انخفاض الارتفاع فوق أقرب نهر؛
  • استواء الانحدار؛
  • القرب من نهر (تناقص أُسّي)؛
  • الأمطار نسبةً إلى بقية المنطقة؛
  • نسبة الخلية المرصودة ماءً في الرادار.

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

القيود

هذا نموذج فرز أولي، وليس خريطة مخاطر معايَرة. اقرأه مع مراعاة هذه القيود:

  • لم يُتحقق منه بعد. لم تُقارن مساحة 172 كم² بخرائط فيضانات مستقلة لحدث 2020، مثل تحليلات UNOSAT.
  • العتبات تفوّت بعض المياه. النباتات والمباني المغمورة قد تظهر ساطعة لا داكنة في الرادار، فيُرصد منها أقل مما هو موجود.
  • وتلتقط بعض ما ليس ماءً. الأسطح الجافة الملساء جدًا وظل الرادار قد تبدو داكنة وتُحسب ماءً. والمقارنة بتاريخ خط الأساس تزيل معظم ذلك.
  • خلايا خشنة. عند 150–300 م تذوب القنوات الضيقة والحقول الصغيرة المغمورة في محيطها.
  • HAND مبسّط. يُقاس الارتفاع إلى أقرب نهر بخط مستقيم، لا على المسار الذي سيسلكه الماء فعلًا.
  • تضاريس عالمية. tiles الارتفاع المجانية تحمل أمتارًا من الضوضاء، وهذا مهم في سهل بهذا الاستواء.
  • أمطار خشنة. بيانات Open-Meteo التاريخية تأتي من إعادة تحليل شبكية، أخشن بكثير من شبكة التحليل.
  • تغطية رادار متقطعة. تغطية Sentinel-1 فوق السودان غير منتظمة في بعض السنوات؛ وتخبرك الصفحة حين تخلو فترة من المشاهد.

ماذا تعلمت

  • الواجهات البرمجية العامة التي تسمح بـCORS كافية لاستشعار عن بعد جاد. يغطي Planetary Computer وAWS Terrain Tiles وOpen-Meteo وOverpass الرادار والتضاريس والطقس والمتجهات دون مفتاح واحد.
  • طابِق شبكة الـtiles وتستطيع الاستغناء عن حزمة نظم معلومات جغرافية كاملة.
  • حساب النطاقات على الخادم مع الترميز بالبايت نمط قوي. يتولى الخادم الحساب النقطي الثقيل؛ ويتلقى المتصفح صور PNG صغيرة يستطيع فكها بدقة.
  • خطّط للخدمات المتقلبة بخوادم بديلة ونسخ محفوظة.
  • الدقة المكانية تغيّر الإجابة. «اختفى» النهر عند 300 م؛ وأعادته نسبة الماء عند 150 م.

الخطوات التالية

  • استبدال العتبات بنموذج مدرَّب. شبكة U-Net صغيرة مدرَّبة على معيار Sen1Floods11 (11 حدث فيضان حول العالم، ليس بينها السودان)، تُختبر على مشاهد السودان 2020 الموسومة يدويًا، وتعمل في المتصفح عبر ONNX Runtime Web. ستعرض اللوحة العتبات والنموذج جنبًا إلى جنب، مع دقة كل منهما.
  • التحقق مقابل خرائط مستقلة لفيضان 2020 ونشر المقارنة.
  • إضافة التعرض. عدّ السكان (WorldPop) والحقول المروية في مشروع الجزيرة داخل كل فئة مخاطر، كي تجيب الخريطة عن «من وماذا في خطر»، لا «أين» فقط.

إن كنت تعمل في التأهب للفيضانات أو الاستجابة الإنسانية في السودان وتريد هذا لنهر أو موسم آخر، تواصل معنا على [email protected].

افتح لوحة مخاطر فيضانات النيل الأزرق ←


البيانات: Copernicus Sentinel-1 عبر Microsoft Planetary Computer وSentinel Hub / Copernicus Data Space؛ وAWS Terrain Tiles؛ وMapTiler؛ وOpen-Meteo؛ و© المساهمون في OpenStreetMap.

خرائط الفيضانات
السودان
النيل الأزرق
Sentinel-1
الرادار
MapLibre
ذكاء جيومكاني بلا خوادم
CoffeeMap.dev

نحوّل البيانات إلى رؤى جيومكانية قابلة للتنفيذ

من إعداد أمين عدنان قاسم

© 2026 CoffeeMap.dev. جميع الحقوق محفوظة.