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

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

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

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

بإمكانك استخدام arcpy لجميع المهام التي تستطيع إنجازها في ArcGIS Desktop، لكن ما يميز استخدام arcpy عن انشاء toolbox في برنامج ArcGIS هو إمكانية تكرار الأوامر بشكل آلي Iterations، مثل حلقات For,while….

تنظيم العمل والبرمجة تصبح أسهل عند العمل في واجهة IDLE إضافة أنه يمكنك حفظ الكود البرمجي، كما ذكرنا سابقا فان البرنامج يقوم بتنصيب مكتبة arcpy، بإمكانك إيجاد الواجهة التفاعلية لـ python 2.7 في المسار التالي في حال لم يتم تغير المسار اثناء التنصيب:

C:\Python27\ArcGIS10.5\Lib\idlelib\idle.pyw

عند تشغيل البرنامج قم باختيار file من ثم new وستظهر نافذة جديدة يمكنك كتابة الكود البرمجي بداخلها، لتشغيل البرنامج المكتب يمكنك اختيار run module من قائمة run.

سنقوم في هذا الدرس بكتابة كود يقوم بطباعة كل رمز كل دولة من الدول مع عدد المدن التي تحويها.

لا تنسى متابعتنا على صفحة الفيسبوك

بعد انشاء ملف ال لان العمل يتم خارج البرنامج فمن الضروري استيراد مكتبة arcpy في بداية كل ملف.

import arcpy
arcpy.env.workspace= "d:/results"

لاستبدال ملف في حال تتطابق الأسماء

arcpy.env.overwrightoutput= "true

لقارئة ملف shapefile باستخدام مساره يمكننا استخدام التعليمة التالية، سنستخدم ملف الدول الذي انشأناه في الدرس الأول، وسنستخدم لطبقة المدن نفس الطبقة في الدرس الأول:

country_lyr=arcpy.mapping.Layer(“D:/results/lyr_country.shp”)
city_lyr=arcpy.mapping.Layer(“D:/results/ne_10m_populated_places.shp”)

لقراءة البيانات الوصفية يتم استخدام الامر

arcpy.da.SearchCursor(“اسم الطبقة”,”اسم العمود/ اعمدة”,”المعيار ان وجد”(

سنستخدم العمود الثالث المسمى sov_a3 والذي يحوي على ترميز البلدان، لذلك فالأمر سيكون على الشكل التالي

arcpy.da.SearchCursor(country_lyr,"sov_a3")

النتيجة هنا عبارة عن list تحوي جميع عنصر ترميز البلدان، سنقوم من باستخلاص البلد بواسطة الأمر

arcpy.MakeFeatureLayer_management الذي تم شرحه في الدرس الأول

لاختيار المدن بحسب الموقع الجغرافي بإمكاننا اختيار الامر

arcpy.SelectLayerByLocation_management (“الطبقة المدخلة””نوع العلاقة الطبولوجية”.,”الطبقة التي سنقارن بها الطبقة المدلة)”

أهم أنواع العلاقة الطبولوجية يمكننا اختيار:

  • “WITHIN” يقع داخل
  • “WITHIN_A_DISTANCE” يقع على مسافة
  • “BOUNDARY_TOUCHES علاقة تجاور”
  • “SHARE_A_LINE_SEGMENT_WITH” تتشارك بقطعة مستقيمة

بعدها سيتم استخدام أمر arcpy.GetCount_management للحصول على عدد العناصر التي تم اختيارها بعد اجراء التحليل المكاني. وفي النهاية سيتم حدف االطبقة المؤقتة بواسطة امر Delete_management لكود الكامل سيكون على الشكل التالي :


import arcpy

arcpy.env.workspace= "d:/results"

arcpy.env.overwrightoutput= "true"

country_lyr=arcpy.mapping.Layer(“D:/results/lyr_country.shp”)

city_lyr=arcpy.mapping.Layer(“D:/results/ne_10m_populated_places.shp”)

with arcpy.da.SearchCursor(country_lyr,"sov_a3") as data:

for country in data:

 arcpy.MakeFeatureLayer_management(country_lyr,"temp",""" "SOV_A3" = '{}' """.format(country[0]))

 arcpy.SelectLayerByLocation_management(city_lyr,"WITHIN","temp")

 c=arcpy.GetCount_management(city_lyr)

 print("Country with abbreviation {} have {} cities".format(country[0],c))

 arcpy.Delete_management("temp")

 print "\n"

print "DONE!”

النتيجة:

ملاحظات:

  • الأمر في python، with … as يستخدم للحفاظ على ذاكرة الحاسوب، حيث انه يقوم بحذف البيانات فوريا بعد الانتهاء من تنفيذ البرنامج، وبما ان جداول البيانات غالبا ما تحوي على كمية كبيرة من المعلومات فإنه من المستحسن دائما استخدام
with arcpy.da.SearchCursor(country_lyr,"sov_a3") as data:

عوضا عن

data =arcpy.da.SearchCursor(country_lyr,”sov_a3″)

  • التابع format يقوم بالتعديل على النص واستبدال مكان الاقواس بما يوجد من مدخلات داخله، مثال:

print("THAT GIS JUY")

THAT GIS GUY

print("THAT {} GUY".format("GIS"))

THAT GIS JUY

print("{} GIS {}".format("THAT", "GUY"))

THAT GIS GUY

  • البرنامج يقوم بإنجاز 4 أوامر مكانية في الحلقة الواحدة وبالتالي يحتاج لبعض الوقت.

الكاتب : المهندس محمد حسن