Если вам нужно отличать действия пользователя от остальных способов изменить положение карты - в логике работы вашего приложения, скорее всего, ошибка. Мы сознательно не открываем событий перетаскивания карты именно по этой причине.
Нет, не нарушает. Геообъект - это сущность, привязанная к некоторой точке на карте. Его геокоординаты не могут измениться в результате работы каких-то внешних компонент АПИ, а только с явного указания разработчика - посредством выставления draggable или явного перезадания координат.
Область просмотра карты же является просто состоянием и может произвольно меняться любым объектом в АПИ. Например, если пользователь что-то ищет, то контрол поиска будет менять bounds для того, чтобы показать найденный объект.
Соответственно, попытки разделить "программное" и "пользовательское" изменение положения карты некорректны. Если пользователь вбил "Москва" в поиск - это программное изменение центра карты? Клик по кластеру? Изменение размеров окна браузера?
Расскажите, какую задачу вы пытаетесь решить, а я попробую вам дать совет.
У меня есть Placemark на карте. С течением времени его геокоординаты могут изменяться. По-умолчанию карта должна центрироваться на этом Placemark'е, однако, если пользователь захотел посмотретьна карте другое место, и решил карту "потаскать", центрирование на Placemark нужно отключить. Вот поэтому у меня и возник такой вопрос
Как только координаты Placemark'а поменялись, вызываю panTo() либо setCenter() чтобы отцентрировать (если нужно) на нём карту (это я и имел ввиду программно).
Тогда как-то так: // pm - ваш placemark map.events.add('boundschange', function (e) { var newCenter = e.get('newCenter'), pmPosition = pm.geometry.getCoordinates(); if (Math.abs(pmPosition[0] - newCenter[0]) > 1e-6 || Math.abs(pmPosition[1] - newCenter[1]) > 1e-6) { // Снимаем слежение за координатами метки } }); Иными словами, если в результате чего-то центр карты стал отличаться от позиции метки - считать это "действием пользователя".
Логика приложения такова: есть функция загрузки объектов на карту (ajax запрос на сервер).После загрузки объектов вызываем ymaps.util.bounds.getCenterAndZoom() чтобы все объекты попали в область карты.
Эта функция вызывается в двух случаях: 1. при инициализации карты ymap 2. по событию actionend.
Проблема в том, что после первичной загрузки объектов на карту чаще всего срабатывает зумирование, поэтому выстреливает событие actionend из-за чего функция загрузки объектов на карту вызывается повторно.
Как исключить повторный вызов? Все работает асинхронно, конечно же. Если включать синхронность появляются дикие тормоза и очереди.
Решений можно много придумать. Например, сначала зуммировать, потом грузить. Или настроить правильное кэширование, чтобы повторный запрос из кэша брался.
Определить сначала координаты с зумом сложно да и не нужно - это задача клиента (ymaps). Сервер всего-нишь возвращает набор меток с координатами. Попробуем разобраться с ObjectManager, но решение, прямо скажем, не из коробки. А задача-то тривиальная.
Логика такова, что при загрузке карты мы получаем некий набор меток и важно спозиционировать карту так, чтобы все полученные метки влезли на карту. Последующее поведение меняется: мы вручную меняем масштаб и область карты и грузим с сервера на нее метки (только те, что попадают в видимую область и не более того).