0Pricing
Swift Academy · درس

الترميز الجغرافي والمناطق

حوّل الإحداثيات إلى عناوين وراقب المناطق.

الترميز الجغرافي والمناطق درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

ما هو الترميز الجغرافي؟

يحوّل الترميز الجغرافي عنوانًا بشريًا إلى إحداثيات، بينما يحوّل الترميز الجغرافي العكسي الإحداثيات إلى عنوان مقروء. يوفّر Core Location الكائن CLGeocoder للعمليتين، ويتواصل مع خوادم Apple.

import CoreLocation
let geocoder = CLGeocoder()

الترميز الجغرافي لعنوان

استدعِ geocodeAddressString(_:) مع عنوان حر الصياغة. يعيد الاستكمال مصفوفة من كائنات CLPlacemark؛ خذ العنصر الأول واقرأ location الخاص به.

geocoder.geocodeAddressString("Eiffel Tower, Paris") { placemarks, error in
    if let coord = placemarks?.first?.location?.coordinate {
        print(coord.latitude, coord.longitude)
    }
}

الترميز الجغرافي العكسي للإحداثيات

عند تزويده بكائن CLLocation، يعيد reverseGeocodeLocation(_:) علامات مكان تصف تلك النقطة، مثل الشارع والمدينة والبلد والرمز البريدي وغير ذلك.

let loc = CLLocation(latitude: 48.8584, longitude: 2.2945)
geocoder.reverseGeocodeLocation(loc) { placemarks, error in
    if let p = placemarks?.first {
        print(p.name ?? "", p.locality ?? "", p.country ?? "")
    }
}

بنية CLPlacemark

يتيح CLPlacemark حقولًا غنية، منها name وthoroughfare (الشارع) وlocality (المدينة) وadministrativeArea (الولاية) وpostalCode وcountry وisoCountryCode. كثير من هذه الحقول اختيارية، لذا فكّ تغليفها بحذر.

func format(_ p: CLPlacemark) -> String {
    [p.thoroughfare, p.locality, p.country]
        .compactMap { $0 }
        .joined(separator: ", ")
}

قيود أداة الترميز الجغرافي

تعتمد CLGeocoder على الشبكة، كما أنها مقيّدة بمعدل الطلبات. أرسل طلبًا واحدًا في كل مرة، وتجنّب الحلقات السريعة، وألغِ العمل الجاري باستخدام cancelGeocode() عندما لا تعود بحاجة إلى النتيجة.

geocoder.cancelGeocode()

الترميز الجغرافي باستخدام Async/Await

يوفّر Swift الحديث نسخًا غير متزامنة، تتيح لكم كتابة تعليمات برمجية خطية باستخدام try await بدلًا من معالجات الإكمال.

func coordinate(for address: String) async throws -> CLLocationCoordinate2D? {
    let placemarks = try await geocoder.geocodeAddressString(address)
    return placemarks.first?.location?.coordinate
}

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

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

// Requires NSLocationAlwaysAndWhenInUseUsageDescription
manager.requestAlwaysAuthorization()

تعريف CLCircularRegion

يمثل التسييج الجغرافي CLCircularRegion، الذي يحدد مركزًا ونصف قطر (بالمتر) ومعرّفًا فريدًا. اضبطوا notifyOnEntry وnotifyOnExit لاختيار الأحداث التي تهمكم.

let region = CLCircularRegion(
    center: CLLocationCoordinate2D(latitude: 41.0, longitude: 29.0),
    radius: 200,
    identifier: "OfficeZone"
)
region.notifyOnEntry = true
region.notifyOnExit = true

بدء مراقبة المناطق

استدعوا startMonitoring(for:) لبدء المراقبة. يفرض الجهاز حدًا (نحو 20 منطقة لكل تطبيق)، لذا راقبوا المناطق الأكثر صلة فقط في كل مرة.

if CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) {
    manager.startMonitoring(for: region)
}

استقبال أحداث الدخول والخروج

تُستدعى طريقتا المفوّض didEnterRegion وdidExitRegion عند عبور الحدود. استخدموا identifier الخاص بالمنطقة لمعرفة أي تسييج جغرافي أطلق الحدث.

func locationManager(_ m: CLLocationManager, didEnterRegion region: CLRegion) {
    print("Entered:", region.identifier)
}
func locationManager(_ m: CLLocationManager, didExitRegion region: CLRegion) {
    print("Exited:", region.identifier)
}

الاستعلام عن الحالة الحالية

لمعرفة ما إذا كان الجهاز موجودًا بالفعل داخل منطقة دون انتظار عبور أحد الحدود، استدعوا requestState(for:). تصل النتيجة إلى didDetermineState على هيئة .inside أو .outside أو .unknown.

manager.requestState(for: region)

func locationManager(_ m: CLLocationManager,
                     didDetermineState state: CLRegionState,
                     for region: CLRegion) {
    print(region.identifier, state == .inside ? "inside" : "outside")
}

اختبار سريع: الترميز الجغرافي والمناطق

تحققوا من فهمكم.

مراجعة: الترميز الجغرافي والمناطق

تعلّمتم التحويل بين العناوين والإحداثيات ومراقبة الحدود الجغرافية:

  • ينفّذ CLGeocoder الترميز الجغرافي الأمامي والعكسي (وتتوفر منه نسخ غير متزامنة)؛ كما أن استخدامه يخضع لحدود معدل الطلبات.
  • يحتوي CLPlacemark على حقول عناوين غنية، وجميعها اختيارية.
  • يعرّف CLCircularRegion التسييج الجغرافي؛ وتتطلب المراقبة إذن Always.
  • تعاملوا مع didEnterRegion/didExitRegion واستعلموا عن الحالة باستخدام requestState(for:).

الأسئلة الشائعة

هل درس «الترميز الجغرافي والمناطق» مجاني؟

نعم — نص درس «الترميز الجغرافي والمناطق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «الترميز الجغرافي والمناطق»؟

حوّل الإحداثيات إلى عناوين وراقب المناطق. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الترميز الجغرافي والمناطق»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. طلب إذن الموقع
  2. الحصول على موقع المستخدم
  3. عرض الخرائط في SwiftUI
  4. الترميز الجغرافي والمناطق
← العودة إلى Swift Academy