البرمجة الجيومكانية

مرجع تدريبي رسمي يشرح مسارات البرمجة الجيومكانية في نظم المعلومات الجغرافية: إعداد البيئة، التعامل مع البيانات المتجهة/الراستر، أتمتة التحليل، خرائط الويب، قواعد البيانات المكانية، نشر الخدمات، والجودة وإعادة الإنتاج.

بيانات تحليل أتمتة خرائط ويب قواعد بيانات نشر خدمات QA/QC
المحور 1

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

البرمجة الجيومكانية ليست “لغة وحدة”؛ هي منظومة عمل تتداخل فيها البيانات والتحليل والنشر. فيما يلي تقسيم مهني واضح يساعد المتعلم على اختيار مسار وتطوير مهاراته تدريجيًا.

مسارات تصنيف المسارات وأهداف كل مسار
المسار وصف عملي مخرجات متوقعة
Geospatial Data Engineer بناء خطوط إدخال/تنظيف/توحيد البيانات (ETL)، إعداد قواعد بيانات مكانية، فهارس، وأداء. بيانات منظمة + قواعد PostGIS + واجهات تحميل + توثيق
Spatial Analyst / Modeler تحليل مكاني متقدم، نمذجة مؤشرات، تحليل شبكات، ملاءمة، سلاسل زمنية. خرائط تحليلية + مؤشرات + تقارير + أدوات إعادة إنتاج
Web GIS Developer بناء خرائط ويب وتطبيقات، إدارة طبقات، تفاعل وواجهات، استهلاك خدمات WMS/WFS/Feature. تطبيق ويب GIS + لوحات معلومات + خرائط تفاعلية
Geospatial DevOps / Publisher نشر الخدمات وربطها بالبنية التحتية: GeoServer/ArcGIS Services، أمن، صلاحيات، CORS، مراقبة. خدمات مستقرة + توثيق تشغيل + مراقبة + خطط نسخ احتياطي
GeoAI / Remote Sensing Engineer نماذج تعلم عميق للصور الفضائية، تصنيف/تجزئة، إعداد بيانات التدريب والتقييم. نماذج + خرائط نتائج + مقاييس دقة + تدفق تدريب/تحديث
اختيار المسار لا يلغي الآخر، لكن يحدد الأولوية المهارات المشتركة: CRS، جودة البيانات، التوثيق النجاح الحقيقي: “سلسلة عمل كاملة” وليس لقطة كود
المحور 2

تهيئة البيئة وأفضل ممارسات الإدارة

إدارة البيئة هي نقطة الانطلاق الصحيحة. الهدف: بيئات منفصلة، تثبيت منضبط، وإصدارات واضحة قابلة لإعادة الإنتاج.

Conda إنشاء بيئة بايثون وتثبيت حزم GIS الأساسية

فكرة العملية: إنشاء بيئة مشروع مستقلّة لتجنّب تعارض الإصدارات.

يوصى بتثبيت الحزم الجيومكانية من قناة conda-forge لتقليل مشاكل الاعتماديات (GDAL/GEOS/PROJ).
# إنشاء بيئة
conda create -n geoexplore-gis python=3.11 -y
conda activate geoexplore-gis

# متجهات (Vector)
conda install -c conda-forge geopandas pyogrio shapely fiona rtree -y

# راستر (Raster)
conda install -c conda-forge rasterio rioxarray xarray -y

# أدوات مساندة
pip install matplotlib contextily rich tqdm
ArcPy ملاحظة تشغيل ArcPy في ArcGIS Pro

ArcPy يعمل ضمن بيئة بايثون التابعة لـ ArcGIS Pro. عمليًا: تُستخدم Python Command Prompt الخاصة بـ ArcGIS Pro أو تُشغّل السكربت من داخل Pro لتضمن توفر الترخيص والمسارات. :contentReference[oaicite:1]{index=1}

import arcpy
arcpy.env.overwriteOutput = True

