Google Maps: центр автоматического открытия infoWindow
У меня есть автоматическое открытие infoWindow, которое я хотел бы центрировать на своей карте Google.
Я не хочу сосредотачиваться на самом маркере, но маркер плюс информационное окно, как это было бы автоматически, если бы окно при нажатии открывалось, а не открывалось по умолчанию.
Вот мой код:
<script>
function initMap() {
var occ = {lat: 45.5280879, lng: -122.6630186};
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 14,
draggable: false,
scrollwheel: false,
center: occ
});
var contentString = '<div id="content" style="font-family: Poppins, sans-serif; padding: 1em;">'+
'<div id="siteNotice">'+
'</div>'+
'<h4 style="margin-bottom: .125em;">The Oregon Convention Center</h4>'+
'<p>777 NE Martin Luther King Jr Blvd<br>'+
'Portland, OR 97232<br>'+
'<a href="https://www.google.com/maps/dir//Oregon+Convention+Center,+777+NE+Martin+Luther+King+Jr+Blvd,+Portland,+OR+97232,+United+States/@45.5280879,-122.6630186,15z/data=!4m12!1m3!3m2!1s0x0:0x610cf37babf5b9df!2sOregon+Convention+Center!4m7!1m0!1m5!1m1!1s0x5495a0adc5ff1af5:0x610cf37babf5b9df!2m2!1d-122.6630186!2d45.5280879" target="_blank">Get directions</a></p>'+
'</div>';
var infowindow = new google.maps.InfoWindow({
content: contentString,
pixelOffset: new google.maps.Size(0, 15),
});
var marker = new google.maps.Marker({
position: occ,
map: map,
title: 'The Oregon Convention Center',
});
infowindow.open(map, marker);
google.maps.event.addDomListener(window, "resize", function() {
var center = map.getCenter();
google.maps.event.trigger(map, "resize");
map.setCenter(center);
});
}
</script>
Скрипка: http://jsfiddle.net/kz1hnec0/
Как мне это сделать?
1 ответ:
Исходя из этого ответа: https://stackoverflow.com/a/10722973/1023562
Создайте функцию, которая будет смещать ваш центр на несколько пикселей:
function map_recenter(map,latlng,offsetx,offsety) { var point1 = map.getProjection().fromLatLngToPoint( (latlng instanceof google.maps.LatLng) ? latlng : map.getCenter() ); var point2 = new google.maps.Point( ( (typeof(offsetx) == 'number' ? offsetx : 0) / Math.pow(2, map.getZoom()) ) || 0, ( (typeof(offsety) == 'number' ? offsety : 0) / Math.pow(2, map.getZoom()) ) || 0 ); map.setCenter(map.getProjection().fromPointToLatLng(new google.maps.Point( point1.x - point2.x, point1.y + point2.y ))); }
Вызовите эту функцию, используя событие
projection_changed
(посколькуmap.getProjection()
недоступно до этого события ocurs):google.maps.event.addListenerOnce(map,"projection_changed", function() { map_recenter(map, occ, 0, -100); });
Рабочая скрипка: http://jsfiddle.net/kz1hnec0/4/
Примечание:
Я установил смещение Y на -100. Если вы знаете, насколько высоким будет ваше информационное окно (в данном случае 155px), то вы можете передать это значение немного точнее - я думаю, что это будет что-то вроде
(infoWindow.height + infoWindow.pixelOffset / 2)
.