Клуб API Карт

Некорректная работа Map.getBounds()

mtao.biz
29 марта 2016, 18:22

Делаю скрипт, который аяксом подгружает объекты в пределах видимости карты.
На сервер передается прямоугольник, по которому он ищет то все точки попадающие в него. 
Для работы аякса нужен результат Map.getBounds().
Обнаружил, что при определенном зуме (когда видны континенты) Map.getBounds() выдает совершенно нереальные координаты.
Для демонстрации этого, вот скрипт:

map = new ymaps.Map('xc-map', {
        controls: ['zoomControl'],
  center: [55.73, 37.75],
        zoom: 16
    }, {suppressMapOpenBlock: true});

map.events.add('boundschange', function(e) {
        var b = e.get('oldBounds');

        ymaps.geoQuery(map.geoObjects).removeFromMap(map);

        var rect = new ymaps.Rectangle(e.get('oldBounds'), {
            hintContent: 'OLD'
        }, {
            fillColor: '#7df9ff33',
            fillOpacity: 0.5,
            strokeColor: '#FF0000',
            strokeOpacity: 0.5,
            strokeWidth: 2,
            borderRadius: 6
        });

        map.geoObjects.add(rect);
    });

Чтобы увидеть глюк, нужно жать минус пока не появятся континенты.
При этом рисуется красный прямоугольник, показывающий предыдущие границы карты.
Когда появляются континенты, прямоугольник начинает появляться совершенно не там, где должен.
Вот ссылка для тестов http://rent.ru.com/test.html

5 комментариев
Подписаться на комментарии к посту
Дело в том, что метод getBounds возвращает прямоугольник в нотации boundsPath.
Попробуйте установить прямоугольнику rect опцию coordRendering: 'boundsPath' https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/geometry.Rectangle-docpage/#param-options.coordRendering
мне важно не прямоугольник нарисовать, а адекватные координаты передать на сервер, чтобы он мог сделать правильную выборку из БД.
mtao.biz,
Координаты метод getBounds возвращает правильные, но Вашем примере, Вы рисуете прямоугольник по этим координатам неправильным способом (не в той же нотации), потому и получаете странный визуальный результат.
https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/Map-docpage/#getBounds
mtao.biz,
Много раз обсуждалось – получение данных по области видимости один из самых неэффективных способов – оно же не кешируется никак. На сервер лучше отправлять тайловую область ROM и LOM это умеют делать из коробки.
Статья для вдумчивого чтения https://msdn.microsoft.com/en-us/library/bb259689.aspx
Спасибо всем, кто откликнулся кажись разобрался. Правда по большей части благодаря вот этому посту:

https://yandex.ru/blog/mapsapi/56217/56a92097b15b79e31e0cc321

В итоге на сервере нужно сделать такое:

if($b[1][0] < $b[0][0]) {
$b[0][0] = -180;
$b[1][0] = 180;
}

if($b[1][1] < $b[0][1]) {
$b[0][1] = -180;
$b[1][1] = 180;
}

где $b - массив координат полученный из Map.getBounds()

После этого, выборка из БД работает корректно.

Но еще лучше использовать вот это:
https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/LoadingObjectManager-docpage/