Я придумал приведенный ниже код, чтобы выяснить, достаточно ли одного маркера достаточно близко к другому для кластеризации - закрыть, если два значка кластера начинают перекрываться. Работает для всей карты мира для всех уровней масштабирования.
Проблема в том, что проекция карты нелинейная, и вы не можете просто установить допуск delta_lang
delta_lat
- оба будут зависеть от широты. Для локальных карт это не проблема.
Если вы хотите сделать все на стороне сервера, вам придется рассчитывать кластерные маркеры для каждого уровня масштабирования либо для вызова AJAX, либо распечатывать их все сразу.
function isCloseTo($other,$z){//$z is zoomlevel
$delta_lat = abs($this->lattitude - $other->lattitude);
$delta_lng = abs($this->longitude - $other->longitude);
$l = abs($this->lattitude);
$l2 = $l*$l;
$l3 = $l2*$l;
$l4 = $l3*$l;
$factor = 1
+0.0000312*$l
+0.0003604*$l2
-0.000009858*$l3
+0.0000001506*$l4;
$tol_lat = (45.42*exp(-0.6894339*$z)/3)/$factor;
$tol_lng = 21.845*exp(-0.67686*$z)/2;
if ($delta_lat < $tol_lat and $delta_lng < $tol_lng){
return true;
}
else{
return false;
}
}