Клуб API Карт

Некоторые метки исчезают с карты, начиная с определенного зума

irinap.2015
31 марта 2015, 01:14

Здравствуйте! Использую в своем проекте (<script src="http://api-maps.yandex.ru/2.1.17/?lang=ru_RU" type="text/javascript"></script>)

Столкнулась с такой проблемой: начиная с определенного зума, некоторые метки исчезают с карты. 

Пример: у Петропавловск-Камчатского географические координаты [широта, долгота]:  [53.036996 ; 158.655954]. При вызыве функции map.getBounds() получаю следующий результат: при zoom=6 bounds: [48.20904875562384,137.81623309374996;57.321991391289906,179.69611590624996]  (см. скриншот http://joxi.ru/bmobOYWs07LNry ) - метка отображается, так как точка попадает в область видимости, но при zoom=5 bounds: [42.912982554904225,116.87629168749997;61.18268441225668,-159.3639426875] (см. скриншот http://joxi.ru/V2Vve5BSW8lx2v ) - уже нет метки.

Может ли быть причина в том, что некорректные результаты возвращаются при вызове функции  map.getBounds() на разных зумах? Ведь при zoom>=6 все в порядке, а вот при zoom< 6 - некоторые метки пропадают.

12 комментариев
Подписаться на комментарии к посту
Нужен пример страницы, по описанию сложно что-то определённое сказать.

http://map.comepay.ru/   Находим через поиск Петропавловск-Камчатский, начинаем просто уменьшать масштаб, в какой-то момент метки и кластеры, расположенные рядом с этим городом начинают исчезать...Если подвигать карту, появятся снова.

 

Ну, собственно, ваш сервер так отвечает
http://map.comepay.ru/data/5/60 -180.json.gz
Объект имеет среднюю долготу -171 и отображается в западном полушарии в невидимой области карты.
Вероятно, вы как-то неправильно работаете с областями, пересекающими 180-ый меридиан.
Я бы рекомендовал воспользоваться RemoteObjectManager, там все эти проблемы мы уже порешали за вас )
https://tech.yandex.ru/maps/doc/jsapi/2.1/dg/concepts/remote-object-manager/about-docpage/
Все-таки хотелось бы разобраться с данным конкретным случаем и понять, в чем ошибка.
Итак, при изменении масштаба либо границы обл. видимости.
Сначала определяются:
var zoom = map.getZoom();
var bounds = map.getBounds().toString().split(',');
Потом значения bounds округляются, чтоб несколько расширить обл. видимости и запрашиваются файлы, содержащие координаты точек, попадающих в эту область видимости.

Если вернуться к примеру выше, геогр. координаты Петропавловска-Камчатского [53.036996 ; 158.655954] , а область видимости выдается при zoom= 5 и вызове  map.getBounds(): [42,91.....,116.87....; 61.18......, -159.36...]
Вполне естественно, что точка не попадет в эту обл. видимости, даже если ее несколько расширить.
Как быть с этим? Есть ли какая-то другая функция?

В определении bounds есть условность, о которой ваш клиентский либо серверный код, видимо, не знает: левая граница может быть меньше правой, когда bounds пересекает Берингов пролив. Как в вашем прире: левая граница 116, правая -159. В этом случае сервер должен построить область так, чтобы движение от левой границы к правой происходило против часовой стрелки. Т.е. интервал [-170, 170] — это область в 340 градусов размером, накрывающая весь мир, а [170, -170] — узкая область в 20 градусов шириной, накрывающая Берингов пролив.

Подозреваю, ваш сервер не в курсе этих тонкостей и интерпретирует область [170, -170] так же, как и [170, -170]
я вас правильно понимаю, нужно округлять в обратную сторону?
http://joxi.ru/82Q47eYFbwxDmd  (в консоли: верхняя строчка - то, что выдает map.getBounds(), нижняя - то, что я фактически запрашиваю, т.е. файлы, содержащие координаты из этой области (значения округлены)).
Нет, этого недостаточно.
В терминологии вашего сервиса, если левая граница оказалась меньше правой, нужно слать два запроса: один от левой границы до 180 градусов, второй от -180 градусов до правой границы. Округлять каждый из интервалов как обычно.
иными словами, с учетом небольшого расширения области и округления границ при zoom=5, чтоб Петропавловск-Камчатский не исчез с карты, нужно слать запросы: 1). [30, 105; 75; 180]  2). [30, -180; 75; -150] ?
Предполагаю, что да ;)
это правило распространяется только на долготу?
В проекции Меркатора — да.

Спасибо Вам, что помогли разобраться, все в порядке теперь!))