# نصيحة عملية:
# ثبّت workspace واضح، واستخدم geodatabases بدل مسارات مبعثرة
arcpy.env.workspace = r"C:\GIS\Project\work.gdb"
ممارسة هيكل مجلدات مشروع موحّد

وجود هيكل مجلدات ثابت يسهل التدريب، ويقلل أخطاء المسارات، ويجعل المخرجات واضحة لأي شخص يراجع العمل.

project/
  data_raw/        # بيانات خام (لا تعدّلها)
  data_processed/  # بيانات نظيفة/موحّدة
  scripts/         # سكربتات
  notebooks/       # تجارب وتحليل
  outputs/         # خرائط، جداول، تقارير
  docs/            # توثيق ومنهجية
  README.md        # وصف المشروع وكيفية التشغيل
المحور 3

بيانات المتجهات: قراءة، توحيد، تنظيف، وتحليل

المتجهات (Vector) هي العمود الفقري في معظم تطبيقات GIS البشرية: طرق، حدود، مرافق، أحياء، قطع، نقاط اهتمام. الهدف: قراءة صحيحة، CRS موحّد، تنظيف هندسي، ثم عمليات قص/تجميع/انضمام.

GeoPandas قراءة وكتابة الطبقات وضبط نظام الإحداثيات

الأساس: read_file للقراءة و to_file للحفظ، و to_crs لتحويل الإحداثيات. :contentReference[oaicite:2]{index=2}

  • في التحليل القياسي بالأمتار: استخدم UTM مناسب لمنطقتك.
  • لا تقيس أطوال/مساحات على EPSG:4326 (درجات).
  • وثّق CRS المستخدم في كل مخرجاتك.
import geopandas as gpd

gdf = gpd.read_file("data_processed/roads.gpkg", layer="roads")
if gdf.crs is None:
    gdf = gdf.set_crs(epsg=4326)

# مثال تحويل إلى UTM (بدّل EPSG حسب المنطقة)
gdf_m = gdf.to_crs(epsg=32638)

gdf_m.to_file("outputs/roads_clean.gpkg", layer="roads", driver="GPKG")
تنظيف فحص الجودة الهندسية والطوبولوجية (مختصر عملي)
المشكلة الشائعة الأثر إجراء عملي
هندسات غير صالحة (Invalid) فشل القص/التقاطع/الانضمام المكاني استخدم أدوات الإصلاح (في GIS) أو منهج إصلاح في Shapely عند الحاجة
CRS غير موحّد نتائج خاطئة في القياس توحيد CRS أولاً قبل أي عملية
تكرار السجلات/IDs تضخم الإحصاءات إزالة التكرار، وتثبيت مفتاح فريد
اتجاهات طرق/سرعات ناقصة تحليل شبكات غير واقعي إضافة حقول افتراضية موثّقة أو استخدام مصادر بيانات أدق
مكاني قص وتصفية وعمليات Spatial Index

الفهرس المكاني (Spatial Index) يرفع الأداء عند كثرة المعالم. GeoPandas يوفر sindex. :contentReference[oaicite:3]{index=3}

import geopandas as gpd

study = gpd.read_file("data_processed/study_boundary.geojson").to_crs(epsg=32638)
roads = gpd.read_file("data_processed/roads.gpkg", layer="roads").to_crs(study.crs)

# قص
roads_clip = gpd.clip(roads, study)

# مثال تبسيط هندسي لتخفيف الحجم (للعرض فقط)
roads_clip["geometry"] = roads_clip.geometry.simplify(tolerance=5)

roads_clip.to_file("outputs/roads_clip.gpkg", layer="roads", driver="GPKG")
قاعدة تدريبية: أي عملية “تقاطع/انضمام” على بيانات كبيرة تحتاج فهرس مكاني أو قاعدة PostGIS، وإلا الأداء سيصبح بطيئًا.
ArcPy نموذج أتمتة: Clip + Buffer + حساب أطوال

