Клуб API Карт

Bounds (границы) массива кластеров

Пост в архиве.

Всем привет!

Так уж сложилось, что есть массив кластеров и нужно узнать совокупные границы всех элементов этого массива. Гуглил, яндексил, апил, но не нашел простого подходящего решения.

Буду рад помощи.

UPD: прошу прощения, но не массив кластеров, а хэш.

9 комментариев

http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/Clusterer.xml#getBounds

getBounds()Number[][]|nullВозвращает географические координаты прямоугольной области, охватывающей все элементы кластеризатора.

У меня меня массив объектов ymaps.Clusterer... как узнать области объектов одного кластеризатора я знаю. А вот как узнать область хэша кластеризаторов - нет.

Всеволод Шмыров
28 января 2016, 01:37
Можно добавить кластеры в GeoObjectArray, у которой и можно вызвать getBounds().
http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/GeoObjectArray.xml

Спасибо, попробую!

Можно массивы загнать в geoQuery

var bounds = ymaps.geoQuery(arr1).add(arr2).getBounds();

Плюс этого решения - у объектов останется прежний родитель

Странно, но баунды не устанавливаются, хотя высчитываются:

var bounds = [], geoQuery;

for(var i in geoClusterers) {
    bounds.push(geoClusterers[i]);
}

geoQuery = ymaps.geoQuery(bounds);
map.setBounds(geoQuery.getBounds());

geoClusterers - это хэш вида:


{
    'bookmaker-1': new ymaps.Clusterer(),
    'bookmaker-2': new ymaps.Clusterer()
}

Объекты Placemark есть в хэше по обоим ключам.

Такие конструкции geoQuery не поймет.

Вы можете просто пробежаться по кластеризаторам в массиве, у всех взять getBounds и потом просто найти область, закрывающую все эти баундсы (черех Math.max просто).

 

Либо в geoQuery передавать массивы с метками, которые вы помещаете в кластериазоры.

Очень странно, что не понимает, т.к. я скармливаю массив объектов, реализующих интерфейс ICollection, и если сделать console.log(geoQuery.getBounds()), то вернется вполне адекватный массив с баундами.

А расскажите, как через Math.max сделать, а то я слабо представляю, как там сравнивать двухмерные массивы?

ну во-первых, вы передавали хэш, а это уже никакой не интерфейс.

Если в geoQuery передавать коллекцию, он пытается ее распотрошить, и в случае с кластеризатором это будет довольно неожиданно, поэтому кластеризаторы в geoQuery помещать пока не получается.

По поводу сравнений - 

var bounds1 = c1.getBounds(),

     bounds2 = c2.getBounds(),

     finalBounds;

finalBounds = [

    [Math.min(bounds1[0][0], bounds2[0][0]), Math.min(bounds1[0][1], bounds2[0][1])],

    [Math.max(bounds1[1][0], bounds2[1][0]), Math.max(bounds1[1][1], bounds2[1][1])]

];