Клуб API Карт

Заголовок не указан

lostamok
6 октября 2010, 12:07
Здравствуйте!
Есть коллекция точек на которую необходимо навести карту через YMaps.Map.setBounds()
var targetBounds = new YMaps.GeoBounds.fromCenterAndSpan(
pointsGeoCollectionBounds.getCenter() // new YMaps.GeoPoint(37.190851, 55.988273)
, pointsGeoCollectionBounds.getSpan() // new YMaps.Size(0.075171, 0.022941)
);
map.setBounds(targetBounds);
всё работает корректно только в Google Chrome
в остальных браузерах карта только правильно центрируется, но не устанавливает максимально возможный зум для установленной области.
В чём может быть проблема, может у меня руки кривые?
Что мне необходимо сделать, чтобы везде работало как в хроме?
19 комментариев
Подписаться на комментарии к посту
А не пробовали просто map.setBounds(pointsGeoCollectionBounds)?
Не принципиально.
Bounds корректно задаются в обоих случаях (на всякий случай проверил).



Проблемы это не решает.

Что возвращает pointsGeoCollectionBounds.getMapZoom(map)?
в Chrome 13, а в остальных 4.
в остальных браузерах он не применяется.
там изначально установлено значение 4.
Я не спрашиваю масштаб карты, интересует именно результат метода.
я и написал результат выполнения метода pointsGeoCollectionBounds.getMapZoom(map);

Дайте ссылку на страницу. У вас или коллекция по-разному считается, или карты разных размеров в браузерах.

ссылку на карту дать не получится, но можно воссоздать Bounds следующим образом, эти данные формируются одинаково во всех браузерах.

var targetBounds = new YMaps.GeoBounds.fromCenterAndSpan(
new YMaps.GeoPoint(37.190851, 55.988273)
, new YMaps.Size(0.075171, 0.022941)
);
Похоже, дело не в bounds. Приведите результат map.getContainerSize() в обоих браузерах.
В Chrome (868,537).
В остальных (0,0)
Вот и ответ.
хмм...
Это не ответ, но симптом...
Только я не могу понять, как сделать так, чтобы объект карты увидел размер контейнера?
Метода типа setContainerSize нет. Контейнеру и в css и в атрибуте style размеры контейнера заданы.
Но почему он их не видит?
Зависит от того, как вы инициализируете карту. Можете поднять тестовую html-страничку на том же narod.ru и там воспроизвести?
Здесь масштаб правильный.
Нашёл ещё один симптом, если поставить большой(несколько тысяч) setTimeout после добавления точек на карту и только потом вызывать map.setBounds(pointsGeoCollectionBounds), то всё работает нормально...
Интересно есть ли событие, означающее завершение полной инициации карты?
Решил проблему.

Изначально карта скрыта (display: none) и отображается на событие load...
Инициация карты происходит пока она ещё скрыта, все баузеры (кроме Chrome) считают размер скрытой карты 0х0, что и приводит к неверному определению максимально возможного zoom'a по заданной области.


Решением стало изменение параметра прозрачности вместо видимости.
А можно скрывать контейнер следующим образом: сделать его абсолютно позиционированным с большим отрицательным парамтром top или left.

Например, создадим простенький css-класс:

.display_none {
    position: absolute;
    left: -5000em;
}

Соответственно, вот так будет выглядеть html для скрытого контейнера:


В этом случае размер контейнера будет задан верно изначально и bounds будет рассчитывать верно. К тому же он этот способ имеет преимущество перед visibility:none - скрытый контейнер не занимает пространство в соотстветствии со своими размерами, а скрывается как если бы к нему было применено display:none.
да, как вариант, но я меняю элементу не visibility, a opacity...