دراسة لتوسع مدينة القاهرة بواسطة صور الأقمار الصناعية وبرنامج QGIS

في هذا الدرس سنقوم بعملية تصنيف باستخدام خوارزميات مختلفة باستخدام بيانات مختلفة باستخدام اداة تصنيف جديدة باستخدام برنامج الـ QGIS باستخدام الإضافة Semi-Automatic Classification تحت الرابط التالي

وهو ملحق ل Qgis يسمح بالتصنيف شبه التلقائي لصور الاستشعار عن بعد. كما أنه يوفر العديد من الأدوات لتحميل الصور المجانية (لاندسات، سنتينل-2، سنتينل-3، أستير، موديس)، والمعالجة المسبقة للصور(انشاء موزاييك وعرض الصور انشاء تراكيب من القنوات ، المعالجة اللاحقة للتصنيفات،

وسأقوم في هذا الدرس بعمل مشروع مراقبة لمدينة القاهرة ودراسة توسع المدينة من عام 1984 حتى عام 2017 باستخدام أرشيف القمر لاند سات متابعة القراءة “دراسة لتوسع مدينة القاهرة بواسطة صور الأقمار الصناعية وبرنامج QGIS”

الحق في المدينة Right to the City

لقد تم غالباً فهم مصطلح الحرية بإطار معين ألا وهو الحريات السياسية والإعلامية والاجتماعية ويترافق هذا المصطلح غالباً مع مصطلح الديمقراطية الذي يضمن الحرية والعدالة للجميع وفق معايير معينة تضمنها الحكومات غالبا بما يتوافق مع المجتمع. ما سأطرحه حالياً لن يكون بعيداً كل البعد عن تلك الحريات والديمقراطيات ولكن بعد وضعه في سياق آخر نعيشه في حياتنا اليومية. متابعة القراءة “الحق في المدينة Right to the City”

تعلم البرمجة في برنامج ArcGIS – الدرس الأول

في هذا الدرس ستتعلم

  • استخدام بايثون من داخل برنامج ArcGIS
  • اختيار Layer موجودة ضمن ملف mxd
  • إنشاء Layer جديدة حسب معيار معين.
  • أوامر الـخاصة بقائمة الـ geoprocessing مثل Merge، Dissolve، clip، buffer.
  • اجراء عملية اختيار بناء على البيانات الوصفية Selection by attributes.

متابعة القراءة “تعلم البرمجة في برنامج ArcGIS – الدرس الأول”

الدرس الثالث – تعلم البرمجة للمبتدئين – PYTHON

المشروع الأول

في حال كنت من القادمين الجدد الى الموقع يمكنك بدأ هذه الدورة من هذا الرابط

مهمتك الحالية

المدير سعيد جدا بالكود الذي كتبته ويريدك الان تخزين معلومات اضافية عن الموظفين

  • العنوان: عبارة عن احداثيات مكانية X,Y
  • الوظيفة: مدير, عامل, مهندس …. الخ
  • الراتب: رقم معين
  • الرقم التسلسلي: غير مرتبط بالـ Index في القائمة
  • واسترجاعها عند الحاجة كالتالي. عنوان الموظف ذو الـ Index 0 مثلا

لاتتردد في اضافة أي سؤال الى التعليقات. حيث أن التفاعل يعطيك نتائج أفضل في التعلم ويساعدنا على تصميم محتوى أفضل.

الكود الذي انتهينا من كتابته في الدرس الثاني:

employee1 = "Ahmad"
employee2 = "Mazen"
employee3 = "Noor"
employee4 = "Samira"
employeeList = [employee1 ,employee2, employee3, employee4]
def printEmp(name):
 print("Name of employee is :" + name)

for emp in employeeList:
 printEmp(emp)

نود تخزين العديد من المعلومات الخاصة بكل موظف ونعطي كل معلومة مفتاح خاص بها العنوان, الوظيفة,.. الخ. لنتعرف على مفهوم الـ Dictionaries والذي يساعدنا على تجاوز هذه المهمة.

القواميس Dictionaries

لننظر الى هذا المثال

person1 = {'id':23123,'Job':'Surveyor'}
print(person1['id'])
print(person1['Job'])
#النتيجة
#23123
#Surveyor

في هذا المثال نلاحظ أن البيانات مخزنة كأزواج. (Key,value) أزواج مفاتيح وقيم. مثلا

  • المفتاح id وقيمته 23123.
  • المفتاح Job وقيمته Surveyor

السؤال هل نستطيع تخزين القواميس ضمن قوائم؟ والجواب نعم والعكس صحيح أيضا نستطيع تخزين القوائم ضمن القواميس. لننظر الى هذه الأمثلة:

person1 = {'id':23123,'Job':'Surveyor'}
person2 = {'id':23124,'Job':'Manager', 'Name':'Ahmad'}
workers = [person1, person2]
#استدعاء العامل الأول
print(workers[0])
#استدعاء العامل الثاني
print(workers[1])
#النتيجة
#{'id': 23123, 'Job': 'Surveyor'}
#{'id': 23124, 'Job': 'Manager', 'Name': 'Ahmad'}

نلاحظ أنه بالامكان تخزين القواميس ضمن قوائم. وعند استدعاء العنصر بحسب الـ Index من القائمة فالنتيجة تكون القاموس نفسه. اذا يمكننا القيام بالعمليات السابقة كاستدعاء عنصر من القاموس بحسب المفتاح كالتالي:

person1 = {'id':23123,'Job':'Surveyor'}
person2 = {'id':23124,'Job':'Manager', 'Name':'Ahmad'}
workers = [person1, person2]
print(workers[0]['Job'])
#النتيجة
#Surveyor

اذا [workers[0 مكافئ لـ person1 ونستطيع القيام بنفس العمليات عليه. نحن الان جاهزون للعودة الى المثال السابق لمواجهة المهمة المطلوبة.

كتابة تابع يقوم بطباعة المعلومات لكل موظف:

لنقم بكتابة تابع كما تعلمنا في الدرس السابق

def print_info(emp):
    print('Name of employee is:',emp['Name'])
    print('id',emp['Id'])
    print('Name',emp['Job'])
    print('Address',emp['Address'])

person1 = {'Id':23123,'Name':'Ahmad','Job':'Surveyor', 'Address':[3,2]}
print_info(person1)

تخزين البيانات:

لنقم هذه المرة بتخزين البيانات ضمن القائمة بطريقة جديدة وذلك عبر استخدام الأمر Append كما يلي:


def print_info(emp):
    print('Name of employee is:',emp['Name'])
    print('id',emp['Id'])
    print('Name',emp['Job'])
    print('Address',emp['Address'])

person1 = {'Id':23123,'Name':'Ahmad','Job':'GIS expert', 'Address':[3,2]}
person2 = {'Id':23123,'Name':'Mazen','Job':'Surveyor', 'Address':[5,6]}
person3 = {'Id':23123,'Name':'Noor','Job':'Manager', 'Address':[3,1]}
person4 = {'Id':23123,'Name':'Samira','Job':'programer', 'Address':[2,1]}
workers =[]
workers.append(person1)
workers.append(person2)
workers.append(person3)
workers.append(person4)

print_info(workers[0])
print_info(workers[1])
print_info(workers[2])
print_info(workers[3])

استدعاء التابع ضمن حلقة:


def print_info(emp):
    print('Name of employee is:',emp['Name'])
    print('id',emp['Id'])
    print('Name',emp['Job'])
    print('Address',emp['Address'])

person1 = {'Id':23123,'Name':'Ahmad','Job':'GIS expert', 'Address':[3,2]}
person2 = {'Id':23123,'Name':'Mazen','Job':'Surveyor', 'Address':[5,6]}
person3 = {'Id':23123,'Name':'Noor','Job':'Manager', 'Address':[3,1]}
person4 = {'Id':23123,'Name':'Samira','Job':'programer', 'Address':[2,1]}
workers =[]
workers.append(person1)
workers.append(person2)
workers.append(person3)
workers.append(person4)

for x in workers:
    print_info(x)

مهمة جديدة

الان يطلب منك المدير اضافة قسم لطباعة رواتب الموظفين بحسب مهماتهم. الشركة راتب أساسي قدره 2000:

  • المدير يحصل على نسبة 1.5 من الراتب الأساسي
  • المساح يحصل على نسبة 1.2 من الراتب الأساسي
  • خبير نظم المعلومات الجغرافية يحصل على نسبة 1.3 من الراتب الأساسي
  • المبرمج يحصل على نسبة 1.4 من الراتب الأساسي

اذا علينا اضافة شرط للطباعة. لنتعرف على كيفية كتابة الشروط المنطقية في بايثون

الشروط المنطقية

تساعدنا على توجيه البرنامج حسب بعض الشروط. يمكن التعبير عنها بهذه الجملة مثلا:

اذا كان الشرط محقق True اطبع 5. اذا كان الشرط محقق True اطبع 6

condition= True
if(condition):
 print(5)

condition= False
if (condition):
 print(6)

#النتيجة
#5

نلاحظ أن البرنامج يطبع 5 فقط. كون الشرط لم يتحقق في الخطوة الثانية.

لنأخذ هذا المثال الجانبي لفهم الشروط المنطقية. لدينا رقم ما مخزن في متحول x ونريد طباعة موجب “Positive” في حال كان الرقم أكبر من الصفر ونتحقق بذلك عن طريق الرمز . وسالب “Negative” في حال كان الرقم أصغر من الصفر. أكبر وأصغر يتم التعبير عنها عن طريق هذه الرموز < >. وفي حال كان الرقم مساوي للصفر Zero. انتبه التحقق من المساواة مختلف عن المساواة ويتم التعبير عنه بهذا الرمز ==

#حاول أن تختبر عدة احتمالات
x = 14.2
if (x > 0):
  print('Postive')
if (x < 0):
  print('Negative')
if (x == 0):
  print("Zero")

نستطيع ومن الأفضل اختصار الكود السابق باستخدام كلمة elif وهي اختصار لـ Else if كالتالي:


x = 14.2
if (x > 0):
  print('Postive')
elif (x < 0):
  print('Negative')
elif (x == 0):
  print("Zero")

نلاحظ أنه في حال كان العدد غير موجب أو سالب فهو بالتأكيد صفر. فلا داعي للتحقق من الشرط الأخير وبالتالي يمكن اختصار الكود أكثر كالتالي:


x = 0
if (x > 0):
  print('Postive')
elif (x < 0):
  print('Negative')
else:
  print("Zero")

لنعرف تابعا يقوم باعادة قيمة الراتب:

نستخدم هنا كلمة جديدة وهي Return والتي تقوم باعادة قيمة معينة بعد تنفيذ التابع. في هذا المثال ضعفي الراتب الأساسي:

def calculate_salary():
 basicSalary = 2000
 calcuatedSalary = 2* basicSalary
 return calcuatedSalary

print(calculate_salary())

لنقم باضافة نوع العمل كمدخل على هذا التابع. و الشروط المنطقية:


def calculate_salary(job):
    basicSalary = 2000
    if (job == 'Manager'):
        return  1.5 * basicSalary
    elif (job == 'programer'):
        return  1.4 * basicSalary
    elif (job == 'GIS expert'):
        return  1.3 * basicSalary
    elif (job == 'Surveyor'):
        return  1.2 * basicSalary

print(calculate_salary('programer'))

مهمتك للدرس القادم دمج الكود الأخير بالكود الرئيسي هنا لتنجز المهمة:


def print_info(emp):
    print('Name of employee is:',emp['Name'])
    print('id',emp['Id'])
    print('Name',emp['Job'])
    print('Address',emp['Address'])

person1 = {'Id':23123,'Name':'Ahmad','Job':'GIS expert', 'Address':[3,2]}
person2 = {'Id':23123,'Name':'Mazen','Job':'Surveyor', 'Address':[5,6]}
person3 = {'Id':23123,'Name':'Noor','Job':'Manager', 'Address':[3,1]}
person4 = {'Id':23123,'Name':'Samira','Job':'programer', 'Address':[2,1]}
workers =[]
workers.append(person1)
workers.append(person2)
workers.append(person3)
workers.append(person4)

for x in workers:
    print_info(x)

الان نصيحة من That GIS Guy لك:

أنت الان مستعد لكتابة برامج أكثر تعقيدا وقد تتضمن المشاريع التي تعمل بها العديد من الأشخاص. لذلك من المهم مراعاة بعض النقط الجمالية لدى كتابة الكود بطريقة محترفة وجميلة, مثلا (المرجع):

  • حافظ على استخدام 4 مسافات بيضاء Space بدلا من استخدام زر Tab
  • لا تتجاوز 79 محرفا في كل سطر
  • استخدم أسطر فارغة لفصل الـ (Function, Classes)عن بقية الكود
  • وثق عن طريق docstring
  • استخدم مسافات حول المعاملات operators

لاتنسى مشاركة هذه الدورة مع أصدقائك المهتمين

الدرس الثاني – تعلم البرمجة للمبتدئين – PYTHON

في هذا الدرس سنتعرف على

  • الحلقات Loops
  • التوابع أو Functions

المشروع الأول: مشروع ادارة موظفي شركة

بعد اكتسابك الخبرات الجديدة. اتصل بك مدير شركة وطلب منك أن تقوم بتصميم برنامج لادارة موظفيه. وبالتأكيد قبلت المشروع 🙂

المهمة الأولى

تصميم برنامج يقوم بتخزين معلومات عن الموظفين. وعند الحاجة طباعة اسم أي منهم حسب رقمه المتسلسل. وقد يكون عدد الموظفين كبيرا جدا.

بالإضافة الى ذلك يجب على البرنامج طباعة أسماء كل الموظفين المخزنين كالتالي:

Name of employee is : …….

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

متابعة القراءة “الدرس الثاني – تعلم البرمجة للمبتدئين – PYTHON”

الدرس الأول – تعلم البرمجة للمبتدئين – Python

مرحبا بك في دورة تعلم البرمجة للمبتدئين:

رسوم الدورة:

هذه الدورة ليست مجانية والسعر هو نشر المعرفة وذلك عن طريق دعوة صديقين يودان البدأ بتعلم البرمجة للانضمام لنا عن طريق ذكرهم في التعليقات على صفحة الفيسبوك أو ارسال رابط الدورة لهم 🙂

لمن هذه الدورة:

لأي شخص يود البدء المحتوى لايفترض أي معرفة سابقة في البرمجة أي طلاب المدرسة أو الجامعة أو أي شخص يحب تعلم البرمجة بغض النظر عن العمر. البايثون أصبحت لغة البحث العلمي وهي مفيدة للباحثين من جميع الاختصاصات. بالاضافة الى كونها اللغة الأهم حاليا في تعلم الالة وتحليل البيانات الكبيرة. وأقتبس هنا Bjarne Stroustrup مخترع لغة الـ C++ حيث أدرجها ضمن اللغات الخمس التي يجب تعلمها يمكنك مشاهدة الفديو هنا.

متابعة القراءة “الدرس الأول – تعلم البرمجة للمبتدئين – Python”

اظهار خطوط كنتور فني Tanaka.

كنت أقرأ هذه المقالة (الرابط) عن اظهار Tanaka (الرابط) لخطوط الكنتور. هذا الإظهار يعطي مظهرا فنيا للخرائط الطبوغرافية وذلك عبر استخدام وهم الظل على الخطوط

متابعة القراءة “اظهار خطوط كنتور فني Tanaka.”

مراقبة التغيرات المكانية عبر الزمن باستخدام القنوات اللونية

سأقدم في هذه المقالة نصيحة سريعة في حال كنت تود أخذ لمحة عن التغيرات المكانية لمنطقة ما. عندما تلتقط أي صورة فانك توقف الزمن وتستطيع مراقبة كافة تفاصيل المشهد في ذلك اللحظة. شاشة العرض تقوم بعرض ثلاث قنوات هي حزمة اللون الاحمر والاخضر والازرق ومن خلال مزج هذه الالوان متابعة القراءة “مراقبة التغيرات المكانية عبر الزمن باستخدام القنوات اللونية”

هل صممت غوغل ذكاء صناعي قادرعلى “تصميم نفسه”؟

تتناول العديد من الصحف الأجنبية والعربية مؤخراً خبر مفادُه أنّ غوغل قامت بتصميم نوع من الذكاء الصناعي قادر على تصميم وتحسين نفسه. هذا الخبر صحيح ولكن طريقة العرض قد توحي بأننا اقتربنا كبشر من تصميم ذكاء حقيقي وخطير ولكن في الواقع مازلنا بعيدين جداً عن هذه المرحلة ( البعد تكنولوجي وليس زمني), لذلك أحببت كتابة هذه المقالة القصيرة للتوضيح. متابعة القراءة “هل صممت غوغل ذكاء صناعي قادرعلى “تصميم نفسه”؟”

مقالة تعليمية: كيفية حساب فيضان نهر النيل بواسطة برنامج QGIS وصور الأقمار الصناعية

مقدمة

سنقوم في هذا الدرس بإنجاز مشروع واقعي ضمن مجال الاستشعار عن بعد حيث سنقوم بمراقبة تغيرات نهر النيل خلال الشتاء والصيف وسنقوم بعمل خريطة سريعة لمنطقة الفيضان بالقرب من الخرطوم ولهذه الخرائط أهمية كبيرة لاعمال الانقاذ وتقدير الخسائر ووضع خطط لإدارة الكوارث والتعامل معها متابعة القراءة “مقالة تعليمية: كيفية حساب فيضان نهر النيل بواسطة برنامج QGIS وصور الأقمار الصناعية”