Клуб API Карт

Масштаб карты в зависимости от "уровня подробности (точности) адреса"

Serg-135
4 сентября 2013, 18:32

Каким образом можно установить (определить) масштаб карты, в зависимости от того наскольео подробным был адрем в геокоде? Т.е если например я определил геокод по адресу  "Рязанская область", то затем когда строю карту по полученным координатам, масштаб соответсвовал уровню "город" или "область" т.к zoom=8-10, а когда геокод определялся для более точного адреса, нпример "г. Рязань, ул. Горького, д. ХХ", то масштаб при выводе такой карты был бы уже на уровне  "улица-дом"  т.е zoom= где-то 15. И т.д по такому же принципу . Это возможно?

Спасибо

14 комментариев
Подписаться на комментарии к посту

В ответе геокодера есть информация о границах найденого обьекта.

Смотрите поля boundedBy.Envelope.

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

В обоих случаях - ровно такой, какой нужен для отображения.

т.е. значение из boundedBy.Envelope подставлять в zoom? А если геокодирование было на стороне сервера через http геокодер, то какое поле смотреть в xml ответе?

 

В zoom подставлять не надо.

Можно подставить в опцию bounds конструктора карты или в метод setBounds

 

Описание области есть в схеме ответа геокодера

<boundedBy xmlns="http://www.opengis.net/gml"> <Envelope> <lowerCorner>37.583490 55.750778lowerCorner> <upperCorner>37.591701 55.755409upperCorner> Envelope> boundedBy>

Спасибо!  С setBounds вроде получилось, а вот с опцией bounds что-то никак.

Я правильно делаю:

var myMap = new ymaps.Map('map', {
            center: [55.734046, 37.588628],
            zoom: 9,
            behaviors: ['default', 'scrollZoom'], bounds [37.583490, 55.750778][37.591701, 55.755409]
        })

?

 

нет. Это синтаксически неверная конструкция

Опять проблема(((. Когда устанавливаю границы через  setBounds, то возникает следующее: если карта  размещается  в изначально скрытом контейнере (с display:none), то при показе карты, показывается карта мира, а по краям серые тайлы. Если контейнер не не скрытый, то вроде все работает. Во всяком случае когда копирую код в Песочницу, то масштаб меняется правильно. Код взял практически из описания конструктора:

myMap.setBounds([[54.594428,39.726637], [54.605516,39.732916]], { 
checkZoomRange: true, callback: function(err) {
if (err) { // Не удалось показать заданный регион
// ... alert ('Не удалось показать заданный регион');
 } } });

Этот код ставлю после кода создания карты.

Как сокрытие блока может влиять на масштаб карты?. Ведь без setBounds размер карты вычисляется верно. Может при использовании bounds такого эффекта не будет?
Но синтаксис этой опции мне так пока не покорился)

 И от скрытого блока не хочется отказываться)

PS Раздел песочницы о размещении карты в скрытом контейнере читали более того при подстановке туда вышеуказанного  кода , наблюдается такой-же эффект

Думаю что надо вызывать setBounds после того как карта показалась из скрытого контейнера.

Иначе масштаб будет расчитываться из расчета ее размера 0,0

А подскажите все-таки синтаксис bound, если можно с примером. Может поможет.

Если нет, то буду пробовать как Вы выше написали. Во всяком случае в Песочнице это сработало)

Массив из двух точек (верхний левый и правый нижний угол)

[

[lat, lng],

[lat, lng]

]

спасибо, синтаксис с Вашей помощью добил, только увы не помогло.

Придется вызывать setBounds после открытия. Это просто как отдельную функцию делать, не связанную с собственно построением карты  или как-то внутри нее?

Это (setBounds) должно вызываться внутри обработчика события показа контейнера карты.

Если Вы используете что-то типа LightBox, то там должно быть соотв. событие.

все проще, использую просто  slideToggle из jQuery для раскрытия блока

в него тоже можно передать callback

в нем Вам и надо делать setBounds

вообщем вызов через коллбэк помог не особо -  карта перемасштабировалась где-то со 2-й 3-й попытки открыть блок (хотя если вставить в  эту функцию строку с alert ('что-то') - то сразу) ). Поступил проще: перед строкой с конструктором карты делаю document.getElementById('sliding-block').style.display = "block";  а после всех манипуляций с ней возвращаю  display = "none".  Вроде работает пока).

Спасибо за помощь!