Question

The code beneath found at: /includes/search/functions/ajax.php line: 1489

This is what populates the map on any given page with the pins based on the search fields selected...

Can anybody help me figure out how to limit this search to specific radius so that every pin on the map is not loaded?

For now all the pins are loading on the map which consumes allot cpu power and could eventually crash the browser when more than 1000 pins are loading immediately.

/////////////////////////////////////////////////////////////////
            //// 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

            } }

This is part of the search field:

<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" />
Was it helpful?

Solution

You need to calculate the distance from one lat/long position compared to another. Once this distance is calculated you can then compare it to your maximum radius. One algorithm to do this is the Haversine formula.

You will be able to find many implementations of this across the internet, here is the one in 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;
}

See (snippet above derived and basically the same): How to check if a certain coordinates fall to another coordinates radius using PHP only

Pass in your center lat/long and the records lat/long to get the distance in metres and then compare it:

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

Where 1000 is your radius.

OTHER TIPS

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

This should only loop through it 10 times

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top