Клуб API Карт

Как отмасштабировать карту по коллекции ?

Пост в архиве.
ktotud
4 мая 2012, 16:50

ymaps.GeoObjectCollection(

Добавляю туда метки

как сделать чтоб на карте отобразились все метки с необходимым для этого масштабом ?

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

Нужно высчитать крайние координаты меток, например этой функцией (была тут раньше):

getBounds = function(collection) {

    var first_run, max_lat, max_long, min_lat, min_long;

    min_lat = min_long = max_lat = max_long = 0;

    first_run = true;

    collection.each(function(i) {

        var lat, long, _ref;

        _ref = i.geometry.getCoordinates(), lat = _ref[0], long = _ref[1];

        if (first_run) {

            first_run = false;

            min_lat = max_lat = lat;

            min_long = max_long = long;

        } else {

            min_lat = Math.min(min_lat, lat);

            max_lat = Math.max(max_lat, lat);

            min_long = Math.min(min_long, long);

            max_long = Math.max(max_long, long);

        }

    });

    return [[min_lat, min_long],[max_lat, max_long]];

};

 

затем:

var $map = $('#map'),

state = ymaps.util.bounds.getCenterAndZoom(

    getBounds(collection),

    [$map.width(), $map.height()]

);

 

var myMap = new ymaps.Map($map[0], state);

myMap.geoObjects.add(collection);

 

Единственное, не понятно как быть если всего одна метка в коллекции, в этом случае этот метод не сработает - будет задан такой масштаб, которого нет на карте.

Спасибо - сделаю масштаб просто по умолчанию если одна метка.

Еще вопрос чтоб темы не плодить.
Как сделать обработчик событий на всю коллекцию?
То есть если из нужной коллекции переместили метку - как вызвать событие ? Я понимаю что dragend - но вот как именно....

Насколько я знаю, для всей коллекции одним разом назначить событие нельзя. Зато можно в цикле, в котором вы собираете коллекцию, написать следующее:

 

for(var key in placemarks){

    var placemark = new ymaps.Placemark([placemarks[key].point[1], placemarks[key].point[0]]);

    (function (p) {

        p.events.add('dragend', function (e) {

            // делаем что-то

        });    

    }(placemark));

    collection.add(placemark);

}

 

collection.events.add('dragend', function (e) {

   // e.get('target') - метка, которую перетащили

});

Спасибо! Теперь немного уже начинаю понимать )))

Вопрос только возник - вот я делаю коллекцию

l=new ymaps.GeoObjectCollection();

добавляю туда метки
...
$p = new ymaps.Placemark([$data->X, $data->Y],
    {balloonContent: '$data->Note'},
    {draggable: true}
   );
...

вывожу коллекцию на карту
iMap.geoObjects.add(коллекция);

Потом добавляю метку в коллекцию - а как ее на карту отобразить ?
Яж понимаю не полным убиранием коллекции с карты и добавлением заного ? :))

iMap.geoObjects.add(метка); тоже не подходит - хочется чтоб метка то была в коллекции все таки

если коллекция уже добавлена на карту, то 

метка при добавлении в коллекцию появляется на карте автоматически.

но она может быть не видна, если находится за пределами видимого bounds карты.

чтобы при добавлении она была видна нужно пересчитать bounds элементов коллекции заного или, например можно использовать эту расширенную коллекцию, и слушать на ней boundschange

 

collection.events.add('boundschange', function (e) { map.setBounds(e.get('bounds'));});

 тогда при добавлении меток в коллекцию карта сама будет масштабироваться так чтобы они все были видны 

UPD:

это уже не нужно т.к. коллекциям в АПИ добавили метод расчета видимой области

ссылка на коллекцию битая

спасибо, поправил и добавил коммент что этот метод уже реализован в АПИ

К кластерам по прежнему не применимо?