ما هي تقنيه السياج الجغرافي وكيف نستخدمه في تطبيقاتنا

Amer Alhelali
3 min readMar 25, 2024

--

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

كيف يعمل نظريًا؟

أنت بحاجة إلى شيئين، أولًا خط الطول وخط العرض ونصف قطر الموقع وسنسميه سياجًا، والشيء الثاني هو خط الطول وخط العرض للمستخدم.
بعد أن نحصل على البيانات التي نريدها، الآن سوف نقوم بحساب مسافة موقع المستخدم وموقع السياج بعد ذلك سنقارن بين المسافة ونصف القطر إذا كان نصف القطر أكبر من المسافة فهذا يعني أن المستخدم داخل السياج.

كيف ننفذ هذا برمجيًا؟

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

أولاً، نحتاج إلى الحصول على خط العرض ونصف القطر لمركز الملك عبد الله المالي وسنضعه في ملف التكوين.

ALLOWED_LOCATION_LONGITUDE="46.640885"
ALLOWED_LOCATION_LATITUDE="24.764790"
ALLOWED_LOCATION_RADIUS="633.82"

بعد أن قمنا بتعيين بيانات السياج، فلنبدأ بالسمة:

trait HasGeoFencing
{

public function checkGeoFencing(float $longitude, float $latitude): bool
{
try {
$distance = $this->calculateDistance($longitude, $latitude);

if ($distance <= config("app.allowed_location.radius")) {
return true;
}
return false;
} catch (Exception $exception) {
report($exception);
return false;
}
}

private function calculateDistance(float $givenLongitude, float $givenLatitude)
{
$theta = $givenLongitude - config("app.allowed_location.longitude");
$dist = sin(deg2rad(config("app.allowed_location.latitude"))) * sin(deg2rad($givenLatitude)) + cos(deg2rad(config("app.allowed_location.latitude"))) * cos(deg2rad($givenLatitude)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);

$miles = $dist * 60 * 1.1515;
$km = $miles * 1.609344;
return $km * 1000;
}
}

بعد أن أنشأنا السمة دعونا ننشئ البرمجيات الوسيطة:

class CheckIsLocationAllowed
{
use HasGeoFencing;
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{

if (!$longitude=$request->get("longitude")) {
return response()->json(["message" => "No longitude provided"], 400);
}
if (!$latitude=$request->get("latitude")) {
return response()->json(["message" => "No latitude provided"], 400);
}

if (!$this->checkGeoFencing(longitude: $longitude, latitude: $latitude)) {
return response()->json(["message" => "Unauthorized"], 401);
}
return $next($request);
}
}

الآن حان وقت الاختبار، وسوف نرسل طلبين لإدخال المستخدمين، أحدهما داخل السياج والآخر خارجه.

لذلك دعونا نبدأ بالسياج الداخلي:

تمثل الدائرة الأرجوانية الموقع الحالي للمستخدم و الموقع هو: 24.767720,46.642261

هذه هي النتيجة ويمكنك أن ترى أن النظام سمح للمستخدم بالوصول إلى نقطة النهاية هذه.

الآن دعنا نرسل طلبًا آخر ولكن الآن خارج السياج.

تمثل الدائرة الأرجوانية الموقع الحالي للمستخدم و الموقع هو: 24.768734,46.647067

هذه هي النتيجة ويمكنك أن ترى أن المستخدم غير مصرح له باستخدام نقطة النهاية هذه.

أخيرًا، هذه واحدة من بين العديد من الحالات التي يمكنك استخدامها والتعامل مع السياج الجغرافي. شكرًا على وقتك و قراءتك🤝.

--

--