في تطبيقات النقل الذكي مثل Trendo Taxi، حساب التكلفة لا يعتمد فقط على المسافة (الكيلومترات). هناك عامل حاسم آخر: أين أنت؟ سعر الكيلومتر في المناطق الوعرة أو المزدحمة يختلف عن الطرق السريعة. ولتحقيق ذلك برمجياً، لم نستخدم دوائر بسيطة، بل استخدمنا تقنية Geofencing مع مضلعات معقدة (Polygons) لرسم مناطق مخصصة على الخريطة (مثل: منطقة جامعة كركوك، منطقة المطار، مركز المدينة).

التحدي التقني هو: كيف يعرف السرفر في أجزاء من الثانية ما إذا كانت “نقطة” تواجد الراكب تقع داخل هذا “المضلع” المعقد؟

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


الجزء الأول: تخزين المناطق (MySQL Spatial Data)

(اكتب هذا قبل الكود) بدلاً من تخزين المناطق كأرقام عشوائية، استخدمنا ميزة Spatial Data Types الموجودة في قواعد بيانات MySQL الحديثة. نقوم بتخزين المنطقة كشكل هندسي مغلق (Polygon).

(انسخ هذا الكود في بلوك SQL/Database):

SQL

-- هيكلية جدول المناطق الجغرافية
CREATE TABLE zones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100), -- مثلاً: منطقة المطار
    base_price DECIMAL(10, 2), -- سعر فتح العداد لهذه المنطقة
    price_per_km DECIMAL(10, 2), -- سعر الكيلومتر هنا
    area POLYGON NOT NULL, -- هنا يتم تخزين إحداثيات المنطقة
    SPATIAL INDEX(area) -- فهرس مكاني لسرعة البحث
);

-- مثال لإدخال منطقة (مربع بسيط)
INSERT INTO zones (name, base_price, price_per_km, area)
VALUES ('Kirkuk Center', 2000, 500, 
    ST_GeomFromText('POLYGON((44.3 35.4, 44.4 35.4, 44.4 35.5, 44.3 35.5, 44.3 35.4))')
);

الجزء الثاني: خوارزمية “النقطة داخل المضلع” (Point in Polygon)

(اكتب هذا الشرح قبل كود الـ Backend) عندما يطلب العميل سيارة، يرسل إحداثياته (خط الطول والعرض). يقوم السرفر بتنفيذ استعلام مكاني (Spatial Query) فائق السرعة لمعرفة المنطقة التي تحتوي هذه النقطة. استخدمنا دالة ST_Contains التي تقوم بعملية حسابية هندسية معقدة في جزء من الثانية.

(انسخ هذا الكود في بلوك PHP/Laravel):

PHP

use Illuminate\Support\Facades\DB;

public function calculatePrice($latitude, $longitude) {
    
    // 1. البحث عن المنطقة التي يقع فيها الراكب حالياً
    // نستخدم Raw SQL للاستفادة من دوال MySQL المكانية
    $zone = DB::table('zones')
        ->whereRaw("ST_Contains(area, ST_GeomFromText('POINT(? ?)'))", [$longitude, $latitude])
        ->first();

    // 2. معالجة السعر
    if ($zone) {
        return [
            'zone_name' => $zone->name,
            'base_price' => $zone->base_price,
            'rate' => $zone->price_per_km
        ];
    }

    // 3. السعر الافتراضي إذا كان خارج المناطق المحددة
    return [
        'zone_name' => 'General Area',
        'base_price' => 1500,
        'rate' => 400
    ];
}

الجزء الثالث: المرونة في الإدارة (Dynamic Dashboard)

(اكتب هذا الشرح) لم نكتفِ بالكود الخلفي، بل بنينا لوحة تحكم تفاعلية تسمح لإدارة Trendo Taxi برسم هذه المناطق يدوياً على خريطة Google Maps. بمجرد رسم المنطقة وتحديد سعرها، يتم تحويل الرسم إلى كود POLYGON وحفظه في قاعدة البيانات فوراً. هذا يعني أن الإدارة تستطيع رفع الأسعار في “منطقة الاحتفالات” مثلاً خلال ثوانٍ.


(الخاتمة)

التعامل مع الخرائط ليس مجرد “عرض وتكبير”، بل هو علم هندسي كامل. في Giturn، نحن نستخدم الرياضيات المتقدمة وقواعد البيانات المكانية لضمان أن كل دينار يتم احتسابه في التطبيق هو دينار دقيق وعادل.

هل تريد بناء تطبيق توصيل يعتمد على مناطق نفوذ وأسعار ذكية؟
[تواصل معنا لتنفيذ فكرتك].


اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *