Клуб API Карт

Обработка перемещения карты

Пост в архиве.
jin
18 декабря 2012, 17:55

Добрый день.

Как я понял из документации, основной метод для получения координат при перемещении карты это:
map.events.add('boundschange', function(e) {
console.log(e.get('newCenter'));
});
Мой колбэк вызывается каждый раз когда происходит изменение границ/масштаба карты, в самом простом случае когда пользователь перетаскивает карту.

Второй способ переместить карту - это кликнуть на метку, расположенную близко к краям карты так, что открываемый балун выходит за границы. Тогда карта автоматически подвинется, чтоб балун был виден полностью.

Как мне отличить эти два перемещения карты? 

 

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

по хорошему вам их не надо отличать

 

Можно проверять в обработчике boundschange

что балун не открыт

хм, тогда вводим дополнительные условия =)

при смене центра карты, я выбираю новые точки с радиусом ~1км на сервере и добавляю их на карту, а старые удаляю чтоб они не дублировались, плюс у каждой точки есть описание (балун).

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

вот мне и интересно, могу ли я каким-то образом понять что чем вызвано перемещение карты

я придумал несколько способов:
1/ вычислять на какое расстояние была перемещена карта, минусы получается эмпирическое значение в котором нужно учитывать масштаб
2/ каким-то образом просигнализировать что это вызвано открытием балуна (никаких реальных идей с учетом ассинхронности сообытий в js)
3/ и теперь ваш способ, тогда получается что на карте может быть только один балун?

кстати, у меня все точки находятся в кластеризаторе, по клику на него увеличивается масштаб карты и меняется центр карты ;) так что тут у меня тоже маленькая проблемка, но я её решаю сравнением старого и нового зума.

так что, какие мысли? =)

 

при смене центра карты, я выбираю новые точки с радиусом ~1км на сервере и добавляю их на карту, а старые удаляю чтоб они не дублировались, плюс у каждой точки есть описание (балун).

Это самый плохой способ, хоть и самый логичный на первый взгляд

 

3/ и теперь ваш способ, тогда получается что на карте может быть только один балун?

Так и есть. балун на карте всегда один

 

 

кстати, у меня все точки находятся в кластеризаторе, по клику на него увеличивается масштаб карты и меняется центр карты ;) так что тут у меня тоже маленькая проблемка, но я её решаю сравнением старого и нового зума.

Вы кажется сами себе усложнили жизнь.

Кластеризатор сам удаляет невидимые в данный момент точки с карты (можно убедиться на этом примере),

это не надо делать за него.

 

Это самый плохой способ, хоть и самый логичный на первый взгляд

а какой способ лучше? с учетом того что у меня мобильный сайтик, страничка с картой висит в памяти, даже если пользователь просматривает другие страницы (ох уж этот ajax) и по москве у меня действительно около 100000 точек

Вы кажется сами себе усложнили жизнь.

не спорю, скорее всего так и есть. но это всё что я смог придумать прочитав доку и исходники

например, активные области

или тот же кластеризатор, но с по-тайловой загрузкой,

чтобы можно было кешировать

В вашем случае все метки грузятся даже если карту сдвинуть на пиксель

эм, похоже я слоупок, но я не вижу преимущества перед обычными метками для мобильных браузеров. они конечно производительные и даже немного памяти в них засунули, но мне кажется что это будет тормозить редкостно

плюс, как сказано в документации, для картиночного слоя мне нужно отрисовать тайлы для всех маштабов... эм, это из изображения меток? это как?

и всё таки я не понимаю преимуществ между активнывными областями и простым "создать точки -> положить на карту"

 

 

 

плюс, как сказано в документации, для картиночного слоя мне нужно отрисовать тайлы для всех маштабов... эм, это из изображения меток? это как?

Сгенерить много картинок на сервере и отдавать их как статику, - задача вполне решаемая

 

и всё таки я не понимаю преимуществ между активнывными областями и простым "создать точки -> положить на карту"

разница очевидна в случае активных областей у вас 1 картинка, с обычными точками у вас 100тыщ дом-элементов

задача вполне решаемая

 угу, только теперь мне вместо одной вундервафли нужно создать другую, с в разы отличающейся сложностью =)

у вас 100тыщ дом-элементов

согласен, но я их не высыпаю разом на карту, а максимум 100 с моим "добавленьем-удаленьем"

 

 в общем, наша дискусия зашла в тупик )

Если вам нужно их отличать - скорее всего, вы что-то делаете неправильно.
вспомнилось "это какие-то неправильные пчёлы" =)

я не думаю, что на мобильнике стоит добавлять 100500 точек, по этому использую алгоритм приведённый выше

Не надо добавлять на карту точки что уже ТАМ ЕСТЬ.

Если все делать нормально то балун при сдвиге карты будет оставатся просто потому что его точка как была на карте, так и остается там.

Много, много раз говорилось как это все можно сделать. Обьяснялось почему.. эх.

 

Не надо добавлять на карту точки что уже ТАМ ЕСТЬ.

Не совсем понимаю ход ваших мыслей )

Если все делать нормально то балун при сдвиге карты будет оставатся просто потому что его точка как была на карте

Я прекрасно понимаю из-за чего у меня возникают мои проблемы с балуном

Вопрос в другом, как мне отличить что карта была перемещена пользователем при перетаскивании от того что карта была перемещена автоматически?

 

Не совсем понимаю ход ваших мыслей )


Давайте поясню ход ваших мыслей - при сдвиге карты требуется уничтожить все что на ней есть и загрузить новую пачку данных.

Вот не надо уничтожать то, что продолжает быть видимо. Пропустим момент что не надо загружать то, что уже загружено.

И отличать кем, зачем и почему карта двигается - тоже не надо.

Она всегда должна показывать то что должна показывать.

Не совсем так. К примеру, map.cluster.add([]); перерисует все имеющиеся на карте точки, что приведет к закрытию балуна.