Ограничить количество выводов на основе радиуса?
Код ниже находится по адресу: /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 раз