Клуб API Карт

Вопрос про ZOOM.

EFRRR
15 марта 2010, 10:24

Доброе всем утро.

Необходимо получать zoom(integer), при котором данный объект отображается на карте максимально близко, а не отображается серое поле с надписью "Для этого участка местности нет данных, попробуйте перейти на масштаб выше....".

map.setZoom(map.getBounds().getMapZoom(map)) - не работает. Точней оно работает, но только при первой загрузке...

map.setZoom(map.getMaxZoom(map.getBounds())) - ставит максимальный, но при этом отображаются эти серые квадраты, для которых не существует рисунка. При переходе на несколько масштабов вверх, появляется изображение, но необходимо чтобы оно сразу появлялось, т.е. чтобы zoom устанавливался сразу какой надо.


Используется это в геокодинге, т.е. объекты всегда разные.

5 комментариев
Подписаться на комментарии к посту
100% работающий вариант.

шаг 2(два)
устанавливаем карту куда надо в максимально доступный зум( как вы с сделали)

шаг 1 - патчим ITile чтобы он при onerror делал зум наверх..

как работает - зумаетесь в "серость" потом, примерно за секунду", карта выкидывает вас наверх.

работает 100%.

вариант с getMaxZoom работает не очень точно, так как он основывается на данные с относительно низкой точностью - передавать в клиент полные данные по доступности зумов - крутовато
Чего-т насчёт ITile вообще не понял ничего :)
ITile реализует пользовательское расчерчивание карты.... как-то так?
Я не пойму в общем как его вообще использовать, можете как-то подробнее?
такс, меня поправили ниже..
в общем пишем

ImageTile.prototype.error = function(){
 вот он наш колбэк на незагрузку карты
 делаем
 map.setZoom(map.getZoom()-1);
}

точнее - фиксируем что у нас была ошибка, а на на Update\Idle\MoveEnd проверяем были ли ошибки.
Правда тама надо учитывать что ошибки пришли с того зума который проверяем , а не с нового, уже после нового outzoomа..

никак не могу найти как я енто делал
только "патчить" нужно не ITile, а ImageTile.
Если используется в геокодере, то можно определить bounds для этого объекта. Например:
// Создание объекта геокодера
var geocoder = new YMaps.Geocoder("Москва");

// По завершению геокодирования инициализируем карту первым результатом
YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
    if (geocoder.length()) {
        // Первый результат геокодирования
        var geocodeResult = geocoder.get(0);
    }
});
Соответственно geocodeResult.getBounds() - область, на которой объект виден при максимальном приближении.
Его можно передать кате, вот так:
map.setBounds(geocodeResult.getBounds());
Из bounds легко получить масштаб с помощью метода getMapZoom():
var zoom = geocodeResult.getBounds().getMapZoom(map)