Клуб API Карт

Как определить зацикленность карты

nolan23
14 августа 2012, 15:20

юзсейс - обычный. вывести в правую колонку инфу о маркерах в пределах границ карты.

для этого вешаем на boundschange обработчик, получаем область через map.getBounds() и радуемся. но недолго.

на малых зумах зацикленная карта может отдать 

 

[
Array[2]
  1. 0-24.222474311333453
  2. 1-149.15371875
,
Array[2]
  1. 084.17824084426353
  2. 1-163.91934375


 

хотя, на самом деле мы видим всю карту.

каким образом можно узнать, что карта зациклена?

 

вот ссылка http://www.pomnivoinu.ru/?long=125.19063738848338&lat=54.133271224827425&zoom=3

подвиньте карту влево - появится правая колонка

9 комментариев
Подписаться на комментарии к посту
У IProjection есть метод isCycled()

это метод отдает свойство проекции, а не текущее состояние карты.

вопрос висит(

Тогда я не понял вопроса. Поясните подробнее.

во вьюпорте на малых зумах метод map.getBounds() может отдавать такие значения: 

Array[2]
  1. 0: -24.222474311333453
  2. 1: -149.15371875

,

Array[2]
  1. 0: 84.17824084426353
  2. 1: -163.91934375

 

если сделать выборку по координатам маркеров по этому bounds,

я получу только долготу от -149 до -163, хотя на самом деле виден весь мир.

как узнать, что между -149 и -163 у меня не 14, а 194 градуса?

Если левая граница больше правой, то прибавьте к правой границе 360.
Это если вкратце :)

а если нет?

Любой интервал по долготе на сфере можно трактовать двояко - как дугу по часовой стрелке или против часовой стрелки. getBounds всегда возвращает дуги ПРОТИВ часовой стрелки.
Т.е. обозначение [[0, 20], [0, 10]] описывает 350-градусную дугу от точки 0,20 через линию смены дат до точки 0,10. Обозначение [[0, 10], [0, 20]] описывает 10-градусную дугу.

а если левая граница , например, 10 град долготы, а правая - 20, а между ними - 360?

Такого быть не может.
Код в getBounds() специально заточен под такие случаи.