سلام دوستان
من lat , lng را در جدول ذخیره میکنم و بعد بصورت DESC مرتب سازی میکنم
حالا یک نقظه دارم مثلا lat = 32.456666 , lng=59.25665
میخواهم در بین نقاط ثبت شده در دیتابیس نزدیک ترین نقظه رو به این نقظه پیدا کنم
باید چکار کنم
دستور php اش چی هست ؟
فرض میکنیم نقاط بر حسب x و y یا همون (lng,lat) مرتب شده باشند.
متد getDistance رو داریم برای بدست آوردن فاصله دوتا نقطه
function getDistance(array $p1, array $p2) {
$distance = pow(($p1[0]-$p2[0]),2) + pow(($p1[1]-$p2[1]),2);
return $distance;
}
و به صورت بازگشتی از متد زیر استفاده میکنیم نزدیکترین نقطه رو به نقطه مورد نظر پیدا میکنیم.
function _closestPair(array $xP, array $yP) {
$size = sizeof($xP);
if($size <= 3) {
list($closest,$closestPair) = bruteforce($xP);
return array($closest,$closestPair);
}
$xL = array_slice($xP,0,$size/2);
$xR = array_slice($xP,$size/2);
$xm = $xP[$size/2];
$yL = array();
$yR = array();
foreach ($yP as $p) {
($p[1] < $xm[1]) ? $yL[] = $p : $yR[] = $p;
}
list($LClosest,$LClosestPair) = _closestPair($xL, $yL);
list($RClosest,$RClosestPair) = _closestPair($xR, $yR);
$minD = $LClosest; $minDPair = $LClosestPair;
if($RClosest < $minD) {
$minD = $RClosest; $minDPair = $RClosestPair;
}
$pointsY = array();
foreach ($yP as $p) {
(getDistance($p,$xm) < $minD) ? $pointsY[] = $p : '';
}
$sizeY = sizeof($pointsY);
$closestD = $minD;
$closestPair = $minDPair;
if($sizeY > 1) {
for($i = 0; $i < min(6,$sizeY-1); $i++) {
for($j = 1; $j < min(7,$sizeY); $j++) {
if (getDistance($pointsY[$i],$pointsY[$j]) < $minD) {
$closestD = getDistance($pointsY[$i],$pointsY[$j]);
$closestPair = array($pointsY[$i],$pointsY[$j]);
}
}
}
}
return array($closestD, $closestPair);
}
حالا من فاصله ها رو گرفتم و نزدیک ترین را هم انتخاب کردم
پروژه این طوریه که اگر درخواست برای نزدیک ترین سرویس دهنده رفت و رد کرد برود برای نزدیکترین بعدی
من با array_pop خانه آخر آرایه را حذف میکنم و میره برای بعدی
ولی اگر بعدی حذف کرد برای نفر 3 دیگر نمیرود
چون صفحه رفرش میشود و دوباره نزدیک خانه که خانه یک بود با array_pop حذف شده و دوباره درخواست برای فرد 2 میرود
لطفا راهنمایی بفرمایید چطور میتونیم چنین سیستمی پیاده کنیم منطقش چی هست ؟
عین اسنپ هست که درخواست به نزدیک ترین ارسال میشه اگر رد کرد میره برا بعدی . بعدی رد کرد برا بعدی و هی ادامه پیدا میکنه تا کسی بالاخره تایید کنه
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