کمال
7 سال پیش توسط کمال مطرح شد
2 پاسخ

مقایسه اعداد

سلام دوستان
من lat , lng را در جدول ذخیره میکنم و بعد بصورت DESC مرتب سازی میکنم
حالا یک نقظه دارم مثلا lat = 32.456666 , lng=59.25665
میخواهم در بین نقاط ثبت شده در دیتابیس نزدیک ترین نقظه رو به این نقظه پیدا کنم
باید چکار کنم
دستور php اش چی هست ؟


ثبت پرسش جدید
محمد امیر محمدی
تخصص : برنامه نویس لاراول و ویو جی اس
@mem.amir.m 7 سال پیش آپدیت شد
2

فرض میکنیم نقاط بر حسب 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);
}

کمال
تخصص : برنامه نویس ارشد وب
@kamalj 7 سال پیش مطرح شد
0

حالا من فاصله ها رو گرفتم و نزدیک ترین را هم انتخاب کردم
پروژه این طوریه که اگر درخواست برای نزدیک ترین سرویس دهنده رفت و رد کرد برود برای نزدیکترین بعدی
من با array_pop خانه آخر آرایه را حذف میکنم و میره برای بعدی
ولی اگر بعدی حذف کرد برای نفر 3 دیگر نمیرود
چون صفحه رفرش میشود و دوباره نزدیک خانه که خانه یک بود با array_pop حذف شده و دوباره درخواست برای فرد 2 میرود
لطفا راهنمایی بفرمایید چطور میتونیم چنین سیستمی پیاده کنیم منطقش چی هست ؟
عین اسنپ هست که درخواست به نزدیک ترین ارسال میشه اگر رد کرد میره برا بعدی . بعدی رد کرد برا بعدی و هی ادامه پیدا میکنه تا کسی بالاخره تایید کنه


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام