توسيع برنامج ArcGIS برمجيا – ComboBox and Histogram

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

  • كيفية إضافة ComboBox ضمن toolbar في ArcGIS، وكيفية برمجة ComboBox.
  • إنشاء مخطط تواتر Histogram وتخزينه عن طريق مكتبة MatPlotLib في Python.

في هذا الدرس سنقوم بإضافة قائمتين منسدلتين ComboBox إحداهما لاختيار متابعة القراءة “توسيع برنامج ArcGIS برمجيا – ComboBox and Histogram”

توسيع برنامج ArcGIS برمجيا بواسطة Arcpy

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

  • إضافة خصائص Python API في برنامج ArcGIS .
  • كيفية إضافة toolbar في ArcGIS وإضافة أزرار يمكن برمجتها في الـ toolbar.
  • كيفية تصدير البيانات إلى اكسل عن طريق تصميم زر مخصص مبرمج بواسطة ArcPy.

تتيح إضافة Python API تعديل واجهة المستخدم في برنامج ArcMap، هذه الإضافة تسمح للمستخدم بإضافة تطبيقات يمكن برمجتها باستخدام لغة البرمجة Python على شكل أزرار يمكن وضعها في قوائم وشرائط أدوات متابعة القراءة “توسيع برنامج ArcGIS برمجيا بواسطة Arcpy”

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

الدرس الثاني:

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

  • استخدام arcpy خارج بيئة ArcGIS، من تطبيق IDLE الخاص ب Python27
  • قراءة البيانات الوصفية attribute
  • انشاء حلقات for بالاعتماد على البيانات الوصفية.

بإمكانك استخدام arcpy لجميع المهام التي تستطيع إنجازها في ArcGIS Desktop، لكن ما يميز استخدام arcpy عن انشاء toolbox في برنامج ArcGIS هو إمكانية تكرار الأوامر بشكل آلي It متابعة القراءة “تعلم البرمجة في برنامج ArcGIS – الدرس الثاني”

تعلم البرمجة في برنامج 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”

سلسلة تعليمية – QGIS – الجزء الرابع – تحليل شريحة البيتزا

في الدرس التالي سنقوم بعمل مدخل بسيط للاستشعار وكل ما تحتاجه هو Orfeo Toolbox وهي مكتبة مفتوحة لمعالجة صور الاستشعار عن بعد من وكالة علوم الفضاء الفرنسية CNES و يمكن تنصيبها على منصات مختلفة. متابعة القراءة “سلسلة تعليمية – QGIS – الجزء الرابع – تحليل شريحة البيتزا”

سلسلة تعليمية – QGIS – الجزء الثالث – تحليل شبكات الطرق في مدينة المالكية في سورية وإيجاد أفضل مسار.

مقدمة

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

سلسلة تعليمية – QGIS – الجزء الثاني – حساب مساحة الأشجار المثمرة المغمورة خلال الفيضان؟

مقدمة

بعد التعرف على أهمية نظام المعلومات الجغرافية في المقال السابق: سلسلة تعليمية – QGIS – الجزء الأول – كيف تختار الموقع الأفضل لمنزلك؟. دعونا نخطو خطوة الي الأمام ونتعرف علي فعالية البرنامج في بعض التحليلات الهندسية كإيجاد مساحات التداخل بين طبقات مختلفة وإظهار الصفات الهندسية لعناصر هذه الطبقات وهي من المهمات الشائعة التي تواجها من خلال عملك في مجال الـ GIS (مثلا: توسع طريق او توسيع مخطط تنظيمي ) ففي حالة توسيع طريق فيجب عليك حساب المساحات الذي يجب تملكها لتوسيع هذا الطريق ونوع هذه الاراضي التي سيتم تملكها ومساحتها .

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

نستطيع تحميل البيانات من الموقع الرسمي Esri للأنهار وقد قمت بربطها مع بيانات اخرى وإضافة أسماء الأنهار لذلك لتطبيق هذا المقال استخدم البيانات المرفقة مع المثال. أما بيانات الاشجار فهي بينات افتراضية لغاية التعلم.

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

البيانات:

  • طبقة الانهار الكبيرة .
  • طبقة الاشجار

خطوات العمل

نقوم بتحميل طبقة الانهار Majrivers بالضغط على الرمز الذي يظهر عليه مؤشر الماوس ونقوم بتحميل طبقة الانهار

Metadata

نتأكد ان اسقاط المشروع متوافق مع نظام الطبقة وننتبه الى ان الواحدات المستخدمة في الطبقة هي القدم (القسم الذي تم تاشيره باللون الازرق بموشر الماوس )

2-نقوم باختيار نهر Koyukuk River باستخدام select by Attribute

وذلك من processing tools

