0

下面的代码位于:/includes/search/functions/ajax.php 行:1489

这是在任何给定页面上使用基于所选搜索字段的图钉填充地图的内容...

谁能帮我弄清楚如何将此搜索限制在特定半径范围内,以便不加载地图上的每个图钉?

目前所有的引脚都加载在地图上,这会消耗分配的 CPU 功率,并且当立即加载超过 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" />
4

2 回答 2

0

您需要计算一个纬度/经度位置与另一个位置的距离。计算出此距离后,您可以将其与最大半径进行比较。执行此操作的一种算法是Haversine 公式

您将能够在 Internet 上找到许多实现,这里是 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;
}

参见(上面的代码片段,基本相同):How to check if a certain coordinates fall to another coordinate radius only using PHP

传入你的中心 lat/long 和记录 lat/long 以获得以米为单位的距离,然后进行比较:

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

1000你的半径在哪里。

于 2014-03-04T21:47:38.863 回答
0
$loopCount = 0;
$maxLoops = 10;
while($sQ->have_posts()) {
    if($loopCount == $maxLoops)
    {
        break;
    }
    $loopCount ++;
}

这应该只循环 10 次

于 2014-03-04T21:18:55.093 回答