Ограничить количество выводов на основе радиуса?

Код ниже находится по адресу: /include/search/functions/ajax.php: 1489

Это - то, что заполняет карту на любой данной странице булавками, основанными на выбранных полях поиска...

Кто-нибудь может помочь мне понять, как ограничить этот поиск определенным радиусом, чтобы каждый значок на карте не загружался?

На данный момент все контакты загружаются на карту, которая потребляет много ресурсов процессора и может в конечном итоге вызвать сбой браузера, когда более 1000 выводов загружаются сразу.

/////////////////////////////////////////////////////////////////
            //// ACTUALLY DOES THE QUERY
            /////////////////////////////////////////////////////////////////

            $sQ = new WP_Query($args);

            //// STARTS OUR POST ARRAY - EVERY FOUND POST IS INSERTED IN HERE IN ORDER TO ADD THE PINS
            $return['posts'] = array();
            $return['post_ids'] = array();

            /// LOOPS POSTS
            if($sQ->have_posts()) { while($sQ->have_posts()) { $sQ->the_post();

                ///// GETS REQUIRED FIELDS TO INSERT IN THE ARRAY
                $latitude = get_spot_latitude(get_the_ID());
                $longitude = get_spot_longitude(get_the_ID());
                $pin = get_spot_pin(get_the_ID());

                $featured = 'false';
                $thumb = '';

                //// IF FEATURED OVERLAYS ARE SET
                if(ddp('map_featured_overlay') == 'on') {

                    //// IF THIS IS FEATURED
                    if(get_post_meta(get_the_ID(), 'featured', true) == 'on') { $featured = 'true'; }
                    $thumb = ddTimthumb(btoa_get_featured_image(get_the_ID()), 150, 150);

                }

                //// ONLY ADDS TO THE ARRAY IN CASE WE HAVE A LATITUDE AND LONGITUDE
                if($latitude != '' && $longitude != '') {

                    $return['posts'][] = array(

                        'title' => get_the_title(),
                        'id' => get_the_ID(),
                        'latitude' => $latitude,
                        'longitude' => $longitude,
                        'pin' => $pin,
                        'permalink' => get_permalink(),
                        'featured' => $featured,
                        'thumb' => $thumb,

                    );

                    $return['post_ids'][] = get_the_ID();

                } else {

                    $return['posts'][] = array(

                        'title' => get_the_title(),
                        'error' => 'NO LATITUDE OR LONGITUDE'

                    );

                }//// ENDS IF POST HAS LATITUDE AND LONGITUDE

            } }

Это часть поля поиска:

<input type="hidden" id="_sf_enable_radius_search" value="false" name="_sf_enable_radius_search" />
                    <input type="hidden" id="_sf_radius_lat_from" value="" name="_sf_radius_lat_from" />
                   <input type="hidden" id="_sf_radius_lat_to" value="" name="_sf_radius_lat_to" />
                       <input type="hidden" id="_sf_radius_lng_from" value="" name="_sf_radius_lng_from" />
                   <input type="hidden" id="_sf_radius_lng_to" value="" name="_sf_radius_lng_to" />
                       <input type="hidden" id="_sf_radius_center_lat" value="" name="_sf_radius_center_lat" />
                       <input type="hidden" id="_sf_radius_center_lng" value="" name="_sf_radius_center_lng" />
                       <input type="hidden" id="_sf_radius_field" value="false" name="_sf_radius_field" />
                    <input type="hidden" id="_sf_radius_field_id" value="false" name="_sf_radius_field_id" />
                      <input type="hidden" id="_sf_post_ids" value="" name="_sf_post_ids" />


                       <input type="hidden" id="_sf_radius_distance" value="" name="_sf_radius_distance" />

                        <input type="hidden" name="is_taxonomy" value="true" id="_sf_search_is_taxonomy" />

2 ответа

Решение

Вам нужно рассчитать расстояние от одной широты / длинной позиции по сравнению с другой. Как только это расстояние рассчитано, вы можете сравнить его с вашим максимальным радиусом. Одним из алгоритмов для этого является формула Хаверсайна.

Вы сможете найти множество реализаций этого в интернете, вот та, что на PHP.

function getDistance($latFrom, $longFrom, $latTo, $longTo)
{
    $dLat = deg2rad($latTo - $latFrom);
    $dLon = deg2rad($longTo - $longFrom);

    $angle = sin($dLat / 2) * sin($dLat / 2) + cos(deg2rad($latFrom)) * cos(deg2rad($latTo)) * sin($dLon / 2) * sin($dLon / 2);

    $c     = 2 * asin(sqrt($angle));

    $distance = 6371000 * $c;

    // Distance is in metres
    return $distance;
}

Смотрите (фрагмент выше получен и в основном тот же): Как проверить, попадают ли определенные координаты в радиус других координат, используя только PHP

Передайте в вашем центре lat/long и записи lat/long, чтобы получить расстояние в метрах, а затем сравните его:

if (getDistance(0, 0, 0, 0) < 1000) {
    // do stuff
}

куда 1000 это ваш радиус

$loopCount = 0;
$maxLoops = 10;
while($sQ->have_posts()) {
    if($loopCount == $maxLoops)
    {
        break;
    }
    $loopCount ++;
}

Это должно только пройти через это 10 раз

Другие вопросы по тегам