عمل خرائط تفاعلية عن طريق البايثون باستخدام المكتبة folium


Folium 


هي احد المكتبات ذات الفعالية العالية والمستخدمة في بيئة البايثون لاظهار البيانات الجغرافية حيث يتم انشاء خرائط لاي مكان بالعالم بمعرفة قيم خطوط الطول والعرض .
والخرائط التي يتم انتاجها عبارة عن خرائط تفاعلية تستطيع التكبير والتصغير عليها والتحكم بالعرض 
يتم استخدام هذه المكتبة بالاضافة الي مكتبات اخرى مثل
Pandas ,numpy 
باجراء تحليلات احصائية ومعالجة جداول البيانات وايظهارها مباشرة علي الخريظة واخراج الخرائط 

تحميل   البيانات

  يتم  تحميل البيانات لمنطقة   برلين من موقع Airbnb  حيث يتم الحصول على طبقة  تحتوي مواقع الشقق المتاحة للإيجار والسعر  والمالك وغيرها من المعلومات ضمن منطقة برلين  وساقوم بعمل عرضين توضح بأي منطقة في برلين  تتركز الشقق المتاحة heatmap و خريطة تظهر عدد الشقق المتاحة ومواقعها MarkerCluster

الشقق المتاحة لمدينة برلين من الرابط التالية

نقوم بتحميل البيانات من الرابط التالي باختيار بيانات مدينة برلين
listings.csv الملف ذو الاسم

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


MarkerCluster


من العروض الجميلة للخرائط ويتم برمجته ببساطة عن طريق البايثون باستخدام المكتبة
folium
يستخدم عند عرض البيانات الكبيرة حيث يتم تقسيم البيانات إلى مجموعات حسب الموقع الجغرافي وإظهار عدد تكرار الظاهرة بالموقع الجغرافي وفق لون محدد وعند عمل تقريب علي الموقع الجغرافي يعمل على زيادة دقة التوزيع حسب درجة التقريب 

import  folium 
import geopandas as gpd
import numpy as  np
#from folium.plugins import HeatMap
from folium.plugins import MarkerCluster
#  ايضافة الطبقة 
m= gpd.read_file('C:\\Users\\marte\\Desktop\\bezirksgrenzen.shp\\prise.shp')
#  عمل   خلية تحتوي  الاحداثيات ضمن مصفوفة
m['lat']=m.geometry.x
m['lon']=m.geometry.y
point_array=m[['lon','lat']].values
# انشاء  الخريطة   
map4=folium.Map(location=[52.42,13.4],zoom_start=10,control_scale=True)
#  ايضافة طبقة للتقسمات  الادارية لبرلين 
One = gpd.read_file('C:\\Users\\marte\\Desktop\\bezirksgrenzen.shp')
folium.GeoJson(One).add_to(map4)
# MarkerCluster ايضافة الاحداثيات الي الخريطة   بنمط العرض 
marker_cluster=MarkerCluster().add_to(map4)
for  i  in range(0,len(m)):
    lat=m['lat'][i]
    lon=m['lon'][i]
    folium.RegularPolygonMarker(location=[lon,lat],fill_color='#2b8cb2',number_of_sides=6,radius=8).add_to(marker_cluster)
 # htmlحفظ الخريطة كملف    
map4.save(outfile= "MarkerCluster.html")  


Heatmap

الخرائط   الحرارية تستخدم لتوضيح  تركيز الظاهرة وتواترها في موقع معين     حيث يتم اختيار نصف قطر دائرة وضمن هذه الدائرة  يتم حساب عدد الشقق المتاحة للإيجار ضمن هذه الدائرة

import  folium 
import geopandas as gpd
import numpy as  np
from folium.plugins import HeatMap
# انشاء  الخريطة  
map3=folium.Map(location=[52.5,13.4],zoom_start=10,control_scale=True)
#  ايضافة البيانات   التي سيتم عرضها علي الخريطة
m= gpd.read_file('C:\\Users\\marte\\Desktop\\bezirksgrenzen.shp\\prise.shp'
#عمل خريطة حرارية  لاظهار المناطق  التي  تحتوي عدد  كبير من  الشقق المتاحة للايجار  
HeatMap(point_array,radius=11).add_to(map3)
 # htmlحفظ الخريطة كملف  
map3.save(outfile= "HeatMap.html") 
 

تستطيع تحسين العرض السابق من خلال توسيع الاكواد السابقة

كاتب المقال Martin Elia

استخدام البايثون في تحليل البيانات المكانية

نقوم  بهذه الدرس  بعمل مدخل للبايثون في معالجة البيانات الجغرافية  باستخدام بعض التعليمات الضرورية حيث سأقوم بعرض بعض النقاط  المهمة 

التعرف على بيئة الإدخال  بواسطة المتصفح جوبيتر
قراءة shapefile  ضمن البايثون

اظهار البيانات المخزنة  ضمن الطبقة ونمط البيانات   ورسم الطبقة

طريقة   اختيار عناصر من  الطبقة

ايجاد   تقاطع بين  طبقتين مختلفتين

تصنيف الطبقة   وفق سمة معينة

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

تغيير نظام الإسقاط  للطبقة

رسم طبقات  مختلفة معا 

Anaconda

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

Geopandas

 الحزمة  geopandas  هي حزمة مفتوحة المصدر  للتعامل مع البيانات الجيومكانية  وهي تعتبر توسيع للحزمة pandas

لتستطيع  التعامل مع البيانات الجغرافية   وهي تعتمد على بعض المكتبات الأخرى  مثل matplotlib , fiona

Fiona  تمكن البايثون من  قراءة بيانات نظام المعلومات الجغرافية الطبقات  وانظمة الإسقاط وتتوافق مع كل المكتبات التي يستخدمها البايثون لنظام المعلومات الجغرافية  

قم   بإضافة الحزمة  geopandas من   خلال كتابة الأمر التالي   ضمن anaconda prompt

conda install -c conda-forge geopandas 

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

الكود البرمجي

نقوم   بايضافة   الحزمة Geopandas  ونكتب الامر pd.options.display.max_rows=10 لإظهار عشرة أسطر من الجدول اثناء عرض البيانات الجيومكانية على شكل جداول   

import geopandas  as gpd 
pd.options.display.max_rows=10


نقوم بتحميل طبقة  المدن الهامة في العالم وطبقة  دول العالم اضغط هنا
ونقوم بتحميل الطبقات

تحميل طبقة ضمن البايثون


#تحميل الطبقات 
Martin =gpd.read_file('C:\\Users\\marte\\Downloads\\Compressed\\ne_10m_admin_0_countries_2\\ne_10m_admin_0_countries.shp')
City=gpd.read_file('C:\\Users\\marte\\Downloads\\Compressed\\ne_10m_populated_places\\ne_10m_populated_places.shp')

رسم الطبقة

تتيح   المكتبة  geopandas استخدام   matplotlib لصنع الخرائط  والاخراج بواسطة التعليمة  Polt

#  رسم طبقة 
Martin.plot()
City.plot()

اختيار عناصر من الطبقة

نقوم   باختيار دول شمال أفريقيا  ودول الشرق الاوسط ,كذلك سوريا والمغرب  الامثلة التالية تبين الاختيار بطرق مختلفة

#   اختيار عنصر من طبقة    
arab_country=Martin[Martin['REGION_WB']=='Middle East & North Africa']

Syria=Martin[Martin['ADMIN']=='Syria']

maroco=countries[countries['NAME_NL'].str.contains('Marokko')]

maroco.plot()
arab_country.plot()

عرض بيانات الطبقة ونمط البيانات

عن طريق التعليمة head  
نحصل على جدول  يحتوي على معلومات الطبقة بالإضافة إلى عمود للعناصر الجيومترية



City.head()


نحصل علي نمط البيانات من خلال التعليمة type



North_Africa.type
arab_country.type


لاختيار عواميد محدد من الطبقة   
حيث سأقوم  بعمل طبقة تحتوي علي الاسم  والقيم الهندسية


# اختيار   عواميد محددة  من  الحدول 
countries = arab_country[['geometry', 'NAME_NL']]
countries

التقاطع بين طبقتين

نقوم  باختيار المدن العربية التي تقع بالشرق الاوسط  وشمال افريقيا باستخدام التعليمة sjoin

#   اختيار  النقاط التي تقع ضمن المضلع 

arabcity=gpd.sjoin(City,arab_country,op='within')

#cities_with_country = geopandas.sjoin(cities, countries, how="inner", op='intersects')

تصنيف الطبقة وفق لسمة معينة

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

 
#تصنيف  الطبقة وفق  عمود  محدد
arab_country.plot(column='ADMIN', figsize=(11,11))
 

تحويل نظام الاسقاط

نقوم باظهار العناصر الجيومترية لمدينة دمشق وهي عبارة عن الاحداثيات

Damascus=arabcity[arabcity['NAME_left']=='Damascus']
Damascus.geometry
area
0.0    POINT (36.29805003041707 33.50197985420613)
Name: geometry, dtype: object

نقوم   بتحويل طبقة   المدن العربية  إلى نظام الإسقاط  ميركاتور باستخدام الامر{ ‘crs = {‘init’ :’epsg:3857


arabcity.crs = {'init' :'epsg:3857'}
arabcity.crs
 

اعادة تسمية عمود السمات ضمن الطبقة

نقوم بإعادة تسمية العمود NAME_NL’   إلى الاسم Martin

#  اعادة  تسمية احد عواميد   الطبقة 
countries2 = countries.rename(columns={'NAME_NL':'martin'})
countries2.head()

حفظ الطبقة

نقوم بحفظ طبقة  المدن العربية على  شكل ملف json ضمن ال directory   


# حفظ طبقة 
arabcity.to_file('utput.json')

نقوم    بكتابة pwd    لمعرفة مسار الحفظ

رسم الطبقات معا

نقوم برسم  طبقة المدن وطبقة الدول العربية  معا ونقوم برسم المدن باللون الاحمر والبلدان باللون الاسود والتعبئة بلا لون ونقوم بضبط الامتداد  من خلال ax.set(xlim=(-16,65),ylim=(10,45))

#رسم عدة طبقات  معا 
ax=arab_country.plot(edgecolor='k',facecolor='none',figsize=(13,13))
arabcity.plot(ax=ax,color='red')
ax.set(xlim=(-16,65),ylim=(10,45))

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

كاتب المقال Martin Ealya

نشر البيانات المكانية باستخدام الجيوسيرفير


  المهارات المكتسبة من الدرس

طريقة تنصيب الجيوسيرفير
طريقة نشر البيانات المكانية عن طريق الجيوسيرفير
 اجراء بعض الاستعلامات  علي البيانات  في متصفح الويب باستخدام  الفلتر CQL
 تصدير   البيانات الي نظام المعلومات الجغرافية  ك WFS

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

WMS

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

WFS  

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

Geography Markup Language –GML

  لغة     ترميز  لتبادل العناصر الجغرافية و   المكانية  وهي    تعتمد علي  لغة   الترميز    xml حيث يتم      وفقها   نقل  الكائنات ذات السمات  والعلاقات الهندسية و المكانية      ويتم نقل ايضا  البيانات غير التقليدية مثل  البيانات من الحساسات   والمستشعرات  .

OGC

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

تستخدم معايير OGC في مجموعة واسعة من المجالات بما في ذلك: علوم الأرض والبيئة. الدفاع والاستخبارات المدن الذكية ، بما في ذلك شبكات إنترنت الأشياء وأجهزة الاستشعار ، وتقنيات الهواتف المحمولة ، والبيئة وإدارة

الكوارث …..الخ

واصبحت   منذ عام     2007   عضو  في   موسسة Wide Web Consortiums -W3C
رابط الصفحة

  http://www.opengeospatial.org

W3C

هو   عبارة عن مؤسسة  دولية تعمل علي  تطوير الويب    وعمل معايير  موحدة   تأسست في 1 أكتوبر 1994 في مختبر MIT لعلوم الكمبيوتر في كامبريدج ، ماساتشوستس.
رابط     الصفحة
https://www.w3.org/participate/


OpenLayers

هي   عبارة عن مكتبة    تمكن من    وضع    خرائط  ديناميكية  في صفحات الانترنيت  بالاضافة   الى تحميل
  الطبقات    والمتجهات  علي هذه  الخرائط    وهي مفتوحة المصدر  تماما  وتسخدم في لغة البرمجة جافا   سكريبت
رابط الصفحة
https://openlayers.org/

مقالة تعليمية عنها من موقعنا

https://thatgisguy.com/2017/10/07/web-map/


GoServer

 هو خادم برمجيات مفتوح  المصدر   مكتوب بلغة جافا   تتيح للمستخدم  مشاركة  وتحرير  البيانات الجيومكانية ونستطيع   نشر مخطط او خريطة  باستخدام    معايير     وضوابط       OGC

 وباعتباره  مشروع  مفتوح المصدر   تم تطويره   واختباره  ودعمه   من  قبل مجموعة   متنوعة من الافراد   والمؤسسات  في  جميع  انحاء العالم  والبرنامج   هو المرجع   لخدمات   OGCالتي تقوم   بنشر  خدمة WMS   ,WFS عن    طريق برنامج الجيوسيرفير   .

وقد بداء البرنامج في بادئ الامر   في عام  2001     من قبل    مشروع التخطيط المفتوح  TOPP  والبرنامج عبارة عن بعض الادوات  تساعد المواطنين في مشاركة الحكومة  في عملية التخطيط  للمدن وتطوير  المناطق الحضرية  وجعل الحكومات  اكثر  شفافية  في التخطيط  من خلال  الامكانية  علي نشر المخطاطات   واجراء  الاستعلامات عليها

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

  وقد قام المطورون    للجيوسيرفير    بتأسيس مشروع  Geotools    عبارة   عن ادوات جافا GIS-Java

 قدرة الجيوسيفير    على نشر خدمتي  WMS  ,WFS   بالاضافة الي  ربطه ايضا بمشاريع   اخرى   مثل Postgis  ,openlayer   وغيرها عزز من فعالية   الجيوسيرفير  

حيث يمكن    للجيوسيرفير  قراءة  البيانات  من اكثر 12  مصدر  للبيانات  المكانية  ونشرها بصيغ   مختلفة .


تحميل   الجيوسيرفير

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

نذهب   الي  الصفحة الرسمية لتحميل الجيوسيرفير

قم بتحميل ملف التنصيب حسب نظام التشغيل الخاص بك

 نقوم  باختيار   اسم المستخدم وكلمة المرور 
ومن ثم ادخال : 8080 

بعد اكتمال تنصيب البرنامج يجب   البدء باقلاع السيرفير حيث  عند تشغيل الجهاز يجب القيام دائما بهذه العملية

بعد  الانتهاء من الاقلاع   نقوم بفتح 
 geoserver web page Admin
حيث  تكون ضمن المتصفح الافتراضي  علي الجهاز خاصتك

   و نقوم بادخال كلمة السر  التي قمنا بانشاءها   خلال تنصيب البرنامج

البداء    بعملية    نشر البيانات  الجفرافية

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

يمكنك  تحميل البيانات  من هنا

1-workspace


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

نقوم بعمل ورك سبيس تحمل الاسم فرانكفورت

نلاحظ   ظهورها في القائمة المنسدلة

 في   حال فتحنا المسار التالي
C:\Program Files (x86)\GeoServer 2.14.1\data_dir\workspaces\FRANKFURT
 نلاحظ تشكل مجلد يحمل اسم الورك سبيس الذي قمنا بانشاءه   كما توضح الصورة التالية حيث تستطيع لاحقا الوصل الى  كل الملفات التي ستضمنها   والتي سنقوم باضافتها بالخطوات  التالية

2-stores

بعدها  نذهب الي القائمة  Store   حيث   سنحدد    نمط البيانات  التي  سنقوم باضافتها    ونشرها  لاحقا . في   مثالنا  فقط shapefil    حيث   سنقوم    بنشر  اربع طبقات
طبقة  تمثل الابنية السكنية  عبارة عن مضلعات
طبقة تمثل    الابنية الحكومية عبارة عن مضلعات
طبقة   تمثل  الشوارع   عبارة  عن نقط
طبقة تمثل الشوارع  عبارة عن خطوط 

 نقوم باختيار اضافة طبقة كما في الصورة ادناه

نقوم   باضافة   الطبقة   من جهاز  الكمبيوتر   الى    الجيوسيرفير  من خلال الضغط على المستعرض وادخال الطبقة

3-layers

نذهب الي التبويب طبقة لاظهار الطبقة التي قمنا بانشائها في الخطوة السابقة

بعد انشاء الطبقة  نقوم بفتح  خصائص الطبقة  لضبط  حدود الطبقة   ونظام الاسقاط  و والعرض  وغيرها من الصفات

نلاحظ  في الصورة ادناه ان نظام الاسقاط المستخدم  يعبر عنه برقم   25832
EPSG :25832
بعدها نقوم بحساب امتداد الطبقة  ويتم حسابها بشكل  اوتوماتيكي  بالضغط  على  الخيار الذي تظهره الصورة التالية

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

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

4-layer preview

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

ساقوم بعرضها  علي شكل open layer    حيث  تستطيع عرضها باستخدام انماط اخرى kml,GML   و…….غيرها ايضا

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

CQL filter

يستطيع المستخدم اجراء العديد من الاستعلامات من خلال هذا الفلتر حيث يمكن من عرض الطرقات التي طولها اكبر من 400 متر في هذا القسم من فرانكفورت

5-styles

 يمكن  الجيوسيرفير من تصدير لبيانات  بصيغ مختلفة   

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

عند اختيار اي نمط  من الانماط السابقة   نلاحظ انه     مكتوب علي شكل  كود xml

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

نقوم بنسخ  الجزء  من  الرابط   الذي تظهره الصورة  ادناه

Add WFS

    نضغط   علي Add WFS layer   من   القائمة    اضافة   طبقة   او من خلال  الرمز الذي يظهر  في القائمة  علي يسار  الشاشة

فتظهر   نافذة     نضغط     اولا  علي الخيار edit  من   ثم    تظهر نافذة جديدة
نقوم بنسخ الرابط الذي قمنا بنسخه    في الحقل URL

نضغط      بعدها    علي     connect    فنلاحظ   يتم تحميل الطبقة  في   النافذة   التي بالاسفل      نقوم   بتاشيرها  ونضغط   على  اضافة

نلاحظ يتم  اضافة طبقة  الشوارع  كخدمة  WFS     التي  تملك  نفس  خصائص shapefile   ونقوم   بالدخول الي خصائص     الطبقة   من   التبويب  Style و نقوم بعمل تصنيف  كما تظهر الصور ادناه مع  الخطوات    ومن

ومن ثم نقوم بتصدير  التنسيق بالصيغة SLD

SLD: هو  كود  XML محدد بواسطة OGC لتحديد مظهر طبقات الخريطة. ،  يمكن وصف مظهر الطبقة بغض  النظر  عن العناصر المرسومة ضمن  الطبقة   ولكن   لنوع محدد  (    نقطي او شعاعي او مضلع ).

نقوم   بحفظ   التنسيق   وفق   الرابط التالي ضمن    ملفات الجيوسيرفير

C:\Program Files (x86)\GeoServer 2.14.1\data_dir\styles

نقوم باضافة التنسيق الجديد الي التنسيقات الافتراضية المخزنة بالجيوسيرفير

نقوم بتحميل التنسيق من جهاز الكمبيوتر ومن ثم الضغط علي تحديث كما تظهر الصورة ادناه

 بعد الضغط  علي تحديث  يتم تحويل النمط SLD  الي كود XML  يظهر في النافذة التي بالاسفل  وبعدها نضغط علي  حفظ فيصبح من الانماط   المعتمدة ضمن الجيوسيرفير  

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

 ندخل علي القائمة نشر كما تظهر الصورة ادناه

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

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

نعيد الخطوات السابقة للطبقات الثلاث الباقية ونقوم بنشرها

طبقة المباني الحكومية

طبقة الابنية السكنية

طبقة المدارس

5-layers Groups

  في هذه المرحلة نقوم   با ضافة جميع    الطبقات   في طبقة   واحدة  ومن   ثم اعاد    العرض  لهذه المجموعة معا

نذهب     الي التبويب add groups layer      ونقوم باضافة   مجموعة طبقات جديدة

ندخل اسم المجموعة التي سنقوم بانشاءها

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

 

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

    بعد ان يتم اضافة   كل الطبقات   نقوم  بالتحكم  بترتيب الطبقات  حيث    تكون   الطبقة  في الاعلى    بترتيب القائمة    هي الطبقة الاساس بالعرض   


بعد الانتهاء من ترتيب الطبقات نضغط على حفظ ونقوم بعرض المجموعة معا بالذهاب الي التبويب عرض

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

Martin Ealya : كاتب المقال

توسيع برنامج 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”