Вот более простая версия решения Эшли:
google.maps.Map.prototype.panToWithOffset = function(latlng, offsetX, offsetY) {
var map = this;
var ov = new google.maps.OverlayView();
ov.onAdd = function() {
var proj = this.getProjection();
var aPoint = proj.fromLatLngToContainerPixel(latlng);
aPoint.x = aPoint.x+offsetX;
aPoint.y = aPoint.y+offsetY;
map.panTo(proj.fromContainerPixelToLatLng(aPoint));
};
ov.draw = function() {};
ov.setMap(this);
};
Затем вы можете использовать его так:
var latlng = new google.maps.LatLng(-34.397, 150.644);
var map = new google.maps.Map(document.getElementById("map_canvas"), {
zoom: 8,
mapTypeId: google.maps.MapTypeId.ROADMAP,
center: latlng
});
setTimeout(function() { map.panToWithOffset(latlng, 0, 150); }, 1000);
Вот рабочий пример .
Позвольте мне объяснить подробнее. Это расширяет сам объект Map. Так что вы можете использовать его как panTo()
с дополнительными параметрами для смещений. При этом используются методы fromLatLngToContainerPixel()
и fromContainerPixelToLatLng()
класса MapCanvasProjecton . Этот объект не имеет конструктора и должен быть получен из метода getProjection()
класса OverlayView ; класс OverlayView используется для создания пользовательских оверлеев путем реализации его интерфейса, но здесь мы просто используем его напрямую. Потому что getProjection()
доступен только после вызова onAdd()
. Метод draw()
вызывается после onAdd()
и определен для нашего экземпляра OverlayView как функция, которая ничего не делает. В противном случае это приведет к ошибке.