Клуб API Карт

Автоzoom по полученным через geocode данным

Пост в архиве.
igor-glagola
16 августа 2012, 23:30

Здравствуйте, у меня следующая ситуация.

 

Программно формируется строка одного из следующих видов: "Россия", "Россия, Москва", "Россия, Москва, Комсомольский проспект д. 36". Город и адрес взял для примера. Далее через geocode я получаю координаты сформированной строки, центрирую карту по полученным координатам. 

И теперь собственно вопрос: как получить масштаб сообразный запрошенной строке? (например если строка "Россия", то выбрать зум при котором вся необъятная окажется на карте, или например, если строка "Россия, Москва" то на карте будет вся Москва и т.д.)

 

заранее благодарю.

13 комментариев

если вам нужно спозиционировать карту на найденный объект вам не нужен для этого ни центр ни зум. Достаточно знать его видимую область (bounds)

т.е. чтото типа этого:

 

ymaps.geocode('Москва', { results: 1 })    .then(function (res) {        var firstGeoObject = res.geoObjects.get(0),              bounds = firstGeoObject.properties.get('boundedBy');
       myMap.setBounds(bounds);
    });

 

Внезапненько). геоОбъект и правда оч много всего знает... оттого и тяжелый, видимо?

это просто данные, которые он берет из геокодера.

в properties может что угодно лежать

а вам не тяжело там все эти данные на каждый запрос... хотя, это же геокодер отдает.

p.s. не понимаю, зачем такие запросы к геокодеру делать с каждого клиента. не проще при загрузке страницы отдавать?

Благодарю!!! с городами работает на ура! со странами проблемы - при запросе "Россия" выдает границы эквивалентные всей карте земли с 0 зумом

Вроде решил проблему.

Шаги которые приводят к обобщенной проблеме:

1. У вас карта в скрытом диве и изначально не видна

2. Выставляем bounds и центр карты

3. Отображаем скрытый див (карта разумеется не видна, ибо при создании не смогла определить высоту и ширину котейнера)

4. Подгоняем под размеры теперь уже видимого контейнера mapObj.container.fitToViewport()

 

И тут настройки центра и границ слетают.

Решение - просто устанавливать координаты после подгонки размеров карты, может это кому сэкономит время.

А нельзя ли сделать так: получить координаты города, например Москвы и эти координаты передать в center myMap, например:

ymaps.ready(function() {
  var myGeocoder = ymaps.geocode("Москва");
myGeocoder.then
(
function(res)
{
  word = res.geoObjects.get(0).geometry.getCoordinates().split(',' ) ;
},
function(err)
{
  alert('Ошибка') ;
}
  ) ;
mymap = new ymaps.Map(container, {
// Центр карты
center: [word[0], word[1]],
// Коэффициент масштабирования
zoom: 11
  })

не совсем так:

т.к. в твоем коде на момент вызова 

 

mymap = new ymaps.Map(container, {
// Центр карты
center: [word[0], word[1]],
// Коэффициент масштабирования
zoom: 11
  })

никакого word еще не будет

 

Можно сделать так:

 

var myMap;ymaps.ready(init);function init() {    // Поиск координат центра Нижнего Новгорода.    ymaps.geocode('Нижний Новгород', { results: 1 }).then(function (res) {        // Выбираем первый результат геокодирования.        var firstGeoObject = res.geoObjects.get(0);        // Создаем карту с нужным центром.        myMap = new ymaps.Map("map", {/*            center: firstGeoObject.geometry.getCoordinates(),            zoom: 11*/            bounds: firstGeoObject.properties.get('boundedBy')        });    }, function (err) {        // Если геокодирование не удалось, сообщаем об ошибке.        alert(err.message);    });

 

 

бабушка-бэтмен, спасибо БОЛЬШОЕ за помощь!!! 

Mozilla ругается "init is not defined" на строке "ymaps.ready(init) ;". В опере и IE карта рисуется.

 

Дай ссылку.