مثال عملي شائع داخل ArcGIS Pro. :contentReference[oaicite:4]{index=4}

import arcpy
arcpy.env.overwriteOutput = True

study = r"C:\GIS\work.gdb\boundary"
roads = r"C:\GIS\data.gdb\roads"
out_gdb = r"C:\GIS\out.gdb"

clip_out = arcpy.analysis.Clip(roads, study, f"{out_gdb}\\roads_clip")
buf_out  = arcpy.analysis.Buffer(clip_out, f"{out_gdb}\\roads_buf_50m", "50 Meters")

arcpy.management.AddField(clip_out, "len_m", "DOUBLE")
arcpy.management.CalculateGeometryAttributes(
    clip_out, [["len_m","LENGTH_GEODESIC"]], length_unit="METERS"
)

print("Completed.")
المحور 4

بيانات الراستر: قراءة، مشتقات، مؤشرات، وسلاسل زمنية

الراستر (Raster) أساس الاستشعار عن بعد والتحليل البيئي: DEM، حرارة سطح، مؤشرات نباتية، تصنيفات. المطلوب تدريبيًا: قراءة سليمة + فهم الدقة + قص + اشتقاق مؤشرات.

Rasterio قراءة GeoTIFF وإحصاءات سريعة
import rasterio
import numpy as np

with rasterio.open("data_processed/dem.tif") as src:
    arr = src.read(1)
    print("CRS:", src.crs)
    print("Transform:", src.transform)
    print("Min/Max:", float(np.nanmin(arr)), float(np.nanmax(arr)))
مؤشر NDVI (مثال عملي) — مفهوم وإجراء

NDVI مثال تعليمي ممتاز لأنه يوضح فكرة الاشتقاق الطيفي من نطاقين (NIR و Red). الفكرة العامة متعارف عليها في الاستشعار عن بعد، والتنفيذ هنا عبر Rasterio كتطبيق مباشر.

import rasterio
import numpy as np

nir_path = "data_processed/S2_B08.tif"  # NIR
red_path = "data_processed/S2_B04.tif"  # Red

with rasterio.open(nir_path) as nir, rasterio.open(red_path) as red:
    N = nir.read(1).astype("float32")
    R = red.read(1).astype("float32")

    ndvi = (N - R) / (N + R + 1e-6)

    profile = nir.profile
    profile.update(dtype="float32", count=1)

    with rasterio.open("outputs/ndvi.tif", "w", **profile) as dst:
        dst.write(ndvi, 1)
مشتق انحدار تقريبي باستخدام rioxarray
import rioxarray as rxr
import numpy as np

dem = rxr.open_rasterio("data_processed/dem.tif").squeeze()

dx = dem.differentiate("x")
dy = dem.differentiate("y")

slope = np.degrees(np.arctan(np.hypot(dx, dy)))
out = dem.copy(data=slope)
out.rio.to_raster("outputs/slope_deg.tif")
ملاحظة تدريبية: هذا انحدار “تقريبي” مناسب للتعلم. في التحليل الرسمي قد تُفضّل أدوات مخصصة (GIS) حسب منهج المؤسسة.
المحور 5

الأتمتة وسلاسل العمل: من البيانات إلى المخرجات

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

Pipeline نموذج Pipeline: قراءة → تنظيف → تحليل → تصدير
  • حدد مدخلات واضحة (Input).
  • نفّذ التحويلات (Processing) على نسخة processed.
  • صدّر مخرجات صريحة (Output) بأسماء ثابتة.
  • سجل المعلمات الأساسية (CRS، حدود، تاريخ بيانات).
from pathlib import Path
import geopandas as gpd

BASE = Path(".")
inp_roads = BASE/"data_processed/roads.gpkg"
inp_study = BASE/"data_processed/study_boundary.geojson"
out_dir = BASE/"outputs"; out_dir.mkdir(exist_ok=True)

