دليل مبتدئين لمحاكاة الغمر نتيجة الفيضان باستخدام Python وبيانات الارتفاع الرقمي
محاكاة غمر الفيضان باستخدام بايثون وبيانات الارتفاع: دليل للمبتدئين في السنوات الأخيرة، أصبحت الفيضانات أكثر تكرارًا وتدميرًا في جميع أنحاء العالم، نتيجة لتأثيرات التغير المناخي. في هذا السياق، يلعب نمذجة الفيضان دورًا مهمًا في تقييم المخاطر وعمليات الاستجابة للASTERIX، بينما تظل أيضًا نقطة تركيز رئيسية للأبحاث والدراسات الأكاديمية المتقدمة. في هذا المقال، سنقوم بإنشاء نموذج أساسي لغمر الفيضان باستخدام لغة البرمجة بايثون ونموذج ارتفاع رقمي (DEM). سنستخدم تقنية الفيضان التدريجي (flood fill) لمحاكاة كيفية تأثير مستويات المياه المرتفعة تدريجيًا على المناظر الطبيعية، وسنسجل عملية الغمر بمرور الوقت. هذا طريقة مرئية ومباشرة لاستكشاف البيانات الجغرافية المكانية ومخاطر الفيضان، حتى بدون خلفية في نمذجة المياه. ما هو نموذج الارتفاع الرقمي (DEM) نموذج الارتفاع الرقمي (DEM) هو تمثيل رياضي لسطح الأرض، حيث يحتوي كل خلية (أو بكسل) في شبكة منتظمة (معروفة باسم بيانات الرستر) على قيمة ارتفاع. على عكس الصور الرقمية التي تخزن معلومات اللون، يخزن DEM بيانات الارتفاع، عادةً ما يستبعد ميزات السطح مثل النباتات والمباني وغيرها من الهياكل البشرية. تُستخدم DEMs بشكل شائع في مجالات مثل الخرائط، الهيدرولوジー، مراقبة البيئة، وعلوم الأرض. تعمل كمجموعة بيانات أساسية لأي تطبيق يتطلب فهمًا دقيقًا للتضاريس والارتفاعات. سنستخدم في هذا المقال DEM مقدمًا من برنامج USGS الوطني للجغرافيا المكانية، وهو متاح مجانًا ومرخص للجمهور العام. ملاحظة: البيانات المقدمة من USGS لها دقة空间分辨率为1弧秒(大约赤道处为30米)。 دراسة المنطقة محل الاهتمام المنطقة محل الاهتمام (AOI) في هذه الدراسة تقع في شمال شرق البرازيل. يغطي ملف DEM تقاطعات من 6° جنوب، 39° غرب إلى 5° جنوب، 38° غرب، ويستخدم نظام الإحداثيات WGS84 (EPSG: 4326)، كما هو موضح أدناه. المنطقة محل الاهتمام (صورة بواسطة الكاتب باستخدام Google Maps و QGIS) كيفية تحميل وعرض بيانات الارتفاع باستخدام بايثون سنستخدم بايثون لإعداد بيئة قابلة للتطبيق لعرض وتحليل بعض المعلومات الأولية حول بيانات DEM. أولاً، لنستورد المكتبات اللازمة. ```python استيراد المكتبات import rasterio import matplotlib.pyplot as plt import numpy as np from matplotlib.animation import FuncAnimation ``` ثم، سنستخدم مكتبة rasterio لفتح وعرض ملف DEM للمنطقة محل الاهتمام. ```python دالة مساعدة لتحميل ملفات DEM def load_dem(path): with rasterio.open(path) as src: dem = src.read(1) transform = src.transform nodata = src.nodata if nodata is not None: # حجب قيم البيانات المفقودة dem = np.ma.masked_equal(dem, nodata) return dem, transform ``` هذه الدالة تقرأ بيانات الارتفاع وتتحقق مما إذا كان الملف يحتوي على "قيم بيانات مفقودة". تستخدم هذه القيم لتمثيل المناطق التي لا تحتوي على بيانات ارتفاع صالحة (مثل خارج التغطية أو البكسلات التالفة). إذا كانت هناك قيمة بيانات مفقودة، تقوم الدالة بتعويض تلك البكسلات بـ np.nan، مما يجعل التعامل معها أو تجاهلها في التحليلات والتصورات اللاحقة أسهل. عرض بيانات DEM ```python dem = load_dem("s06_w039_1arc_v3.tif") plt.imshow(dem, cmap='terrain') plt.title("نموذج الارتفاع الرقمي") plt.colorbar(label="ارتفاع (م)") plt.show() ``` كما نرى، المحاور في إحداثيات البكسل (الأعمدة والسطور). لفهم أفضل لمخاطر الفيضان، من الضروري معرفة الإحداثيات الجغرافية (خط العرض وخط الطول) المرتبطة بكل بكسل من الصورة. لتحقيق ذلك، سنستخدم بيانات نظام الإحداثيات المرجعي من ملف DEM. كما تم ذكره سابقًا، يستخدم DEM الذي نستخدمه نظام الإحداثيات WGS84 (EPSG: 4326). يمكن تعديل الدالة المساعدة لتحميل ملفات DEM كالتالي: ```python def load_dem(path): with rasterio.open(path) as src: dem = src.read(1) transform = src.transform nodata = src.nodata if nodata is not None: # حجب قيم البيانات المفقودة dem = np.ma.masked_equal(dem, nodata) return dem, transform ``` تسترجع هذه الدالة بيانات transform من ملف DEM، وهي كائن affine يربط مواقع البكسل (الصف، العمود) بالإحداثيات الجغرافية (خط العرض وخط الطول). لتمثيل الإحداثيات الجغرافية على محور الرسم، سيكون من الضروري استكشاف معلمة extent من دالة imshow(). ```python dem, transform = load_dem("s06_w039_1arc_v3.tif") حساب extent من transform extent = [ transform[2], # xmin (خط الطول) transform[2] + transform[0] * dem.shape[1], # xmax transform[5] + transform[4] * dem.shape[0], # ymin (خط العرض) transform[5] # ymax ] الرسم باستخدام الإحداثيات الجغرافية fig, ax = plt.subplots() img = ax.imshow(dem, cmap='terrain', extent=extent, origin='upper') ax.set_xlabel('خط الطول') ax.set_ylabel('خط العرض') plt.colorbar(img, label='ارتفاع (م)') plt.title('توضيح DEM') plt.show() ``` تستخدم معلمة extent لتعريف حدود DEM في الرسم باستخدام قيم مشتقة من كائن transform affine. تقوم بتعيين خطوط العرض والطول الدنيا والعليا (xmin, xmax, ymin, ymax) بحيث يظهر الرسم الإحداثيات بدلاً من مؤشرات البكسل. النتيجة النهائية: توضيح DEM مع الإحداثيات الجغرافية (مصدر: U.S. Geological Survey) كيفية محاكاة سيناريوهات الفيضان باستخدام حدود الارتفاع الآن، سنوضح طريقة بسيطة ومعينة لعرض سيناريوهات الفيضان ومحاكاة الغمر. تتكون من تعريف حد ارتفاع وإنشاء قناع ثنائي يحدد جميع المناطق التي يكون ارتفاعها أقل من هذا المستوى. في هذا المثال، نحاكي الفيضان في جميع المناطق التي يكون ارتفاعها أقل من 40 مترًا. ```python flood_threshold = 40 # متر flood_mask = (dem <= flood_threshold).astype(int) plt.imshow(flood_mask, extent=extent, cmap='Blues') plt.title(f"منطقة الغمر (حد: {flood_threshold} م)") plt.xlabel("خط الطول") plt.ylabel("خط العرض") plt.show() ``` ببضع بضعة أسطر من الكود، يمكننا تصور تأثير سيناريوهات الفيضان المختلفة على المنطقة محل الاهتمام (AOI). ومع ذلك، بسبب طبيعة هذا التصور الثابت، لا يظهر كيف يتطور الفيضان بمرور الوقت. لمعالجة ذلك، سنستخدم FuncAnimation من matplotlib لإنشاء تصور ديناميكي. كيفية تأنيث تقدم الفيضان باستخدام بايثون الآن، سنحاكي سيناريو تقدم الفيضان بشكل تدريجي بزيادة مستوى المياه تدريجيًا وإنشاء قناع جديد في كل خطوة. سنقوم بوضع هذا القناع على صورة التضاريس وتأنيثه. ```python flood_levels يحدد مدى ارتفاع الفيضان في كل إطار flood_levels = np.arange(15, 100, 5) إعداد الشكل والمحور fig, ax = plt.subplots() img = ax.imshow(dem, cmap='terrain', extent=extent, origin='upper') flood_overlay = ax.imshow(np.zeros_like(dem), cmap='Blues', alpha=0.4, extent=extent, origin='upper') title = ax.set_title("") ax.set_xlabel("خط الطول") ax.set_ylabel("خط العرض") دالة تأنيث def update(frame): level = flood_levels[frame] mask = np.where(dem <= level, 1, np.nan) flood_overlay.set_data(mask) title.set_text(f"مستوى الفيضان: {level} م") return flood_overlay, title إنشاء التأنيث ani = FuncAnimation(fig, update, frames=len(flood_levels), interval=300, blit=True) plt.tight_layout() plt.show() حفظ النتيجة كملف GIF ani.save("flood_simulation.gif", writer='pillow', fps=5) ``` تقدم الفيضان (مصدر: U.S. Geological Survey) إذا كنت مهتمًا بإنشاء تأنيثات باستخدام بايثون، فإن هذا الدليل خطوة بخطوة هو مكان رائع للبدء. الاستنتاج والخطوات التالية في هذا المقال، إنشاءنا مسار عمل أساسي لإجراء محاكاة للغمر في بايثون باستخدام بيانات الارتفاع من ملف DEM. بالطبع، هذا النموذج لا يطبق التقنيات الأكثر تقدمًا في الموضوع، ولكنه لغرض التوضيح والاتصال، يعتبر طريقة عتبة الارتفاع قوية ومتاحة. تقنيات محاكاة أكثر تقدمًا تشمل: نمذجة الهيدرولوژية الديناميكية استخدام البيانات التاريخية والتنبؤية تكامل النماذج مع أنظمة المعلومات الجغرافية (GIS) ومع ذلك، يمكن لهذا النهج المباشر أن يكون ذو فائدة كبيرة للمعلمين، الطلاب، والمحاليلين الذين يستكشفون بيانات الجغرافيا المكانية في دراسات الاستجابة للASTERIX والنماذج البيئية. الكود الكامل متاح هنا. أشجع القراء بشدة على تجربة الكود باستخدام بيانات ارتفاع خاصة بهم، تكييفه لسياقهم الخاص، واستكشاف طرق لتعزيز أو توسيع هذا النهج. تقييم الحدث من قبل المختصين وفقًا للمختصين في مجال الجغرافيا المكانية، تعتبر نماذج الغمر البسيطة مثل هذه خطوة مهمة نحو فهم أفضل لمخاطر الفيضان. رغم أنها قد تكون أقل دقة من النماذج المتقدمة، إلا أنها تقدم نظرة عامة مرئية وواضحة يمكن أن تستفيد منها الجهات المعنية في التخطيط والاستجابة للأزمات. نبذة تعريفية عن USGS المسح الجيولوجي الأمريكي (USGS) هو وكالة فيدرالية تابعة لوزارة الداخلية الأمريكية، تعمل على توفير بيانات جغرافية مكانية دقيقة وموثوقة مجانًا للجمهور. تعد هذه البيانات أساسية للعديد من التطبيقات في مجالات مثل التخطيط الحضري، الهندسة، وعلم البيئة.