Google Maps v3 - могу ли я обеспечить плавное панорамирование каждый раз?
У моей карты несколько сотен маркеров внутри города. Обычно не более 20-мильного радиуса.
Я прочитал документацию и не нашел способ установить, чтобы init автоматически переключался между каждым маркером, независимо от расстояния.
По умолчанию используется панорама, если закрыть, прыгать, если далеко.
Я понимаю, почему они это сделают, так как карта не загружает весь мир на выбранном уровне масштабирования, и это может испортиться, если расстояние было слишком велико. Тем не менее, я думаю, что он мог справиться с 20-мильным радиусом с минимальными жалобами.
Если у кого есть какие-то идеи, я бы хотел их услышать.
Благодаря
Ответы
Ответ 1
Порог плавного панорамирования не зависит от расстояния между текущим центром и новой мишенью. Это зависит от того, потребуется ли изменение для полностраничного прокрутки (по горизонтали и по вертикали) или нет:
Цитата из Ссылка на API:
PANTO (LatLng: LatLng)
Изменяет центр карты на данный LatLng. Если изменение меньше ширины и высоты карты, переход будет плавно анимироваться.
Поэтому, пока вы уменьшаете масштаб, чтобы ваш видовой экран был высотой и шириной 20 миль, вам должно быть гарантировано плавное панорамирование на расстояние менее 20 миль.
Ответ 2
Здесь решение, которое гладко гладко, а также позволяет другим запросам на клики быть очереди в то время, когда предыдущая панорама уже выполняется:
var panPath = []; // An array of points the current panning action will use
var panQueue = []; // An array of subsequent panTo actions to take
var STEPS = 50; // The number of steps that each panTo action will undergo
function panTo(newLat, newLng) {
if (panPath.length > 0) {
// We are already panning...queue this up for next move
panQueue.push([newLat, newLng]);
} else {
// Lets compute the points we'll use
panPath.push("LAZY SYNCRONIZED LOCK"); // make length non-zero - 'release' this before calling setTimeout
var curLat = map.getCenter().lat();
var curLng = map.getCenter().lng();
var dLat = (newLat - curLat)/STEPS;
var dLng = (newLng - curLng)/STEPS;
for (var i=0; i < STEPS; i++) {
panPath.push([curLat + dLat * i, curLng + dLng * i]);
}
panPath.push([newLat, newLng]);
panPath.shift(); // LAZY SYNCRONIZED LOCK
setTimeout(doPan, 20);
}
}
function doPan() {
var next = panPath.shift();
if (next != null) {
// Continue our current pan action
map.panTo( new google.maps.LatLng(next[0], next[1]));
setTimeout(doPan, 20 );
} else {
// We are finished with this pan - check if there are any queue'd up locations to pan to
var queued = panQueue.shift();
if (queued != null) {
panTo(queued[0], queued[1]);
}
}
}
Ответ 3
См. этот другой ответ SO об использовании функции javascript setInterval
для создания периодической функции, которая вызывает panBy
на вашей карте: Можно ли установить Google Maps на медленную постоянную панорамирование? Как революция глобуса?
Это можно использовать для панорамирования карты по x пикселям при каждом вызове panBy, что позволяет замедлить скорость panBy (поскольку вы только сообщаете gmaps для панорамирования на короткое расстояние).
Ответ 4
Как отметил Даниэль, встроенная функция panTo() не будет работать для вас, если две точки находятся слишком далеко друг от друга. Вы можете вручную настроить его самостоятельно, если это так: для каждого уровня масштабирования выясните расстояние, на которое скажем 100 пикселей. Теперь, когда вам нужно кастрюли до определенной точки, вы можете использовать эту информацию, чтобы выяснить, будет ли функция panTo() анимации или прыгать. Если перемещение расстояния настолько велико, что оно не будет анимировать, вы должны сделать анимацию вручную - вычислите некоторые промежуточные точки между вашим текущим центром карты и пунктом назначения и скопируйте их последовательно.