Нужно высчитать крайние координаты меток, например этой функцией (была тут раньше):
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 - но вот как именно....
метка при добавлении в коллекцию появляется на карте автоматически.
но она может быть не видна, если находится за пределами видимого bounds карты.
чтобы при добавлении она была видна нужно пересчитать bounds элементов коллекции заного или, например можно использовать эту расширенную коллекцию, и слушать на ней boundschange
collection.events.add('boundschange', function (e) { map.setBounds(e.get('bounds'));});
тогда при добавлении меток в коллекцию карта сама будет масштабироваться так чтобы они все были видны
UPD:
это уже не нужно т.к. коллекциям в АПИ добавили метод расчета видимой области