بان نكتب بالفلتر select by Attribute

processing tools: select by Attribute

فتظهر النافذة التالية ونقوم بوضع طبقة الانهار ونختار

الصفة التي سيتم الاختيار بموجبها وهي بمثالنا DESCRIPTION

نختار العملية هنا مساوة

في الحقل value نكتب القيمة التي نبحث عنها

فيتم تاشير جميع العناصر التي تمثل نهر Koyukuk River وعددها 506 عنصر

نقوم بعمل Fixed distance buffer للعناصر المحددة من خلال الذهاب الى

 Vector:Geoprocessing Tools: Fixed distance buffer

وندخل المسافة 5000 قدم

ونفعل Dissolve result

سنقوم بهذه الخطوة بحساب المساحة والمحيط لل Buffer بتشكيله حول النهر والذي يمثل منطقة الفيضان باستخدام اداة هامة هي Export/Add geometry columns وهي تفيد لحساب الخصائص الهندسية مباشرة لا مضلع موجود بالطبقة

ونذهب الى processing tools ونكتب بالفلتر Export/Add geometry columns 

فتظهر النافذة التالية

calculate using يساوي layer CRS حتى يقوم بحساب المساحة وفق لنظام إسقاط الطبقة ونستطيع حسابها وفقا لنظام اسقاط المشروع أيضا

نقوم بفتح open Attribute Table للطبقة الناتجة ولطبقة الـ Buffer

بالذهاب الي open Attribute Table لطبقة ال Buffer

ولطبقة Add geom info

ونقارن

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

نقوم بهذه المرحلة بإضافة طبقة الغابات

نقوم بحساب التقاطع بين طبقة add geom info وطبقة الغابات

vector:Geoprocessing Tools: intersection

ونقوم بفحص البيانات الناتجة عن تقاطع هذين الطبقتين من خلال فتح open Attribute table لطبقة التقاطع فنلاحظ أن البيانات هي كالتالي

حيث لدينا خمس عناصر ويظهر لدينا العمود VEGDESC بأن العنصر الأول والثاني أشجار متساقطة والعنصر الثالث والرابع والخامس أشجار دائمة الخضرة

لذلك سنقوم بعمل مضلع واحد فقط لكل صفة من صفات العمود VEGDESC فسنقوم بتوحيد المضلعات التي لها صفة واحدة من خلال الذهاب الى:

Vector:Geoprocessing Tools:Dissolve

فتظهر النافذة التالية

ومن المهم هنا ازالة تفعيل Dissolve all

واختيار الصفة التي سيتم توحيد العنصر وفقا لها وهي في مثالنا VEGDESC

وذلك من خلال سحبها الي الخانة اليمين من الجدول (selected) كما في الصور التالية

بعد ذلك تفحص البيانات الناتجة عن هذه العملية بالذهاب الي open Attribute table للطبقة

فنلاحظ انه لدينا الان فقط مضلعين احدهما للأشجار المتساقطة والاخر للأشجار المختلطة ومساحة كل منطقة

اخيرا نقوم بحساب نسبة المساحة المغطاة بكل نوع من انواع الشجر الي المساحة الكلية (مساحة النهر + مساحة الفيضان

بالذهاب الى

 Advanced python calculator :processing Toolbox

ونقوم بوضع اسم العمود الذي سيخرج نسبة نوع الشجر

Result file name  وقد قمت بتسميته Martin

Field type = float

ونكتب الفورمولا التالية

value = $geom.area()/ <area>

حيث التابع:

 value = $geom.area()/ <area>

يمثل مساحة المنطقة المشجرة للاشجار المتساقطة والمساحة المشجرة للاشجار المختلطة

يمثل المساحة الكلية

فنحصل علي النتائج التالية

بان 18.9% نسبة الاشجار المتساقطة الاوراق في منطقة الفيضان

6.9 % نسبة الأشجار دائمة الخضرة

نسبة الأشجار الكلية في منطقة الفيضان علي جانبي النهر 18.9+6.9 وتساوي 25.8%

وهذا ماتظهره الصورة التالية بوضع شفافية 50% لمنطقة الفيضان

ملاحظة

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

سأقوم لاحقا باتتمة المشروع واضافة ملف اتمتة المشروع عندما نتطرق لدروس نمذجة المشاريع وعمل geo-algorithms

لذلك لاتنسى الاشتراك في صفحة الفيسبوك That GIS Guy – نظم المعلومات الجغرافية ومشاركة  هذه المقالة مع أصدقائك المختصين. وفي حال لديك أي تعليقات أو أسئلة لاتتردد حيث أنك تفيدنا في تحسين المقالات.

الكاتب: المهندس مارتن إيليا

المراجع:

QGIS: Becoming a GIS Power User – Page 106