Клуб API Карт

Определение границ набора YMapsML

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

Добрый день.

Есть некоторая коллекция в файле YMapsML. Подскажите, пожалуйста, как сделать так, чтобы при ее отображении на карте автоматически устанавливались границы и зум таким образом, чтобы все точки помещались на карте? Пока вижу единственный вариант - при создании исходного файла вычислять максимальные границы. Неужели нет готового решения?

9 комментариев
В YMapsML можно выставить границы отображения карты с помощью тега  boundedBy (который расположен в теге View). Однако, для этого вам,  действительно, нужно высчитывать bounds до создания файла.

Есть еще альтернативный вариант - выставить центр карты после загрузки  YMapsML. Для этого координаты всех объектов нужно добавить в  YMaps.GeoCollectionBounds, а потом его выставить карте. Примерно так:

// Создание и добавление на карту YMapsML
var ml = new YMaps.YMapsML('путь до ymapsml');
map.addOverlay(ml);

// Обработчик успешной загрузки YMapsML
YMaps.Events.observe(ml, ml.Events.Load, function (ml) {
    var bounds = new YMaps.GeoCollectionBounds();

    // Проходим все объекты
    ml.get(0).filter(function (obj) {
        bounds.add((object.getGeoPoint || object.getPoints).call(object));
    });

    // Выставляем bounds для карты
    map.setBounds(bounds);
});

Я  проходил все объекты в YMapsML с помощью метода filter. Это можн обыло  сделать с помощью метода forEach, однако, forEach не умеет заходить во  вложенные подгруппы, а filter() - умеет.
Спасибо за идею!
А как тогда быть с setcenter? Без setcenter карта не инициализируется, а что туда передавать в таком случае - непонятно.
setBounds будет достаточно.

Посмотрите пример:
http://api.yandex.ru/maps/ymapsml/examples/showhttpgeocoderresult.html

В нем также область показа выставляет после загрузки YMapsML.

Саша, спасибо за вашу доброту, но все равно не срабатывает.
Вот мой код с вашим дополнением:



 YMaps.jQuery(function ()
 {


 var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);


 map.enableScrollZoom();
 map.addControl(new YMaps.ToolBar());
 map.addControl(new YMaps.TypeControl());
 map.addControl(new YMaps.Zoom());



 var ml = new YMaps.YMapsML("http://....xml");


 YMaps.Events.observe(ml, ml.Events.Load, function (ml)
 {
  ml.get(0).forEach(function (item)
   {
    addMenuItem(item, map, YMaps.jQuery("#menu"));
    map.addOverlay(item);
   } );
 } );



 YMaps.Events.observe(ml, ml.Events.Load, function (ml)
 {
  var bounds = new YMaps.GeoCollectionBounds();


  // Проходим все объекты
  ml.get(0).filter(function (obj)
  {
   bounds.add((object.getGeoPoint || object.getPoints).call(object));
  } );
  // Выставляем bounds для карты
  map.setBounds(bounds);
 }  );
...



 Говорит "object - определение отсутствует".
Дополню - в xml-файле коллекция с несколькими подколлекциями.
Если добавить setcenter, то все работает корректно, но вот границы автоматически установить не могу.

Более того, даже включение вычисленных координат в xml-файл не спасает - карта серая.
ml.get(0).filter(function (obj)

замените на

ml.get(0).filter(function (object)

Это я тоже сделал.



 YMaps.jQuery(function ()
 {


 var map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);


// map.setCenter(new YMaps.GeoPoint(-1,-1));
 
 map.enableScrollZoom();
 map.addControl(new YMaps.ToolBar());
 map.addControl(new YMaps.TypeControl());
 map.addControl(new YMaps.Zoom());


 var ml = new YMaps.YMapsML("http://....xml");


 YMaps.Events.observe(ml, ml.Events.Load, function (ml)
 {
  ml.get(0).forEach(function (item)
   {
    addMenuItem(item, map, YMaps.jQuery("#menu"));
    map.addOverlay(item);
   } );
 } );


 YMaps.Events.observe(ml, ml.Events.Load, function (ml)
 {
  var bounds = new YMaps.GeoCollectionBounds();


  ml.get(0).filter(function (object)
  {
   bounds.add((object.getGeoPoint() || object.getPoints()).call(object));
  } );
  map.setBounds(bounds);
 }  );



 Тогда на строчку

   bounds.add((object.getGeoPoint() || object.getPoints()).call(object));

 ругается "Объект не поддерживает это свойство или метод".
Вложенные группы также перебираются с помощью метода filter(). Что-то я про них забыл.
Нужно добавить небольшое условие:

// Проходим все объекты
ml.get(0).filter(function (object) {
    if (!(object instanceof YMaps.GeoObjectCollection)) {
        bounds.add((object.getGeoPoint || object.getPoints).call(object));
    }
});

У группы нет метода getGeoPoint() или getPoints(). Из-за этого и была ошибка.
Заработало!!!
Спасибо! :)