根据半径限制引脚数量?
Posted
技术标签:
【中文标题】根据半径限制引脚数量?【英文标题】:Limit the number of pins on based on radius? 【发布时间】:2014-03-04 21:12:25 【问题描述】:下面的代码位于:/includes/search/functions/ajax.php line: 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" />
【问题讨论】:
澄清一下,您想限制地图上放置在指定中心半径范围内的图钉吗? 是的,这正是我想要实现的目标。 【参考方案1】:您需要计算一个纬度/经度位置与另一个位置的距离。计算出此距离后,您可以将其与最大半径进行比较。执行此操作的一种算法是Haversine formula。
您将能够在互联网上找到许多实现,这里是 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;
见(sn-p上面推导和基本一样):How to check if a certain coordinates fall to another coordinates radius using PHP only
输入你的中心纬度/经度和记录纬度/经度以获得以米为单位的距离,然后进行比较:
if (getDistance(0, 0, 0, 0) < 1000)
// do stuff
1000
是您的半径。
【讨论】:
感谢您的帮助,我将调查您发布的其他问题,看看它是否适合我的问题。【参考方案2】:$loopCount = 0;
$maxLoops = 10;
while($sQ->have_posts())
if($loopCount == $maxLoops)
break;
$loopCount ++;
这应该只循环 10 次
【讨论】:
我认为这不是 OP 所要求的。他/她需要基于半径的限制。以上是关于根据半径限制引脚数量?的主要内容,如果未能解决你的问题,请参考以下文章