В данном очерке я расскажу как простейшим образом обеспечить автоматическое объединение точек на карте Яндекс в "кластеры", если точки находятся рядом друг с другом. Речь, конечно, идет о дефолтном компоненте Яндекс.Карты Битрикс.
Суть очень проста. В стандартной реализации шаблона компонента точки на карту добавляются одна за другой. Если нам нужно применить их кластеризацию - их не нужно добавлять одну за другой, нам нужно создать массив всех точек, а потом запихнуть его в кластер.
Итак.
Подготовительная работа (переносим шаблон):
- Берем шаблон компонента map.yandex.view c назанием .default из /bitrix/components/map.yandex.view/templates
- Копируем его в папку с шаблонами данного компонента в своем шаблоне - например, /bitrix/templates/my_template/components/map.yandex.view, где my_template - название нашего шаблона
- Файлы шаблона в итоге лежат в /bitrix/templates/my_template/components/bitrix/map.yandex.view/.default/ соответственно
Далее.
Открываем template.php.
Ищем строчку
arObjects.PLACEMARKS[arObjects.PLACEMARKS.length] = BX_YMapAddPlacemark(map, <?echo CUtil::PhpToJsObject($arResult['POSITION']['PLACEMARKS'][$i])?>);
|
Меняем ее на
arObjects.PLACEMARKS[arObjects.PLACEMARKS.length] = BX_YMapAddPlacemark(map, <?echo CUtil::PhpToJsObject($arResult['POSITION']['PLACEMARKS'][$i])?><?if(count($arResult['POSITION']['PLACEMARKS'])>1):?>, true<?endif;?>); |
Далее в самом конце данной функции (перед закрывающей скобочкой } )
function BX_SetPlacemarks_<?echo $arParams['MAP_ID']?>(map) |
пишем
<?if(count($arResult['POSITION']['PLACEMARKS'])>1):?>
clusterer = new ymaps.Clusterer();
clusterer.add(arObjects.PLACEMARKS);
map.geoObjects.add(clusterer);
<?endif;?>
|
Сохраняем template.php... Открываем script.js.
Ищем
window.BX_YMapAddPlacemark = function(map, arPlacemark) |
Меняем на
window.BX_YMapAddPlacemark = function(map, arPlacemark, isClustered) |
Далее ищем
map.geoObjects.add(obPlacemark); |
Меняем на
if(!isClustered) { map.geoObjects.add(obPlacemark); } |
Задача выполнена.