Клуб API Карт

map.geoObjects.getBounds() + кластеры

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

В map.geoObjects находятся как кластеры так и обычные гео-объекты: линии, полигоны. Как получить область всех объектов включая кластер? Пока придумал только один вариант:

1. получить область у map.geoObjects: map.geoObjects.getBounds()

2. обойти map.geoObjects и получить области у кластеров

3. вычислить общую область из 1 и 2

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

Правильное это решение или нет, зависит от ваших целей.

Цели могут быть две

1. Получить границы всех объектов на карте

2. Получить границы всех объектов, добавленных на карту в данный момент времени (кластеризатор добавляет на карту только объекты в видимой области карты).

 

Для варианта 1 алгоритм такой

1. Получаем map.geoObjects.getBounds()

2. Получаем границы кластеризатора clusterer.getBounds()

3. Вычисляем общую область.

 

Для варианта 2 будет достаточно map.geoObjects.getBounds()

Спасибо за ответ.

Цель - вариант 1.

Ваше решение совпадает с моим :) Но парочка вопросов:

 

1. в clusterer.getBounds(), clusterer — это объект созданный с помощью new ymaps.Clusterer? или может есть общий объект хранящий все кластеризаторы добавленные например так: map.geoObjects.add(geoQueryResult.clusterize())


2. Есть ли функция для вычисления общей области по массиву областей?


 

Для варианта 2 будет достаточно map.geoObjects.getBounds()

если на карте только кластеризатор, то map.geoObjects.getBounds() возвращает null

с null довольно неожиданно - разберемся, в чем там дело.

Специальных функций для п 1 и 2 нет. Но скрещивать границы довольно просто - нужно просто брать максимумы и минимумы границ.

 function boundsFromPoints (points) {

            if (!points.length) {

                return null;

            }

 

            var min = points[0].slice(0),

                max = min.slice(0),

                point;

 

            for (var i = 0, l = points.length; l; ++i, --l) {

                point = points[i];

                if (min[0] > point[0]) min[0] = point[0];

                if (min[1] > point[1]) min[1] = point[1];

                if (max[0] < point[0]) max[0] = point[0];

                if (max[1] < point[1]) max[1] = point[1];

            }

 

            return [min, max];

        }

Спасибо!

предлагаю добавить boundsFromPoints() в util.bounds

Подумаем, может так, а может надо подружить кластеризатор и map.geoObjects.getBounds()