study = gpd.read_file(inp_study).to_crs(epsg=32638)
roads = gpd.read_file(inp_roads, layer="roads").to_crs(study.crs)

roads = roads.dropna(subset=["geometry"]).copy()
roads_clip = gpd.clip(roads, study)

roads_clip.to_file(out_dir/"roads_clip.gpkg", layer="roads", driver="GPKG")
تقارير تحويل نتائج إلى جداول منظمة (CSV) + مخرجات قابلة للعرض
import geopandas as gpd
import pandas as pd

districts = gpd.read_file("data_processed/districts.gpkg").to_crs(epsg=32638)
roads = gpd.read_file("data_processed/roads.gpkg", layer="roads").to_crs(districts.crs)

# انضمام مكاني: أي طريق يقع ضمن أي حي
join = gpd.sjoin(roads[["geometry"]], districts[["name","geometry"]], how="left", predicate="intersects")
summary = (join.dropna(subset=["name"])
              .assign(len_m = join.geometry.length)
              .groupby("name")["len_m"].sum()
              .sort_values(ascending=False)
              .reset_index())

summary["len_km"] = (summary["len_m"]/1000).round(3)
summary.drop(columns=["len_m"]).to_csv("outputs/roads_length_by_district.csv", index=False)
المحور 6

خرائط الويب: Leaflet و ArcGIS JS

الهدف من خرائط الويب: عرض بياناتك بطريقة تفاعلية، وربطها بخدمات نشر أو ملفات GeoJSON. Leaflet مناسب للخفة والسرعة، وArcGIS JS مناسب عند الاعتماد على بيئة Esri وخدماتها.

Leaflet خريطة أساس + طبقة GeoJSON + Popup

مثال Leaflet باستخدام L.geoJSON و L.tileLayer كما في توثيق Leaflet الرسمي. :contentReference[oaicite:5]{index=5}

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
<div id="map" style="height:420px;border-radius:14px"></div>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
  const map = L.map('map').setView([24.7,46.7], 6);

  const osm = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    maxZoom: 19, attribution:'© OpenStreetMap'
  }).addTo(map);

  fetch('data/points.geojson')
    .then(r => r.json())
    .then(g => {
      L.geoJSON(g, {
        onEachFeature: (f, layer) => {
          const name = (f.properties && f.properties.name) ? f.properties.name : '';
          layer.bindPopup(name);
        }
      }).addTo(map);
    });
</script>
ArcGIS JS MapView + FeatureLayer (4.x)

هذا مقتطف مرجعي يعتمد على وثائق ArcGIS Maps SDK for JavaScript. :contentReference[oaicite:6]{index=6}

<link rel="stylesheet" href="https://js.arcgis.com/4.29/esri/themes/light/main.css">
<div id="view" style="height:420px"></div>
<script src="https://js.arcgis.com/4.29/"></script>
<script>
require([
  "esri/Map",
  "esri/views/MapView",
  "esri/layers/FeatureLayer"
], (Map, MapView, FeatureLayer) => {

  const map = new Map({ basemap: "streets-navigation-vector" });

  const view = new MapView({
    container: "view",
    map,
    center: [46.7, 24.7],
    zoom: 6
  });

  const layer = new FeatureLayer({
    url: "YOUR_FEATURESERVER_URL/0"
  });

  map.add(layer);
});
</script>
المحور 7

PostGIS: التخزين المكاني والأداء والتحليل

PostGIS هو خيار مؤسسي ممتاز عندما تكبر البيانات أو تحتاج تعدد مستخدمين أو أداء أعلى. النقاط الأساسية: تفعيل PostGIS، استيراد البيانات، فهارس مكانية (GiST)، واستعلامات دقيقة.

تهيئة إنشاء قاعدة وتفعيل PostGIS
CREATE DATABASE gisdb;
\c gisdb
CREATE EXTENSION postgis;

SELECT postgis_full_version();
فهارس فهرس GiST لرفع الأداء

الفهرسة المكانية (GiST) ضرورية للاستعلامات المكانية. :contentReference[oaicite:7]{index=7}

CREATE INDEX idx_roads_geom
ON public.roads
USING GIST (geom);
تحليل أطوال الطرق داخل كل حي (Intersection + Length)

هذا النمط يعتمد على علاقات مكانية مثل ST_Intersects، وعمليات مثل ST_Intersection وST_Length. :contentReference[oaicite:8]{index=8}

SELECT d.id, d.name,
       SUM(ST_Length(ST_Intersection(r.geom, d.geom))) / 1000 AS km_len
FROM districts d
JOIN roads r
  ON ST_Intersects(r.geom, d.geom)
GROUP BY d.id, d.name
ORDER BY km_len DESC;
تنبيه مهم: لقياسات صحيحة بالأمتار، استخدم SRID متري (UTM) أو نفّذ تحويل إسقاط قبل القياس.
المحور 8

نشر الخدمات: GeoServer وWMS/WFS

نشر الخدمات يحوّل بياناتك من ملفات محلية إلى طبقات يمكن استهلاكها في تطبيقات الويب وبيئات GIS المختلفة. معيار OGC مثل WMS/WFS يجعل التكامل أسهل.

GeoServer خطوات نشر طبقة PostGIS كـ WMS/WFS
  1. إنشاء Workspace.
  2. إضافة Store من نوع PostGIS وربطه بقاعدة البيانات.
  3. نشر Layer وتحديد SRS الصحيح.
  4. اختبار Preview ثم استخدام رابط WMS/WFS في تطبيقات الويب.

هذه الخطوات مذكورة ضمن وثائق GeoServer الرسمية. :contentReference[oaicite:9]{index=9}

Leaflet استهلاك طبقة WMS داخل Leaflet
// مثال WMS
const wms = L.tileLayer.wms("https://YOUR-GEOSERVER/geoserver/wms", {
  layers: "workspace:layername",
  format: "image/png",
  transparent: true
}).addTo(map);
المحور 9

الجودة وإعادة الإنتاج: منهجية مؤسسية مختصرة

هذا المحور يثبت “مستوى” العمل. الهدف: أي نتيجة يمكن إعادة إنتاجها بنفس المدخلات والمعلمات، وبنفس مخرجات الجودة، وبنفس التوثيق.

Checklist قائمة تحقق تنفيذية قبل اعتماد أي مخرج
البند التحقق المعيار
CRS هل كل الطبقات بنفس CRS قبل التحليل؟ نعم + مذكور في التوثيق
جودة الهندسة هل توجد هندسات invalid أو تكرارات؟ تم الإصلاح/الإزالة + تسجيل ما حدث
مسارات الأدوات هل خطوات العمل موثقة (كود/نموذج)؟ نعم + أسماء مخرجات ثابتة
مصادر البيانات هل المصدر والتاريخ والرخصة مذكورة؟ نعم + رابط/مرجع
قابلية الإعادة هل يمكن لشخص آخر تشغيلها؟ نعم (متطلبات + خطوات)
أسلوب مبدأ “المخرجات المعيارية” داخل GEO Explore
  • تسمية ثابتة للمخرجات (outputs) مرتبطة بالمهمة وليس بالمزاج.
  • أي تحليل ينتج: (ملف بيانات) + (خريطة/صورة) + (ملخص جدولي).
  • عدم خلط “تجارب” مع “مخرجات نهائية” — التجارب في notebooks والمخرجات في outputs.
  • عدم الاعتماد على خطوات يدوية دون توثيق: ما لا يُكتب لا يُعتبر موجودًا.
المحور 10

مراجع رسمية مقترحة (للتعلم والتوثيق)

هذه روابط مرجعية رسمية تُستخدم للتعلّم والتوثيق داخل القسم

Docs روابط الوثائق الرسمية للأدوات